설계
어떤 Enemy AI가 좋은 것일까? 이것부터 고민을 시작했다. 여러 글을 찾아보다 아래 동영상을 접했다.
굉장히 영감을 주는 동영상이었는데, 이번 프로젝트에 바로 적용하는 데에 문제가 있었다. 가장 큰 문제는 애니메이션이 별로 없다는 것이었다. 일단 간단한 AI를 구성하는 것에 목표를 두기로 했다.
현재 AI의 상태는 아래와 같았다. 그냥 일정 범위에 플레이어가 들어오면 쫓아가서 공격한다. 공격 범위에서 플레이어가 벗어나면 다시 쫓아간다. 이하 반복.
AI가 단순한 만큼 이를 구성하는 Behavior Tree도 아주 단순하다.
내가 원하는 AI는 이렇게 공격적이서는 안된다. 적어도 미사일처럼 몸통박치기를 해서는 안되었다. 어느정도는 경계를 해야하기도 하고 그렇게 간을 보다가 갑자기 공격하러 다가가기도 해야 한다. 이를 위해 거리를 기준으로 AI의 태세를 설계해봤다. 예를 들어, Enemy와 Player 사이 거리가 서로 공격할 수 있는 거리라면 Offensive BT를 실행한다. 그 거리라면 AI는 적어도 두가지 선택을 할 수 있다. 공격하거나 다시 거리를 벌리거나. 이러한 관계를 그림으로 나타내면 다음과 같다.
파란색은 수비적인 행동을, 주황색은 공격적인 행동을 의미한다. 이걸 구분한 이유는 나중에 각 개체마다 공격성을 다르게 적용한다면 이 행동들의 확률이 올라가는 방식으로 만들 수 있다. 예를 들어, 공격성이 높은 적 캐릭터는 빙빙 돌면서 간을 보는 것보다 Offensive Area까지 전진하는 것을 선호할 것이다.
구현
언리얼에서 기본적으로 지원하는 BT의 좋은 점은 이러한 AI를 아주 직관적으로 설계할 수 있다는 점이다. 일단 AI의 Root는 다음과 같다.
Decorator를 통해 거리를 체크하고 이에 따라 적절한 BT(Behavior Tree)에 들어갈 수 있도록 했다.
먼저 Offensive BT는 다음과 같다.
Sequence에 Service를 걸어두었는데, 이는 각 행동에 들어가기 전에 주사위를 굴려주는 역할을 한다. 즉, Offensive BT에 들어왔으면 60% 확률로 플레이어를 공격하고, 40% 확률로 후퇴한다. Defensive BT도 비슷하다. 60퍼센트 확률로 기다리고 40퍼센트 확률로 Offensive Area까지 접근한다.
이렇게 적 캐릭터에 적용하면 다음과 같은 결과를 얻을 수 있다.
추가로 구현할 것
- 도발
- 거리 유지하며 플레이어 돌기(구현했으나 옆으로 걷는 애니메이션이 없어 추가 안함)
- 무작위 공격성. 그에 따른 다른 AI
회고
- 만들고 보니 그렇게 어려울 것이 없었는데, 생각외로 하루를 다 썼다. 특히 '거리를 유지하며 플레이어를 중심으로 도는 행동'을 만드는 것에 시간을 많이 썼는데, 결국 애니메이션이 없어서 넣지도 못했다. 애초에 준비물이 없으면 굳이 시간을 쓰지 않는 방향으로 진행해야 겠다.
- 그 외에 블루프린트의 노드 이름이 기억이 안나서 검색하는 시간이 좀 많이 들었다. 이건 계속 하다보면 괜찮아질 것 같다.
'Coding > Devlog' 카테고리의 다른 글
#6 메인 캐릭터와 적 캐릭터의 죽음 구현 (0) | 2022.03.02 |
---|---|
#5 플레이어 약공격 / 강공격 구현 (0) | 2022.03.01 |
#4 적 유닛 상단 체력바 구현 (0) | 2022.02.28 |
#2 새 프로젝트를 위한 기능 명세 작성 (0) | 2022.02.22 |
#1 AnimBlueprint와 AnimMontage Blend하기 (0) | 2022.02.18 |