언리얼 AI-비헤이비어 트리

MoOrY·2024년 11월 24일
0

언리얼 엔진

목록 보기
40/40

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

언리얼 엔진에서 캐릭터에 사용할 AI를 만드는 방법은 많지만, 비헤이비어 트리를 사용하면 블루프린트 비주얼 스크립팅으로 AI를 편하게 제작할 수 있다.


비헤이비어 트리의 기본

  • 비헤이비어 트리(BT)는 로직을 실행하고, 블랙보드는 BT가 결정을 내리는 데 필요한 정보인 블랙보드 키를 저장한다.

  • 비헤이비어 트리는 왼쪽에서 오른쪽, 위에서 아래 순서로 로직을 실행한다.

  • 데코레이터 노드는 조건문 역할을 하며, 컴포짓 노드에 어태치되어 블랙보드 키가 true인지 검증하는데 사용된다.

  • BT는 AIController 클래스에서 RunBehaviorTree()를 호출하여 실행한다.

  • 매 틱마다 트리를 반복하지 않고, 이벤트에 따라 실행된다.


비헤이비어 트리의 차별점

이벤트 주도형 BT

언리얼 BT가 다른 BT와 비교하여 가지는 차별점은 이벤트로 주도되므로 매 프레임마다 불필요한 작업을 수행하지 않는다는 점이다.
관련 변경사항이 발생했는지 지속적으로 확인하는 대신 트리 내 변경사항을 트리거하는 데 사용할 수 있는 이벤트를 수동적으로 리스닝한다. 즉 매 틱마다 전체 트리를 반복작업할 필요가 없어 성능이 뛰어난다. 개념적으로 도착했는지 계속 묻지 않고, 도착할 때까지 쉬다가 도착했다는 알림을 받는것과 같다.

조건문이 리프노드가 아님

BT표준 모델에서 조건문은 태스크 리프 노드로 처리하나, 언리얼에서는 데코레이터로 조건문을 처리한다. 데코레이터를 사용하면 BT UI를 보다 직관적이고 쉽게 만들어주며 모든 리프가 액션 태스크이므로 어떤 액션이 지시되는지 알기 쉽다.

동시 발생 비헤이비어

BT표준모델에선 보통 병렬 컴포짓 노드를 사용하여 동시발생 행동을 처리하며, 이 병렬 노드는 모든 자손에서 동시 실행된다. 언리얼 엔진에선 복잡한 병렬 노드 대신 단순병렬(Simple Parallel)노드와 서비스, 데코레이터의 관탈자 중단(Observer Aborts) 프로퍼티를 사용하여 동일한 유형의 행동을 달성한다.

심플 패러렐 노드

자손을 두개만 갖는데, 한 자손은 반드시 단일 태스크 노드여야 하고, 나머지 자식은 완전한 서브 트리를 가질 수 있다. 적을 이동하는 동안 총을 쏘는것처럼 A하는동안 B도 수행하는 노드이다. 여기서 A는 주요 태스크, B는 A가 완료되기까지 기다리는 동안의 부가 태스크 또는 필러 태스크이다.
부가 태스크를 처리하는 데 몇가지 옵션이 있지만, 전통적인 병렬 노드에 비해 비교적 단순하면서 병렬 노드가 사용되는 일반적인 경우를 대부분 지원한다.

서비스

셀렉터, 시퀀스, 심플 패러렐 등 모든 컴포짓 노드와 연관되는 특수 노드로 지정된 시간마다 콜백을 등록하고 주기적으로 발생시킬 필요가 있는 다양한 유형의 업데이트를 실행한다. 서비스는 자신이 추가된 컴포짓 노드의 서브트리에 실행이 머물러 있는 동안만 활성화된다.

관찰자 중단Observer Aborts

표준 병렬 노드의 흔한 용도 중 하나는 조건을 지속적으로 확인하여 요구 조건이 false가 되면 태스크를 중단한다. 예를 들어 플레이어가 시야에 들어오지 않는 순간 공격을 멈추는 것이다. 병렬 노드로는 플레이어를 볼 수 있는지 확인하는 자신과 시퀀스가 수행할 자손을 가징 수 있다.
언리얼 BT는 이벤트 주도형이므로 이렇게 하는 대신 조건문 데코레이터에 해당 값을 관찰하게 하고, 필요시 중단시키는 방식으로 처리한다. 예를 들어 플레이어를 볼 수 있는가? 가 있고 이 경우 시퀀스의 데코레이터에서 관찰자 중단을 self로 설정하면 된다.


