Behavior Tree를 이용하여 몬스터 AI를 구현하는 방법에 대해 공부해보았다.
👤 AIController
몬스터 AI를 구현할 때 컨트롤러라는게 필요하다. 명령의 주체는 캐릭터가 아니라 컨트롤러이다. 언리얼에서는 빙의라는 표현을 사용하여 게임 플레이 시 자동으로 플레이어에게 빙의되어 플레이어를 움직이거나 입력받는다.
Player Controller를 생각하면, 플레이어를 움직이다가 말을 타면, 말이 움직이게 된다. 그럼 말이 Controller에 빙의된 것이다. 반대로, 말에서 내리면 다시 플레이어가 Controller에 빙의되는것이다. 이후 Controller가 키보드 입력이나 네트워크 입력등을 받아서 Controller가 빙의한 캐릭터에게 전달하여 제어하는 것이다.
AI도 마찬가지고, AI Controller라는 개념을 사용하여 AI가 Controller에 빙의되어 움직여진다.
예를들어, Controller가 근접공격에 대한 기능에 빙의된다면 해당 Controller를 가지고 있는 Enemy가 빙의되어 근접공격을 수행하는 것이다.
먼저 AIController를 상속받는 블루프린트 클래스를 하나 생성한다.
이후 AI Enemy 블루프린트를 열어 Enemy의 Pawn 카테고리에서 AI Controller Class를 지정해주는 설정을 위에서 생성한 AI Controller 클래스로 변경시켜 적용한다.
🎄 Behavior Tree
다음은 비헤이비어 트리를 생성한다.
비헤이비어 트리란 트리방식으로 행동을 정의하는 하나의 알고리즘이다.
각 노드에 셀렉터(Selector)와 시퀀스(Sequence) 노드를 이용하여 컨디션을 체크해 분기하고, 액션을 정의하여 트리를 구성하게 된다. 진행방향은 전위순회이다. (Root->Left->Right)
비헤이비어 트리의 기능을 알기위한 예제이다.
- 루트 노드
- 트리 내의 고유한 노드로써 하나의 연결만 가질 수 있고, 장식자 노드 또한 서비스 노드의 연결을 지원하지 않는다.
- 루트 노드를 선택하면 비헤이비어 트리의 Blackboard Asset을 설정할 수 있다. - Composites (복합노드)
- Composites에 해당하는 노드는 분기의 루트를 정의하고, 해당 분기가 어떻게 실행되는지에 대한 기본 규칙을 갖는다.- Sequence
- 모든 자식 노드가 true를 리턴할 때, true를 리턴하게 된다.
- 자식 노드가 true이면 다음 자식노드까지 쭉 진행한다. - Selector
- 자식 노드가 하나라도 true를 리턴하면 true를 리턴한다.
- 무언가 하나라도 성공한다면 true를 리턴하여 트리에서 나오기 때문에 다음 자식노드가 진행되지 않는다. - Simple Parallel
- 메인 Task가 실행되는 동안 백그라운드에서 실행될 노드들을 동시에 실행시킨다.
- 메인 Task가 끝나는 순간 백그라운드 노드들에서 탈출한다.
- Sequence
- Task
- 비헤이비어 트리의 잎에 해당하는 것으로, 어떤 작업을 하며 출력 연결이 없는 노드이다. - 데코레이터
- Conditionals, 조건문이라고도 한다.
- 다른 노드에 붙어서 트리 내 분기나, 노드 하나라도 그 실행여부를 결정짓는다.
- 쉽게말해, 조건에 따라 실행할지 말지를 결정하고, 조건에 따라 중단할지도 결정한다. - 서비스
- Composites 노드에 붙어, 그 분기가 실행하는 도중 정해진 빈도에 따라 실행된다.
- 보통 블랙보드 업데이트나 검사를 하는 데 사용된다.
💻 블랙보드 (Blackboard)
블랙보드는 AI에서 데코레이터와 같은 조건문을 사용할 때 변수를 제공해주는 변수 집합체와 같다.
먼저, 인공지능의 블랙보드를 생성한다.
블랙보드를 생성하고 나면 왼쪽에 키(Key)들을 생성하여 넣어놀 수 있다.
먼저, Target이라는 Object 타입의 키를 추가해주었다. 이때 Object타입은 Base Class유형이 꼭 설정되어 있어야 사용이 가능하다.
Instance Synced(동기화된 인스턴스)는 동일한 블랙보드 간 값을 공유하는 기능을 제공한다.
블랙보드를 비헤이비어트리에 할당했을 때, 비헤이비어 트리의 집합이 있고 또다른 블랙보드를 사용하는 집단이 있을 때, 같은 블랙보드를 사용하는 집단들끼리 같은 값을 사용하도록 설정해줄 수 있다. 지금은 사용하지 않고 넘어갔다.
그다음으로 생성한 블랙보드를 비헤이비어 트리의 Root에 할당해주었다.
이러한 기술들을 이용하여 Enemy AI 시스템을 구현해볼 수 있다.
참조
Behavior Tree Node Reference
Outlines the different types of nodes available when working in the Behavior Tree Editor.
docs.unrealengine.com
https://bbagwang.com/uncategorized/ue4-%EC%97%90%EC%84%9C%EC%9D%98-behavior-tree/
UE4 에서의 Behavior Tree – BBAGWANG
난 약간 어두컴컴한 테마를 좋아하긴 하는데 사실 진짜 원하는 레이아웃은 따로 있다. 이렇게 시원하고 심플한 로고, 제목, 서브제목, 작성시간, 주소, 그리고 조금 더 위에는 카테고리. 이렇게
bbagwang.com
https://docs.unrealengine.com/4.26/ko/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/
Behavior Trees
Documents the Behavior Trees asset in Unreal Engine 4 (UE4) and how it can be used to create Artificial Intelligence (AI) for non-player characters in your projects.
docs.unrealengine.com
'🎮Unreal4 > Blueprint' 카테고리의 다른 글
[UE4] Enemy AI -2 : 랜덤 순찰, 근접 추적 (서비스, Task(Speed, Patrol)) (0) | 2023.02.22 |
---|---|
[UE4] Enemy AI -1 : 감지기능 (AIController, AIPerception, 디버그모드, On Possess, 내비게이션 메시, Task) (0) | 2023.02.22 |
[UE4] Parkour 기능 -3 (Slide, Short/Normal/Wall) (0) | 2023.02.16 |
[UE4] Parkour 기능 -2 (Climb, Set Movement Mode, 루트 모션) (0) | 2023.02.16 |
[UE4] Parkour 기능 -1 (파쿠르가 가능한지 검증, Trace Channels) (0) | 2023.02.15 |