[리그오브워치개발일지] #5 미니언 AI - 자동이동
Git
레포지토리 주소 : https://github.com/kjinwoo12/UE5Game_LeagueOfWatch
기준 브랜치 : 5_MinionAIMovement
개발 내용 정리
이전글에서는 게임진행 규칙의 세부기능 중에서 미니언 생성과 그에 관련된 기능인 게임 진행시간 기록 기능을 만들었다. 아래는 개발 완료한 것을 취소선으로 표시하고, 앞으로 만들 내용을 정리한 것이다.
캐릭터 선택 :게임이 시작하면 캐릭터를 선택하는 화면이 등장하고, 유저의 캐릭터 선택을 45초 동안 기다린다.
캐릭터 데이터 테이블캐릭터 선택 UI이동 불가능한 기본 카메라
게임시작 규칙 :모든 유저의 캐릭터 선택이 완료되면 선택된 캐릭터가 유저의 진영의 기지에서 등장하고, 유저가 조작할 수 있게 된다.
캐릭터 조작 ( 완료 )캐릭터 스폰 기능캐릭터 빙의(캐릭터 변경)캐릭터 팀 구별 기능
- 게임진행 규칙 :
게임이 진행되는 동안 세 개의 공격로에서 각각 30초 간격으로 미니언 6마리가 생성되고, 적 기지를 향해 이동하면서 적 진영의 오브젝트를 공격한다.
미니언팀 구별 기능자동생성게임 진행시간 기록
- 자동이동
맵
- 체력
- 자동공격
- 공격 이펙트
- 피격 이펙트
- 진영 소속 오브젝트 (예: 포탑)
- 체력 규칙 :
체력이 있는 모든 오브젝트는 체력이 0 이하가 되면 파괴되거나 죽는다.
- 게임 승리 규칙 :
게임의 최종 목표는 적 진영 중요 건물(이하 "넥서스")을 파괴하는 것이다.
- 넥서스
- 체력
- 넥서스
목표
이번 글에서는 자동이동을 수행하는 AI를 완성하는 것을 목표로 한다. 자동이동을 하기 위해서는 UE5의 AI 시스템을 이해해야 한다. 공식 문서에서 소개하는 비헤이비어 트리
와 네비게이션 시스템
을 사용해서 필요한 기능을 만들 것이다.
본문
AI
플레이어의 조작 없이 스스로 행동하는 미니언은 AI라고 할 수 있다. UE5에서 AI를 만들기 위해서는 AI Controller
, Behavior Tree
, Black Board
이 세 가지 구성요소가 필요하다. AI Controller
는 Player Controller
을 대신해 캐릭터를 조작하는 인공지능 컨트롤러 클래스이고, Behavior Tree
와 Black Board
는 인공지능을 생성할 때 사용하는 에셋이다.
원하는 AI 기능을 만들기 위해서는 아래와 같은 블루프린트/에셋이 필요하다.
AIC_Minion
: 미니언 컨트롤을 담당하는 AI ControllerBB_Minion
: 인공지능 에셋 BT_Minion에서 사용할 변수 에셋BP_MinionPatrolPoint
: 미니언 이동 경로를 표시할 액터BT_Minion
: 미니언의 행동 양식을 기술할Behavior Tree
미니언 자동이동
네비게이션 메시
UE5에서는 경로찾기 기능을 사용할 때 NavMeshBoundsVolume
을 사용한다. NavMeshBoundsVolume
는 AI가 길을 자동으로 찾을 때 "길"로 인식할 표면을 생성하는 녀석이다. NavMeshBounsVolume
을 레벨에 있는 바닥과 겹쳐 배치하면 AI가 "길"로 인식할 수 있는 초록색 장판이 생기게 된다. AI가 캐릭터를 조종할 때 NavMeshBounsVolume
로 생성된 바닥을 돌아다니게 될 것이다. 액터 배치 창에서 검색해 사용할 수 있다. 배치 후 스케일을 조절해서 길을 만들어보자.
추가로, 앞서가던 미니언이 멈추면 뒤따르던 미니언이 앞에 미니언과 부딪쳐 멈추는 상황이 생길 수 있다. 이것은 네비게이션 메시가 정적(static)으로 생성되어 게임 실행 후 동적으로 생성된 미니언이 네비게이션 메시에 영향을 줄 수 없기 때문인데, 간단하게 프로젝트 세팅에서 네비게이션 메시를 정적에서 동적으로 바꾸는 것으로 해결할 수 있다. 레퍼런스 참고
경로
리그오브레전드에는 세 갈레 길이 존재한다. 탑(Top)으로 불리는 맵 좌측/상단을 차지하는 길, 중앙을 대각선으로 가로지르는 미드(Mid), 우측/하단을 차지하는 바텀(Bottom)이 그것이다. 미니언은 탑, 미드, 바텀에 레드 팀과 블루팀이 각자 진영에서 소환되어 서로 상대방의 기지를 향해 정해진 길로 걸어가 상대팀 오브젝트와 전투를 진행한다. 리그오브워치에서 BP_MinionPatrolPoint
는 각각의 미니언이 이동할 목적지의 기능을 수행한다. 일종의 이동 체크포인트 역할이다.
먼저 미니언 자동이동 목적지를 표시할 액터 BP_MinionPatrolPoint
를 만든다. 기본 컨셉은 미니언이 생성되었을 때 레벨에 스폰된 BP_MinionPatrolPoint
의 정보를 넘겨서 미니언이 해당 액터를 향해 이동하도록 만드는 것이다. 미니언이 액터에 도착했을 때 Overlap 이벤트로 다음 목적지를 미니언에 전달하는 역할을 수행한다. Overlap 이벤트 발생 범위를 조절하기 위해 Sphere Collision Component
를 추가하고, 액터에 ActorBeginOverlap
이벤트를 추가한다. 이후 원하는 만큼 구체의 크기를 조절하면 된다. 이 구체는 미니언이 목적지에 도착했는지 판단하는 범위가 될 것이다.
위 사진처럼 원하는 경로대로 BP_MinionPatrolPoint
를 배치한다. 이렇게 배치된 BP_MinionPatrolPoint
는 서로 연결해주는 작업이 필요하다.
다음 목적지를 반환하는 함수 GetNextPatrolPoint
이다. 필요한 맴버 변수는 레드팀일 때의 경로를 가르키는 변수 NextPatrolPointToLeft
와 블루팀일 때의 경로를 가르키는 변수 NextPatrolPointToRight
이다. 변수 타입은 BP_MinionPatrolPoint
의 오브젝트 레퍼런스다.
미니언 액터가 목적지에 도달했을 때 다음 목적지를 알려주는 코드다. 물론 BP_Minion
에서 다음 목적지를 전달받는 이벤트 OnArrivedToPatrolPoint
도 아래처럼 추가해야한다.
AIC_Minion
의 OnChangedMinionPatrolPoint
는 어떻게 구현해야 하는지는 잠시 뒤에 블랙보드 에셋 설정과 함께 알려주겠다.
블랙보드
블랙보드는 AI 기능을 사용할 때 필요한 변수값을 전달하는 에셋이다. 먼저 블랙보드 BB_Minion
에서 자동이동에 필요한 변수를 추가해야한다. 블랙보드 에셋을 열고 새 키를 오브젝트로 추가하자. 키 타입을 펼쳐보면 베이스 클래스를 설정할 수 있는데 BP_MinionPatrolPoint
로 설정해주자.
액터에서 블랙보드로 값을 전달해주는 과정도 필요하다. AIC_Minion
에서 커스텀이벤트 OnChangedMinionPatrolPoint
를 추가하고 아래와 같이 블랙보드에 값을 전달할 수 있다.
Key Name
에는 블랙보드에서 설정했던 키의 이름을 넣어주면 된다. 오브젝트 타입 뿐 아니라 여러가지 기본 타입들도 전달할 수 있으니 필요에 따라 추가할 예정이다.
비헤이비어 트리(Behavior Tree)
비헤이비어 트리(Behavior Tree)인 BT_Minion
은 AI 컨트롤러에 연결되어 AI가 어떤 방식으로 행동할지 기술한 에셋이다. 블랙보드 BB_Minion
와 연결 후 블랙보드에 있는 키를 사용할 수 있다. 아래와 같이 구성한다.
비헤이비어 트리에 관한 내용은 UE5 공식 가이드 - 비헤이비어 트리 퀵스타트 가이드 # 3 - 비헤이비어 트리레이아웃에서 볼 수 있다.
AI 컨트롤러
//AI Controller Event
//AI Controller IntializeBlackBoardKeys
미니언 액터인 BP_Minion
가 생성되면 AI 컨트롤러 AIC_Minion
가 Possess 될 필요가 있다. 만약 컨트롤러 없이 소환된다면 소환 후 가만히 있는 미니언들을 볼 수 있을 것이다. 미니언 생성을 담당하는 BP_MinionGenerator
에서 미니언 생성 시 컨트롤러를 함께 생성 후 Possess 하는 코드를 추가했다.
//Minion Generator
결과물
다음
다음 글은 미니언 자동 공격을 구현해볼 예정이다.