비헤이비어 트리 노드

컴포짓Composit

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-behavior-tree-node-reference-composites

컴포짓 노드는 분기의 루트와 분기가 실행되는 방식의 기본 규칙을 정의한다. 컴포짓에 데코레이터를 붙여 분기 진입을 수정하거나 실행 도중 취소할 수 있다. 서비스를 붙이면 컴포짓의 자손이 실행중일때만 활성화하며 값을 업데이트할 수 있다.

셀렉터

  • 왼쪽에서 오른쪽으로 자손을 실행한다.

  • 자손 중 하나가 성공하면 실행을 중단한다.

  • 자손이 하나라도 성공하면 셀렉터도 성공한다.

  • 자손이 모두 실패하면 셀렉터도 실패한다.

시퀀스

  • 왼쪽에서 오른쪽으로 자손을 실행한다.

  • 자손 중 하나가 실패하면 실행을 중단한다.

  • 자손이 하나라도 실패하면 셀렉터도 실패한다.

  • 자손이 모두 성공하면 셀렉터도 성공한다.

심플 패러렐

  • 메인 태스크 노드 하나를 전체 트리와 함께 실행한다.
  • 메인 태스크가 완료되면 모드 완료(Finish Mode) 세팅에 따라 보조 트리의 완료 여부를 결정한다.

    모드 완료(Finish Mode)
    Immediate: 메인 태스크가 완료되면 보조 트리를 중단한다.
    Delayed: 메인 태스크가 완료되면 트리가 완료될 때까지 대기한다.


데코레이터

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-behavior-tree-node-reference-decorators

다른 BT에선 조건식이라고 불리는 데코레이터는 컴포짓이나 태스크 노드에 어태치되며 트리에 있는 분기 또는 단일 노드를 실행할 수 있는지 여부를 정의한다. 아래에서 빌트인된 주요 데코레이터 노드들을 소개한다.

BlackBoard

블랙보드 데코레이터 노드는 특정 블랙보드 키에 값이 설정되어 있는지 확인한다. 아래에서 블랙보드 노드의 프로퍼티들을 소개한다.

관찰자 노티파이Notify Observer

  • On Result Change: 조건이 변경될 때만 재평가한다.
    예를 들어 조건이 float > 90이라면, 0~90까지는 재평가하지 않고 91이 되는 순간 재평가한다.

  • On Value Change: 관찰된 블랙보드 키가 변경될 때만 재평가한다.
    조건에 관계없이 키 값이 변경될 때마다 트리를 재평가한다.

트리가 재평가되면 트리를 따라 잎 태스트 노드가 다시 실행될 것이다. 값이 변경될 때마다 무언가를 실행해야 한다면 On Value Changed를 선택하자.

관찰자 중단 Observer Aborts

조건이나 값이 바뀌었을 때 실행중인 서브트리와 태스크를 중단할 지 여부를 결정한다.

시나리오: AI가 순찰 경로를 따라 이동하다 플레이어를 발견하면 추적하며 블랙보드 데코레이터는 순찰 노드에 붙어있다.

  • None: 아무것도 중단하지 않는다.

    순찰하다 플레이어를 발견해도, 하던 순찰을 계속 수행한다. 순찰이 끝나고 추적을 시작한다.

  • Self: 데코레이터가 붙어있는 노드와 그 하위 노드들만 중단한다.

    순찰하다 플레이어를 발견하면 순찰을 중단하고 플레이어를 추적한다.

  • Lower Priority: 이 노드의 오른쪽에 있는 모든 노드를 중단한다.
    = 데코레이터가 붙어있는 노드보다 우선순위가 낮은 노드들을 중단한다. 데코레이터가 있는 노드와 그 상위 노드들은 계속 실행된다.
    중단된 노드들은 다시 평가되지 않는다.

    순찰 태스크가 추적 태스크보다 우선순위가 높다면(왼쪽에 있다면) 순찰 태스크를 중단하지 않고 계속 순찰한다. 만약 순찰 태스크가 추적 태스크보다 우선순위가 높다면 순찰 태스크를 중단하고 추적을 시작한다.

  • Both: 자신, 이 노드 아래에서 실행중인 모든 서브트리, 이 노드 오른쪽에 있는 모든 노드를 중단한다.
    = 데코레이터가 붙어 있는 노드, 그 하위 노드들, 그리고 우선순위가 낮은 노드들을 모두 중단하고 다시 평가한다.

    순찰 태스크와 추적 태스크를 모두 중단하고 전체 트리를 재평가한다. 플레이어를 발견하였으니 추적을 시작할 것이다.

