적 시스템 구현

저는 게임의 핵심 요소인 적 시스템을 담당했습니다. 소울라이크 장르에서 적은 게임의 난이도와 재미를 좌우하는 핵심 요소로, 플레이어에게 긴장감을 유발하고 전략을 세우도록 만드는 중요한 역할을 담당합니다. 잘 설계된 적은 플레이어에게 도전 의식을 불러일으키고, 승리했을 때 강한 성취감을 제공하며, 패배했을 때도 여러 번 시도하게 끔하는 동기를 부여합니다.

적 시스템을 구현할 때 가장 중요하게 생각한 것은 프로젝트의 테마인 **'디저트 세계'**에 적합한 외형의 적을 구현하는 것이었습니다. 기존 게임들에서 흔히 볼 수 있는 오크나 스켈레톤 같은 일반적인 적들 대신, 달콤한 디저트 세계관에 어울리는 독특한 적들을 찾기 위해 유니티 에셋 스토어를 지속적으로 탐색했습니다. 이 과정에서 에셋 스토어에서 보스 초코 골렘, 하수인 초코 골렘, 푸딩 슬라임은 구할 수 있었지만, 종류에 한계가 있었습니다. 다행히 팀원 나디아 코즐로바님이 제작한 퀄리티 높은 디저트 테마 캐릭터들을 활용할 수 있었습니다.

활용 에셋 및 응용 방식

에셋 스토어에서 구한 에셋과 나디아님의 에셋 패키지에서 기본적인 모델과 Idle, Walk, Alert, Attack, Hit, Die 애니메이션들을 얻을 수 있었습니다. 이를 프로젝트의 적 AI 시스템에 맞추기 위해, 에셋의 크기 변형이나 애니메이션 속도 조절 같이 수치 조정에 가까운 내용들은 제외하고 응용한 내용 위주로 설명하겠습니다.

텍스처 관련

보스 골렘과 하수인 골렘은 테마에 맞지 않은 텍스처가 적용되어 있었습니다 이를 수정하기 위해 다음과 같은 작업을 진행했습니다.

애니메이션 관련

기존 에셋의 애니메이션들을 블렌드 트리서브 스테이트 머신을 활용하여 더 복잡하고 자연스러운 행동 패턴을 보이도록 확장했습니다. Locomotion 블렌드 트리를 구성하여 Idle에서 Walk, Run으로의 자연스러운 전환을 구현했으며, 공격 애니메이션들을 서브 스테이트 머신으로 조직화하여 다양한 공격 패턴을 설계대로 실행할 수 있도록 했습니다. 또한 애니메이션 이벤트를 세밀하게 배치하여 공격 판정, 이펙트 재생, 사운드 출력이 정확한 타이밍에 발생하도록 조정했습니다. 보스의 경우 유료 애니메이션 에셋을 사용하여 더 다양하고 역동적인 공격 모션을 보일 수 있었습니다.

아키텍처 설계

적 시스템의 핵심은 유한 상태 머신(Finite State Machine) 기반의 AI 아키텍처입니다. EnemyStateMachine.cs가 전체 상태 전환을 관리하며, EnemyBaseState.cs를 상속받은 각각의 상태 클래스들이 고유한 행동 로직을 담당합니다. Enemy.cs는 적의 기본 행동과 컴포넌트들을 총괄 관리하는 역할을 수행하여, 모든 적이 일관된 기본 기능을 가질 수 있도록 했습니다. 기본 기능으로는 시야 관련 기능, 피격시 알림 기능, 이펙트 생성 기능, 모든 적이 사용할 애니메이션 이벤트 관련 함수들이 있습니다.

핵심 컴포넌트 중 하나인 NavMeshAgent는 Unity의 길찾기 시스템을 담당하며, 적 크기별로 회전 속도, 가속도, 정지 거리를를 차등 적용하였습니다. 특정 상태에서는 NavMeshAgent를 일시적으로 비활성화하고 Transform을 직접 제어하는 하이브리드 방식을 사용했습니다.

상태 시스템 구현

각 상태는 독립적인 기능을 가지면서도 유기적으로 연결되며, NavMeshAgent의 활성화 상태를 적절히 제어합니다:

기본 상태들: