인공지능을 무엇을 넣으면 좋을까 고민하다가 좀비를 넣어봤습니다.
비헤이비어트리는 아래와같이 구성하였습니다. 블랙보드 키값으로 Target을 가지게했고, 플레이어를 Detect하면 SetTarget으로 플레이어를 Target으로 지정하여 TargetMove 노드를 실행합니다. Target이 없으면, Patrol, Wait 노드를 순차적으로 실행하게됩니다.
cpp 프로젝트를 많이 생성해야하는데, Zombie, ZombieAIController, DetectService, PatrolTask, TargetMoveTask를 생성해줍니다.
AI를 사용하기 위해, 빌드쪽 모듈에 "AIModule", "GameplayTasks", "NavigationSystem"를 추가해줍니다.
AI컨트롤러에 아래와같이 헤더파일도 추가해줍니다.
#include "BehaviorTree/BehaviorTree.h"
#include "BehaviorTree/BehaviorTreeComponent.h"
#include "BehaviorTree/BlackBoardData.h"
#include "BehaviorTree/BlackboardComponent.h"
이제 AI를 사용할 준비가 됐습니다.
서비스쪽에서 OverlapMultiByChannel 함수를 사용해서, 플레이어와 오버랩되면 AI가 동작하게 설계했습니다. 타겟을 가지고 있지 않을 경우, 캡슐모양으로 좀비의 눈앞 시야에서만 감지하고, 타겟이 들어오면 좀비 주변에 구가 생겨서 그 안에 플레이어가 있으면 계속 쫓아갑니다. 빠르게 도망가야 좀비의 추격에서 벗어날 수 있게했습니다.
// OverlapMultiByChannel을 사용해서 지정한 채널과 겹쳐지면 true를 반환하도록 하였습니다.
// 첫번째 인자인 resultArray는 채널을 담는 배열이고, 두번째 인자로는 몬스터의 위치를 모형의 중심으로 준 것입니다.
// 그리고 네번째 인자는 ECC_GameTraceChannel4는 플레이어를 탐지할 수 있도록 만들어준 트레이스 채널입니다.
// 해당 채널은 오직 플레이어와만 overlap이 감지되도록 설정되어있습니다.
// 다섯번째 인자는 캡슐 모형을 만든 뒤, if문을 사용하여 겹쳐진 플레이어가 있다면 생성해준 블랙보드의 타겟에 넣어주었습니다.
bool bCapsuleOverlap = GetWorld()->OverlapMultiByChannel(resultArrayCapsule, pZombie->GetActorLocation() + pZombie->GetActorForwardVector()*300,
FRotationMatrix::MakeFromZ(pZombie->GetActorForwardVector()).ToQuat(),
ECollisionChannel::ECC_GameTraceChannel4, FCollisionShape::MakeCapsule(20.f,300.f), params);
AI가 생각보다 문제가 많아서 시간을 많이 잡아먹었습니다.
대표적으로, 서비스가 한개밖에 없어서 멤버변수가 static 변수처럼 활용되는점이었습니다.
당연히 Zombie에 ZombieAIController가 빙의되고, AIController는 블랙보드와 비헤이비어트리를 가지고 있고, 비헤이비어트리에 서비스가 있으니 컨트롤러가 여러개 생성되는 상황에서 서비스도 당연히 컨트롤러마다 하나씩 있을줄 알았는데 아니었습니다. 그러다보니 bool 변수를 활용하여 Detect 서비스를 구현했는데, 좀비 하나만 플레이어를 감지해도 모든 좀비가 따라왔습니다. 계속 중단점 찍어보면서 디버깅도 해보고, 로그도 찍어보면서 발견했습니다. 발견하고나서 서비스에 있는 멤버변수를 활용하지않고 로직을 다시 구현했습니다.
중간에 믹사모 애니메이션이 앞으로 튀어나가서 어색한걸 발견하고 마야 다룰줄 아는 친구에게 도움을 요청해서 해결했습니다. 본을 0으로 고정시켰습니다. 언리얼과 좌표계가 달라서, 언리얼에서는 x,y축이었던게 마야에서는 x,z축이었어서 시간이 조금 더 걸렸습니다.
이 외에도 네비메쉬를 안깔아서 좀비가 안움직이는 등, 여러가지 실수들이 있어서 AI는 정말 시간이 많이 걸렸습니다. 그래도 시행착오를 겪으면서 가장 성장한 파트라고 생각합니다.
'게임 개발 (언리얼 엔진)' 카테고리의 다른 글
UE4 게임 개발 EscapeGame - 14 : 각종 효과음 (0) | 2020.12.24 |
---|---|
UE4 게임 개발 EscapeGame - 13 : BGM(Back Ground Music) (0) | 2020.12.20 |
UE4 게임 개발 EscapeGame - 11 : 좀비 애셋 추가 (0) | 2020.12.15 |
UE4 게임 개발 EscapeGame - 10 : 카메라 페이드 (0) | 2020.12.13 |
UE4 게임 개발 EscapeGame - 9 : UI(User Interface) (0) | 2020.12.09 |