[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 50회차 미션 시작합니다.

05. 배틀그라운드 - 03, 04, 05 번을 진행합니다.




Enemy Data 준비에 대한 시작입니다.

구글 스프레드 시트는 좋기는 한데 너무 느려서 애매하고, 엑셀은 정말 많이 사용하고, 툴은 좋긴 하지만 지속 누군가가 수정을 해줘야 하는데 그렇게 여유로는 모바일 게임 개발사는 없을 것이기에.. 결국 Table of Data를 처리하기 위한 방법들이 필요합니다.




GeneralStats 스크립트를 해당 위치에 생성하고 작성을 시작합니다.

[CreateAssetMenu(menuName="PluggableAI/GeneralStats")]
public class GeneralStats : ScriptableObject
{
    [Header("General")]
    [Tooltip("npc 정찰 속도 clear state")]
    public float patrolSpeed = 2f;
    [Tooltip("npc 따라오는 속도 warning state")]
    public float chaseSpeed = 5f;
    [Tooltip("npc 회피하는 속도 engage state")] // 교전시
    public float evadeSpeed = 15;
    [Tooltip("웨이포인트에서 대기하는 시간")]
    public float patrolWaitTime = 2f;
    [Header("Animation")]
    public LayerMask obstacleMask; // 장애물 레이어 마스크
    public float angleDeadZone = 5f; // 조준시 깜빡임을 피하기 위한 최소 확정 앵글
    public float speedDampTime = 0.4f; // 속도 댐핑 시간
    public float angularSpeedDampTime = 0.2f; // 각속도 댐핑 시간
    public float angleResponseTime = 0.2f; // 각속도 안에서 각도 회전에 따른 반응 시간
    [Header("Cover")]
    public float aboveCoverHeight = 1.5f; // 장애물에 숨었을 때 고려해야할 최소높이값
    public LayerMask coverMask; // 장애물 레이어마스크
    public LayerMask shotMask; // 사격 레이어마스크.
    public LayerMask targetMask; // 타겟 레이어마스크.
}




위의 CreateAssetMenu 함수를 통해 생성된 메뉴를 볼 수 있으며, 이를 클릭합니다.



생성된 파일 이름을 EnemyCommonStats라고 지정하고, 우측의 Inspector에 설정값들을 적용해 줍니다.



EntityTable을 클릭해보면 엑셀 파일이 열리는데 무기에 대한 설정값들이 적용되어 있는 것을 볼 수 있습니다.

 



EntityTable에서 우클릭하여 "XLS Import Settings..."를 클릭합니다.
그러면 엑셀 파일을 읽어서 보여주는 ExcelImporterMaker 창이 나타납니다.

AimOffset 값을 Float으로 설정하고 불필요한 것의 [ ]enable을 꺼주는 등의 설정을 해주고, [create] 버튼을 클릭합니다.




EntityTable에서 다시 우클릭하여 Reimport를 클릭하여 줍니다.




그러면 위와 같이 EntityTable 데이터 셋이 생성된 것을 확인할 수 있습니다.

복잡한 듯 하지만 엑셀을 잘 활용하여 다양한 데이터들을 처리하는 것이 여러가지 확장성에서 좋다라고 보면 됩니다.

사실 엑셀은 이제 실무에서 어떠한 형태로는 사용안되는 경우가 없는 듯해요 ^^. 데이터 관리, 로그, 레포팅, 분석 등 정말 다양한 형태로 활용되죠.. ㅎㅎ





Enemy AI 기본 클래스들 생성입니다.




StateMachine 폴더를 만들고, 하위 폴더로 Action, Decision, State, Transition 폴더를 만듭니다.
그리고 각각의 폴더 안애 위와 같이 스크립트들을 미리 생성해 둡니다.
이렇게 한 이유는 어떤 스크립트들이 만들어지고 어떻게 사용될지를 미리 보기 위함입니다.

우선 StateController를 더블클릭하여 코딩을 시작합니다 ^^~
(Enemy AI 기본 클래스 생성을 마치기 위하여 하나 더 진행..)


/// <summary>
/// state -> actions update -> transition (decision) check..
/// state에 필요한 기능들. 애니메이션 콜백들..
// 시야 체크, 찾아놓은 엄폐물 장소중 가장 가까운 위치를 찾는 기능.
/// </summary>
public class StateController : MonoBehaviour
{
    public GeneralStats generalStats;
    public ClassStats statData;
    public string classID; // PISTAL, RIFLE, AK
    
    public ClassStats.Param classStats {
        get {
            foreach (ClassStats.Sheet sheet in statData.sheets)
                foreach (ClassStats.Param parm in sheet.list)
                    if (parm.ID.Equals(classID)) return parm;
            return null;
        }
    }
    
    public State currentState;
    public State remainState;
    public Transition aimTarget;
    public List<Transition> patrolWaypoints;
    public int bullets;
    [Range(0,50)]
    public float viewRadius;
    [Range(0,360)]
    public float viewAngle;
    [Range(0,25)]
    public float perceptionRadius;
   
    [HideInInspector] public float nearRadious;
    [HideInInspector] public NavMeshAgent nav;
    [HideInInspector] public int wayPointIndex;
    [HideInInspector] public maximumBurst = 7;
    [HideInInspector] public float blindEngageTime = 30f;
    [HideInInspector] public bool targetInSight;
    [HideInInspector] public bool focusSight;
    [HideInInspector] public bool reloading;
    [HideInInspector] public bool hadClearShot; // before
    [HideInInspector] public bool haveClearShot; // now
    [HideInInspector] public int coverHash = -1; // 장애물마다 고유코드가 있어서 캐릭터들이 몰리지 않고 적당한 장애물을 찾도록 하기 위해..
    [HideInInspector] public EnemyVariables variables;
    [HideInInspector] public Vector3 personalTarget = Vector3.zero;
    
    private int magBullets;
    private bool aiActive;
    private static Dictionary<int, Vector3> coverSpot; // static
    private bool strafing;
    private bool aiming;
    private bool checkedOnLoop, blockedSight;
    
    [HideInInspector] public EnemyAnimation enemyAnimation;
    [HideInInspector] public CoverLookUp coverLookUp;
    
    public Vector3 CoverSpot {
        get { return coverSpot[GetHashCode()]; }
        set { coverSpot[GetHashCode()] = value; }
    }
    
    public void TransitionToState(State nextState, Decision decision) {
        if (nextState != remainState) currentState = nextState;
    }
}




strafing에 대해 구글에서 검색하여 내용을 찾아본 설명입니다..

 

50회 챌린지 미션은 할 수 있을까 싶었는데 결국 완료는 하였네요 ^^;

50일 동안 하루도 거르지 않고 무언가를 한다는 것이 어려울거라 예상은 했지만 생각보다 훨씬 어렵네요. 일단 뿌듯합니다. ㅎㅎ



<위의 코드들은 제가 보면서 주요한 함수, 코드를 확인하기 위해 타이핑한 용도로, 전체 소스코드가 아님에 주의해 주세요. 전체 코드는 교육 수강을 하면 완벽하게 받으실 수가 있답니다 ^^>

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

+ Recent posts