[Unreal] Behavior Tree

개요

언리얼에서는 적 AI나 같이 패턴에 따라 행동하는 개체를 구현할 때 Behavior Tree를 사용한다.

이번 장에서는 BehaviorTree로 AI Actor를 만들기 위한 필수 요소들과 간단한 예제를 구현해보며 기능을 알아보고

다음 장에서는 각 요소들의 정확한 행동을 알아보기 위한 실험을 해 볼 예정이다.

기본 구성 요소

Behavior Tree로 행동하는 Actor를 만들기 위해서는 다음 요소들이 필요하다.

  • BP_AICharacter
  • BP_AIController
  • BlackBoard
  • Behavior Tree
  • Behavior Tree Task

BP_AICharacter

캐릭터를 상속받는 블루프린터 클래스로 AI_Controller가 빙의하여 움직일 Actor이다,

AI_Controller가 빙의될 수 있도록 설정만 하면 된다.

클래스 디폴트의 AI자동 빙의를 스폰하면 빙의될지 월드에 배치하면 빙의될지 설정해주고

AI 컨트롤러 클래스에 빙의에 사용할 AI_Controller 클래스를 지정해주면 된다.

 

월드에 배치하고 테스트할 것이기 때문에 Placed in World로 해주고

이따 만들 BP_Test2_AIController를 컨트롤러 클래스로 설정해줬다.

그리고 AI캐릭터의 외형을 스캘레탈 매쉬로 설정도 해준다.

BP_AIController

AI_Controller를 상속받은 블루클래스로 behavior Tree를 실행하거나 이벤트에 따라 BlackBoard의 키값에 접근하여 변경할 수 있다.

보통은 Event OnPossess로 컨트롤러가 빙의했을 때 Behavior Tree를 Run시켜준다.

AIPerciption 컴포넌트를 추가하여 Actor가 시야나 듣기 감각에 반응할 수 있게 하거나

AI_Controller에서 Set Value as Bool, Object 등으로 블랙보드의 키값을 변경해줄 수 있다.

주의할 점은 Key Name이 실제 블랙보드값과 똑같아야 값이 제대로 반영된다.

BlackBoard

블랙보드는 Behavior Tree가 현재 어떤 행동을 해야할지 참조해야하는 값들을 적어놓는 공간이라고 생각하면 된다.

Behavior Tree는 Blackboard의 키값들에 따라 행동을 선택하고, Controller나 BTTask들은 BlackBoard의 값을 변경하여 행동을 변경해 Behavior Tree에게 정보를 전달한다.

따라서 블랙보드에는 Key들만 존재한다고 보면 된다. 키들은블랙보드 디테일을 통해 설정들을 변경할 수 있다.

Behavior Tree

실제 Behavior Tree를 구성해주는 곳으로 다음 노드들을 통해 Tree를 구성할 수 있다.

  • Selector
  • Sequence
  • Task

 

모든 노드들은 위에서 아래로, 왼쪽에서 오른쪽으로 실행된다. 언리얼에서는 노드별 오른쪽 위에 있는 회색표시로 노드의 실행순서를 알려준다.

Selector

자신의 서브트리 중 하나를 선택할 때 사용하는 노드로 실행가능한 Task가 나올때까지 노드를 순회하다가 실행가능한 노드를 찾으면 순회를 멈춘다.

여기서 실행가능한 Task는 Finish Execute로 Success를 True로 반환한 Task를 의미하고

실행이 불가능한 Task는 Finish Execute로 Success를 False로 반환한 Task를 의미한다.

실행순서

  1. selector 진입
  2. success하는 task 나올때까지 순회
  3. suceess task가 true 반환하면 현재 Tick 완료
  4. 다음 Tick 시작

Sequence

자신의 서브트리 중 실행불가능한, Success를 False로 반환하는  task가 나올때까지 순회하는 노드이다.

실행순서

  1. sequence 진입
  2. fail하는 노드가 나올때까지 순회
  3. fail task가 반환하면 현재 Tick 완료
  4. 다음 Tick 시작

Task

Task는 실제 Behavior tree가 실행하는 행동으로 여기서 실제 행동이 실행된다고 보면 된다.

task는 bool값을 반환하는데 해당 task가 성공했는지 실패했는지를 의미하고 behavior Tree를 순회할지 말지를 판단하는 기준이 된다.

Decorator

Decorator는 Sequence, Selector, task 앞에 붙어서 해당 노드의 실행여부를 정해준다. 

예시로 Blackboard decorator를 추가하면

blackboard decorator의 레퍼런스를 보

  • 관찰자 노티파이 : 언제 관찰자가 요청을 중단할 수 있는지
  • 관찰자 중단
    • None : 중단하지 않음
    • self: 자신 및 자신의 서브노드를 중단
    • Lower Priority: 자신보다 우선순위가 낮은(오른쪽에 있는) 노드를 중단
    • Both : 둘 다

Behavior Task

Behavior Tree에서 사용가능한 Task를 직접 선언해주는 것이다.

이벤트 그래프에서 행동을 정의해주게 되고

Event Receive Execute AI 이벤트가 Behavior Tree가 이 Task를 실행했을 대 호출된다.

event를 작성할 때 이 Task가 성공으로 끝낫는지 실패로 끝났는지를 반환해주며 끝내야한다.

따라서 캐릭터의 이동속도를 바꾸는 Task를 간단히 작성하면

 

Reference

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/behavior-tree-in-unreal-engine---quick-start-guide

 

'Unreal' 카테고리의 다른 글

[Unreal C++] AnimInstance  (2) 2024.12.31
[Unreal C++] behavior Tree C++로 가져오기  (0) 2024.12.30
[Unreal] Reflection  (2) 2024.12.24
[Unreal] UPROPERTY  (0) 2024.12.24
[Unreal] Simple & Complex Collision  (0) 2024.12.21