Compare BB Entries

두 블랙보드 키 값을 비교하여 결과가 다른지 같은지에 따라 노드의 실행을 차단하거나 허용한다.

Composite

컴포짓 데코레이터 노드를 사용하면 블루프린트보단 간단하면서 내장된 노드보단 더 고급인 로직을 설정할 수 있다.
노드에 컴포짓 데코레이터를 추가한 후 해당 노드를 더블클릭하면 컴포짓 그래프가 표시되는데, 이 그래프 영역에서 우클릭하여 데코레이터 노드를 독립형 노드로 추가하고, And, Or, Not 노드로 서로 연결하여 고급 로직을 생성한다.

Conditional Loop

키 쿼리 조건이 충족되는 한 이 데코레이터는 어태치된 노드를 루프시킨다.

Loop

노드 또는 분기를 일정 횟수만큼 또는 무한히 루프한다.

ConeCheck

세 벡터키를 취한다. 첫번째 키는 원뿔이 시작될 위치, 두번째는 원뿔이 가리키는 방향, 세번째는 이 위치가 원뿔 내부에 있는지 확인한다. 원뿔의 각도는 원뿔반각(Cone Half Angle) 프로퍼티로 정의한다.

Keep In Cone

관찰된 위치가 여전히 원뿔 내에 있는지에 따라 조건이 정해진다. 원뿔의 방향은 처음으로 연관성이 생길 때 계산된다.

CoolDown

쿨다운 시간이 만료될 때까지 노드나 분기의 실행을 잠군다. 관찰자 중단과 쿨 다운 시간을 프로퍼티로 받는다.

커스텀 데코레이터

직접 만든 커스텀 블루프린트 데코레이터를 실행한다. 관찰자 중단과 프로퍼티 디테일 표시, 노드 이름과 역 조건 프로퍼티를 포함한다.

Does Path Exist

블랙보드 키 A와 B로 경로를 만들 수 있는지 여부를 확인한다.

경로 쿼리 타입:

  • NavMeshRaycast2D: 아주 빠름
  • Hierarchical Query: 빠름
  • Regular Path Finding: 느림

필터 클래스: 사용할 네비게이션 데이터. None으로 설정하면 디폴트 네비게이션 데이터를 사용한다.

Force Success

노드 결과를 강제로 성공으로 변경한다.

IsAtLocation

AI가 제어하는 폰이 특정 위치에 있는지 확인한다.

Is BBEntry Of Class

지정된 블랙보드 키가 특정 클래스에 속하는지 확인한다.

Time Limit

분기 또는 노드가 일정 시간 내에 완료되지 않으면 중단되고 실패하게 한다. 이 타이머는 노드가 포커스를 받을 때마다 초기화된다.


서비스

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-behavior-tree-node-reference-services

컴포짓이나 태스크 노드에 어태치되며, 분기가 실행중인 동안 정의된 빈도로 실행된다. 보통 블랙보드의 확인과 업데이트에 사용된다. 이 노드는 다른 BT의 전통적인 병렬노드(페러렐 노드)를 대체한다.

Default Focus

AI 컨트롤러의 포커스를 설정하여 블루프린트 및 코드의 액터에 액세스하는 바로가기를 생성한다. AI 컨트롤러의 포커스를 액터로 설정하면 블랙보드 키에 액세스하지 않고, AI컨트롤러에서 직접 액세스할 수 있다.

해당 블랙보드 키는 AAIController::GetFocusActor() 함수로 접근 가능하다.

Run EQS

해당 노드는 지정된 간격으로 인바이러먼트 쿼리 시스템(EQS) 템플릿을 정기적으로 실행하고 지정된 블랙보드 키를 업데이트할 수 있다.

