주말동안 알고리즘 책을 읽고 나서 문득 생각해보니 코드테스트 전 합격 여부인 포폴이 중요한데
포폴을 좀 더 정리해야겠다고 생각해서 문서를 보강하기로 했습니다.
먼저 애너미 구조 설계를 상속 형태로 리팩토링, AI를 Nav Mesh Agent로 구현, 애너미 애니메이션을 살펴보겠습니다.
리팩토링전 스크립트입니다. 보기와 같이 fleldOfView와 같이 외부 스크립트 의존성이 높고 전체적 가독성이 떨어지며 확장성, 다양성이 좋지 못합니다.

리팩토링 후 스크립트입니다. 가독성은 말할 것도 없이 좋아졌고 MeleeEnemy라는 파생 스크립트로 근거리 애너미를 만들었습니다. 다양성이 좋아졌습니다. 확장 또한 가능하게 세분화한 상태입니다.

상속을 사용 시 협업 시 유리합니다. EnemyAttack 이라는 함수를 만들지는 않았지만 상위 스크립트에 추상적으로 만들어놓기만 하여도 다른 사람이 EnemyAttack를 가져가 사용할거나 재정의가 가능합니다. 아무런 기능을 하지 않아도 말입니다. 이런면에서 전체적인 틀만 만들어놓으면 재정의 후 수정해서 기능을 다시 만들수도 있습니다.
추적, 정찰, 정지 Enemy AI입니다. Nav Mesh Agent로 구현하였고 아래와 같은 형식으로 구현됩니다.

사용할 맵을 Navigation를 이용해 Bake한 상태입니다. 건물 오브젝트는 올라가지 못하게 제외하였습니다.

애너미 정찰등 구현 방법은 아래 포인트를 따라가서 가까울 시 멈추고 다음 포인트를 탐색하는 형식입니다. 결국 이동도 이와 같은 형식입니다.

이동 관련 애니메이션은 한번에 처리하였습니다.
if문으로 상태를 검사하여 SetFloat으로 값을 반환하여 블렌더 트리를 이용해 자연스러운 변경을 이끌어냈습니다.
0일땐 Idle 상태 정지 상태, 1일땐 wark 상태 정찰 상태 ,2일땐 run 상태 추적 상태입니다.




다음 애니메이션 매니저입니다. PlayerTargetAnimation 함수를 가지고 있습니다. 호출해주는 형식입니다. Off 기능이 없는 이유는 아래 애니메이션 구성을 보면 알 수 있습니다.

보시는거와 같이 끝나야하는 행동은 다시 돌아가기만 해논 상태로 호출하고 실행 후 돌아가는 형태입니다.
Die 같은 경우는 죽고 나서 다시 돌아갈 이유가 없으므로 끊어논 상태입니다.

그리고 각 오브젝트 당 애니메이션의 행동이 다르기 때문에 상속을 받아 애니메이션이 실행 시 OnAnimatorMove가 실행되어 각종 오브젝트 별로 값을 재설정해서 애니메이션을 자연스럽게 만들었습니다.

다음 어택 애니메이션의 구현은 두가지 애니메이션을 랜덤 돌립니다. 그리고 리소스를 아끼기 위해 어택 1,2에 대한 값은 스크립터블 오브젝트에 작성해논 값을 참조만 해서 사용합니다. 스크립터블 오브젝트 파일은 에셋에만 존재함으로서 미리 배열에 넣어둔 상태입니다.


위 파일을 만드는 방법은 아래 코드에 CreateAssetMenu를 이용하여 사용 가능합니다.

애너미의 주요부분을 다 살펴봤습니다.
'프로그래밍 공부 > 포트폴리오 정리' 카테고리의 다른 글
Day5 셰이더 정리 (0) | 2021.06.02 |
---|---|
Day 4 포트폴리오 플레이어 분석 (0) | 2021.06.01 |
유니티 포트폴리오 (1) Enemy 리팩토링 (0) | 2021.05.13 |
유니티 포트폴리오 셰이더 - 툰 셰이더 튜토리얼 (0) | 2021.05.11 |