게임개발일지/리그오브워치

[리그오브워치개발일지] #5 미니언 AI - 자동이동

김진우 개발일지 2023. 9. 21. 18:15

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 ControllerPlayer Controller을 대신해 캐릭터를 조작하는 인공지능 컨트롤러 클래스이고, Behavior TreeBlack Board는 인공지능을 생성할 때 사용하는 에셋이다.

원하는 AI 기능을 만들기 위해서는 아래와 같은 블루프린트/에셋이 필요하다.

  • AIC_Minion : 미니언 컨트롤을 담당하는 AI Controller
  • BB_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_MinionOnChangedMinionPatrolPoint는 어떻게 구현해야 하는지는 잠시 뒤에 블랙보드 에셋 설정과 함께 알려주겠다.

블랙보드

블랙보드는 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

결과물

다음

다음 글은 미니언 자동 공격을 구현해볼 예정이다.