패스트캠퍼스의 "업무자동화 MAX 올인원 패키지 Online" 강의 내용을 공부하며 정리할 예정입니다.

01. 엑셀 필수 기초 (Basic) I 데이터 축적
02. 엑셀 필수 기초 (Basic) II 데이터 생산
03. 엑셀 피수 기초 (Basic) III 데이터 분석
04. 엑셀 프로젝트(Project)
05. 엑셀 VBA 필수 기초
06. 엑셀 VBA 실전 프로젝트
07. 오토핫키 필수 기초(Basic)
08. 오토핫키 실전 프로젝트(Project)
09. 구글 스프레드시트 필수 기초
10. 구글 앱스스크립트 기본 및 실전 프로젝트
11. 파이썬 업무자동화 (Basic)
12. 파이썬 업무자동화 (Intermediate)
13. 파이썬 업무자동화 (Advanced)

 

 

 

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 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

 

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

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


04.배틀로얄에서 05.배틀그라운드 라서 다른 게임인 줄 알았더니 같은 게임의 연속이네요 ^^;




복습과 전체 리뷰를 합니다.

유니티를 실행하여 우선 전체 이동하는 것과 소리 등을 확인합니다.



이제 무기를 집는 위치에 가서 설명합니다.

무기에는 Collider가 2개가 있고, 집는 동작을 확인하는 자체 Collider와 "Pick Rifle"이 뜨고 집는 반경을 확인하기 위한 Trigger Collider가 존재합니다.

무기를 집고 조준도 해보고.. 카메라 회전을 하고나서 캐릭터가 약간 딜레이를 주어 따라 회전하는 것을 확인할 수 있습니다.

총을 조준하고 쏴보고 소리도 듣고 바닥에도 쏴봅니다.




Quad GameObject에 BulletHole Material을 씌워서 만든 내용이었습니다.. 라지만...
R 키를 눌러서 재장전도 확인합니다.
Animator에 대한 설정이나 교육 등은 Youtube에서 검색해서 보면 된다고 합니다!?




PlayerCharacter의 Animator 설정어니 Rigidbody 등을 했었습니다.
BehaviourController에 대한 설명..
힘드셨죠... 에 대한 계속 반복적인 설명...






프로젝트에 들어가기 전에 Enemy 적군이 어떻게 움직이게 될지 미리 예습을 하는 시간입니다.

또 계속 코딩이 이어질 것이라.. 우선 Enemy가 어떻게 동작하는지를 보여준다고 합니다. 무지막지한 코딩이 계속되면 실행화면을 볼 시간이 없을 것이라고 합니다 ^^;




적의 Patrol 기능 설명입니다. 특정 위치를 왔다 갔다.. 하다가.. 캐릭터의 발자국 소리가 감지되면 장애물 뒤로 숨어서 공격을 시작하는 것에 대한 설명입니다.




실제 플레이를 해보면 적 캐릭터가 패트롤을 하다가.. 캐릭터의 소리가 들리면 장애물 뒤로 숨어서 사격을 시작하는 등을 확인할 수 있습니다.




적군의 State 상태에 대한 설명입니다.

어떤 조건 Decision을 맞족하면 특정 상태로 트랜지션된다..이지요...

 



Attack 상태에서의 트랜지션 가능한 모든 상태에 대한 설명입니다.
State 표는 좋은데.. 너무 당연한 게임이 어떻게 동작하는지에 대해서는 왜이리 설명이 긴 것일까요 ^^;

장애물찾기(FindCover) State에 대한 설명도 이어집니다.

NavigationMesh를 사용한다고 합니다.

찾기(Search) State에 대한 설명도 이어집니다.

공격 가능 지점(GotoShotSpot)으로 이동에 대한 State 설명도 이어집니다..

State가 꽤 많습니다. 머 당연하겠지요. ㅎㅎ 배틀그라운드의 상태가 그만큼 복잡한 상태를 왔다갔다하며 구동되도록 되어 있습니다.

장애물로 복귀(ReturnToCover) State에 대한 설명도 이어집니다..

장애물로 이동(TakeCover)에 대한 설명도 이어집니다... ㅎㅎ 구현시작하면 계속 코딩이 이어질 것 같네요.

강제이동, 강제대기 등에 대한 State 설명도 이어집니다.


한 State에서 사용가능한 Action은 여러개.. Transition이 일어나기 위한 조건을 Decision으로 하여 진행하겠습니다.

여러가지 Behaviour Tree 방법이 있는데 그 중에서 양갈래식 Tree 구조를 가지는 시스템을 구현한다고 합니다.

다음 시간부터 본격적으로 만들기 시작한다고 합니다.

기능들을 잘 쪼개놓으면 여러 기능을 재활용하는 것들도 해보게 됩니다.

플레이어 캐릭터에서 사용한 시스템에서 그치지 않고 업그레이드된 방식으로 진행을 합니다.

다음 영상에서는 위에서 설명한 것들을 하나씩 만들어보는 시간이 됩니다.






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

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

 

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

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

www.fastcampus.co.kr

 

+ Recent posts