2020. 4. 23. 08:27ㆍ개발일지
이번에는 몬스터들이 플레이어를 추적해 이동하고 공격하도록 하는 작업을 진행했다.
네크로댄서의 몬스터들은 A* 알고리즘을 사용하지 않는다.
모든 몬스터를 조사해보진 않았지만, 적어도 1스테이지의 몬스터들은 이동 가능한 최단경로를 탐색하지 않는다.
슬라임은 플레이어를 추적하지 않고 같은 행동을 반복한다.
해골은 플레이어와 직선상에 위치했을때 벽에 가로막혀 있다면 벽이 없는 최단경로를 탐색하지 않고 그대로 이동하지 못한다.
필드보스(미니보스)의 경우 벽을 파괴하고 플레이어를 추적한다.
몬스터가 이동하는 조건
네크로댄서에서 몬스터는 두가지 조건에서 이동한다.
첫번째는 플레이어가 이동에 성공했을 경우 함께 이동한다.
두번째는 플레이어가 이동에 실패했을 경우(키를 입력하지 않거나 비트에 맞춰 입력하지 않은 경우)에는 플레이어는 이동하지 못하고 몬스터만 이동한다.
플레이어가 입력에 성공했을때 함께 이동하는 것을 구현했다.
먼저 플레이어가 입력 성공시 해당 씬에서 다른 모든 액터들도 행동하도록 호출해줬다.
몬스터 이동
이제 플레이어가 입력에 성공했을때 씬의 모든 몬스터들이 함께 이동하게 된다.
몬스터는 어떻게 이동시킬 수 있을까?
이전에 플레이어의 이동을 구현할때 이동을 수행하는 기능을 MoveComponent 클래스로 따로 분리하여 작성하였다.
(이동 클래스 구현은 예전 포스트 에서 찾아볼 수 있다.)
이동이 필요한 액터들은 이 컴포넌트를 가지고 있기만 하면 된다.
Monster 클래스를 상속받는 몬스터들은 대부분 이동이 필요하므로 Monster클래스의 생성자에서 MoveComponent를 생성했다.
Monster 클래스에 이동을 결정하는 Move함수를 구현했다.
Move함수가 bool을 리턴하게 했는데, 이는 이동에 성공했을시에만 true를 반환한다.
이동이 실패하는 경우 4가지로 이 경우에는 상태(Phase)가 넘어가지 않는다.
1. 이동할 방향에 다른 액터가 존재
2. 플레이어가 존재해 플레이어를 공격
3. 이동할 수 없는 벽이 존재
4. 부실 수 있는 벽을 부숨
이동에 관한 구현은 모두 해뒀으므로 이제 각각의 몬스터마다 각자 자신의 방식대로 이동을 하면 된다.
슬라임 행동패턴
먼저 가장 간단한 슬라임 행동 패턴을 보자.
그린 슬라임은 제자리에서 이동하지 않고 블루 슬라임은 플레이어를 추적하지 않고 같은 행동만 반복한다.
블루 슬라임의 행동은 다음과 같다: 멈춤 -> 위로 이동 -> 멈춤 -> 아래로 이동
해골 행동패턴
해골이나 필드 보스는 플레이어를 추적하며 이동한다.
SetDirection 함수.
먼저 한쪽방향으로 추적 후 플레이어와 좌표가 같아지거나 이동할 수 없을때 방향전환을 한다.
필드 보스 행동패턴
필드보스는 해골과 이동 패턴이 완전히 같다.
해골과 다른점은 벽을 파괴할 수 있다는 점이다.
이것으로 필드 몬스터의 인공지능 구현을 완료했다.
필드보스(드래곤)은 벽을 부시며 플레이어를 추적하는 것을 볼 수 있다.