EQS
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/environment-query-system-in-unreal-engine
언리얼 엔진의 인공지능 시스템에 포함된 기능으로, 환경으로부터 데이터를 수집하는 데 사용된다. EQS에서 다양한 테스트를 통해 수집된 데이터에 대해 질문할 수 있으며 이러한 데이터는 질문 유형에 가장 잘 맞는 항목을 생성한다.
EQS는 쿼리는 BT에서 호출되어 테스트 결과를 의사결정을 내리는데 사용될 수 있으며 AI캐릭터가 플레이어를 공격할 시야가 확보되는 최적의 위치, 가장 가까운 체력 또는 탄약 아이템, 가장 가까운 은폐 지점 등을 찾도록 지시하는 데 사용될 수 있다.

커스텀 서비스

직접 생성한 서비스를 실행한다.


태스크

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-behavior-tree-node-reference-tasks

AI를 이동하거나 블랙보드 값을 조정하는 등, 각종 작업을 수행한다. 데코레이터나 서비스를 어태치시킬 수 있다.

Finish With Result

성공, 실패, 완료중단, 진행중인 상태로 완료 등, 지정된 결과를 내고 바로 완료한다. 해당 노드로 분기를 강제종료하거나, 정의된 결과를 바탕으로 분기를 계속할 수 있다.

Make Noise

제어되는 폰에 PawnNoiseEmitter 컴포넌트가 있다면, Make Noise 태스크는 해당 폰이 노이즈를 만들도록(메세지를 전송하도록) 한다. 노이즈는 PawnSensing 컴포넌트를 가진 다른 폰이 들을 수(메세지를 수신할 수) 있다.

Move to

캐릭터 무브먼트 컴포넌트를 갖춘 폰이 내비 메시를 사용하여 벡터 블랙보드 키로 이동하도록 한다.

Move Directly Toward

네비게이션을 전혀 고려하지 않고 지정된 액터 또는 위치 블랙보드 항목을 향해 직선으로 AI폰을 이동한다.

Play Animation

지정된 애니메이션 에셋을 플레이한다. 선택된 애니메이션은 반드시 AI폰의 스켈레톤과 일치해야 한다.

Play Sound

사운드를 재생한다.

Puse Pawn Action

지정된 액션을 폰의 컨트롤러에 푸시할 수 있다.

Rotate to face BBEntry

조종하는 폰을 지정된 블랙보드 키 방향으로 회전한다.
이 태스크를 사용하려면 컨트롤러 회전 요 사용(Use Controller Roatation Yaw)이 활성화되어 있어야 한다.

Run Behavior

서브트리를 실행 스택으로 푸시하여 다른 비헤이비어 트리를 실행한다. 하지만 서브 트리 에셋을 런타임에 변경할 수 없는 제한이 있다.
이 제한은 부모 트리에 입력된 서브트리의 루트 레벨 데코레이터를 지원하기 위해 존재한다. 실행 트리의 구조 역시 런타임에 변경할 수 없다.

Run Behavior Dynamic

서브트리를 실행 스택으로 푸시하여 다른 비헤이비어 트리를 실행하기 위해 존재하는 것은 Run Behavior 태스크 노드와 동일하지만, 비헤이비어 트리 컴포넌트의 SetDynamicSubtree 함수를 할당하여 실행할 비헤이비어 트리를 런타임에서 변경할 수 있다.
단 서브 트리의 루트 레벨 데코레이터를 지원하지 않는다.

Run EQS Query

지정된 인바이런먼트 쿼리 시스템(EQS) 에셋을 실행한다.

EQS
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/environment-query-system-in-unreal-engine

Set Tag Cooldown

쿨타운 태그 값을 설정하며, 쿨다운 태그 데코레이터와 함께 사용하여 비헤이비어 트리가 실행되는 것을 방지할 수 있다.

Wait

지정된 대기 시간이 지날때까지 이 노드에서 트리를 대기시킬 수 있다.

Wait Blackboard Time

Wait과 동일하지만 쿨다운 시간을 블랙보드 값으로 지정할 수 있다.

커스텀 태스크

직접 생성한 태스크를 실행한다.

profile
필기용 블로그입니다.

0개의 댓글