3 minute read

언리얼 엔진의 BT 관련 내용을 정리하였습니다.

Navigatinon Mesh

  • AI의 길찾기 시스템으로 자주 사용한다.

behavior tree system

  • 인공지능 메뉴 -> 블랙보드 에셋 생성 맟 behavior tree asset 생성하기.
    • 블랙보드 에셋
      • 인공지능의 판단에 사용하는 데이터 집합
      • 의사 결정을 블랙보드에 있는 데이터를 기반으로 함
    • behavior tree
      • 블랙보드 데이터에 기반해 설계한 behavior tree 정보를 저장한 에셋

behavior tree

  • behavior tree 관련 기능을 c++ 코드에서 사용하려면 AIModule 모듈을 추가해야 한다.
  • task는 독립적으로 실행되지 않는다. composite 노드를 거쳐야 한다.
  • composite 노드에는 selector 와 sequence 가 있다.
    • sequence -연결된 태스크들이 false 결과가 나올 때까지 왼쪽에서 오른쪽으로 태스크 계속 실행
    • selector

blackboard

  • NPC 위치 값들을 vector 타입의 키로 설정하고 추가 후 활용하자.
  • 게임 진행 중 계속해서 값이 바뀌는 데이터는 behavior tree 에서 값을 쓰도록 설계하는 것이 좋다.
    • BTTaskNode 를 부모 클래스로 하는 c++ 클래스를 이용해준다.
    • GameplayTasks 모듈을 추가해주어야 한다.
  • 값이 일정한 경우는 c++ 코드에서 지정해주면 된다.

code

GetRandomPointInNavigableRadius

  • 이동 가능한 목적지를 랜덤으로 가져오는 함수

SimpleMoveToLocation

  • 목적지로 폰을 이동시키는 함수

SimpleMoveToLocation

UAIBlueprintHelperLibrary

Blackboard

  • 인공지능의 판단에 사용하는 데이터 집합
  • UBlackboardData 로 접근한다.
  • 키를 생성해 BT에서 사용 가능하다.
    • FName을 이용해 키 이름을 부여하고
      • static const FName HomePosKey;
      • const FName ALSAIController::HomePosKey(TEXT(“HomePos”));
    • 값을 부여해 준다.
      • BlackboardComponent->SetValueAsVector(HomePosKey, GetPawn()->GetActorLocation());

UBlackboardComponent

class UBlackboardComponent : public UActorComponent

멤버 함수

GetValueAsVector

  • GetValue, 그리고.
  • Bool, Class, Enum, Float, Int, Name(FName), Rotator, String, Vector 등이 있음
FVector GetValueAsVector
(
    const FName & KeyName
) const

SetValueAsVector

  • SetValue, 그리고.
  • Bool, Class, Enum, Float, Int, Name(FName), Rotator, String, Vector 등이 있음
void SetValueAsVector
(
    const FName & KeyName,
    FVector VectorValue
)

Composites

  • BT의 흐름을 컨트롤하고 연결된 자식 branch들을 어떻게 실행할 지 결정한다.

Selector

  • branch들을 왼쪽에서 오른쪽 순서로 실행한다.
  • 실행에 성공하는 서브트리를 찾으면 서브트리 사이의 이동을 중단하고,
  • 부모 composite 으로 decision flow 가 이동한다.

Sequence

  • branch들을 왼쪽에서 오른쪽으로 순차적으로 실행한다.
  • Selector와는 다르게 자식 노드가 실패할 때까지 게속 실행해 나간다.

Simple Parallel

  • 두 connection을 가진다.
  • 하나는 메인 task이며, composite을 가질 수 없다.
  • 다른 하나는 메인 task가 실행되는 동안 실행된다.

UBTService

  • 서비스 노드는 독립적으로 작동하지 않고 컴포짓 노드에 부착되는 노드다.
  • 서비스 노드는 해당 컴포짓에 속한 태스크들이 실행되는 동안 반복적인 작업을 실행하는 데 적합하다.
  • 서비스 노드는 자신이 속한 컴포짓 노드가 활성화 될 경우 주기적으로 TickNode 함수를 호출한다.
  • 주기는 서비스 노드 내부에 설정된 Interval 속성 값으로 지정 가능하다.
  • 서비스 생성 후 비헤이비어 트리 컴포짓에 부착해 주면 된다.

멤버 변수

Interval

  • 틱 간의 간격
  • default 생성자에서 0.5f

RandomDeviation

  • Interval에 랜덤한 범위를 추가한다.
  • default 생성자에서 0.1f

bCallTickOnSearchStart

  • task 탐색이 이 노드에 진입하면 틱 이벤트를 호출한다.

bNotifyOnSearch

  • 설정되면, 아래 branch에 검색 진입하면 알림을 받는다.

bRestartTimerOnEachActivation

  • 노드가 활성화 될때 마다 틱 시간이 Interval로 초기화된다.

멤버 함수

UBTService::TickNode

  • Interval 을 주기로 틱을 업데이트 한다.
  • 노드가 인스턴스화되지 않았다면 const로 간주되어야 한다.
virtual void TickNode
(
    UBehaviorTreeComponent & OwnerComp,
    uint8 * NodeMemory,
    float DeltaSeconds
)

UBTTaskNode

  • Task는 BT의 leaf 노드들이며, 실제 행동을 수행한다.
  • 특정 AI를 위해 인스턴스화 될 수도 있으므로, 다음 가상 함수들은 const화 되어있지 않다.
    • ExecuteTask
    • AbortTask
    • TickTask
    • OnMessage
  • 노드가 인스턴스화 되지 않은 상태라면, 이 함수들로 객체의 속성을 절대 변경해서는 안된다.
  • Template nodes are shared across all behavior tree components using the same tree asset and must store their runtime properties in provided NodeMemory block (allocation size determined by GetInstanceMemorySize() )

멤버 함수

AbortTask

  • task를 중단하고 Aborted나 InProgress를 반환해야 한다.
  • InProgress를 반환하려면 FinishLatentAbort()를 사용해야 한다.

ExecuteTask

  • task를 시작하고 Succeeded, Failed 또는 InProgress(이 경우 FinishLatentTask() 사용)를 반환해야 한다.

OnMessage

  • 메시지 핸들러이다.
  • default 행동은 잠재적 실행 / 중단 을 완료한다.

OnTaskFinished

  • task 실행이 완료되었을 때 호출된다.

FinishLatentTask

  • task 종료 호출 함수
  • 부모 노드에 TaskResult 값 알림
void UBTTaskNode::FinishLatentTask(UBehaviorTreeComponent& OwnerComp, EBTNodeResult::Type TaskResult) const
{
	// OnTaskFinished must receive valid template node
	UBTTaskNode* TemplateNode = (UBTTaskNode*)OwnerComp.FindTemplateNode(this);
	OwnerComp.OnTaskFinished(TemplateNode, TaskResult);
}

멤버 변수

bIgnoreRestartSelf

  • 이 task가 이미 실행되고 있는 경우 이 task를 실행하려고 하는 task search는 버려진다.

bNotifyTaskFinished

  • 설정되면, OnTaskFinished 가 호출된다.

bNotifyTick

  • TickTask 가 호출된다.

Services

  • Service node 저장 컨테이너
  • TArray< UBTService * > Services

UBTDecorator

  • 데코레이터는 부모와 자식 노드 연결에 배치되어 지원한다.
  • 실행 흐름에 대한 알림을 받고, 틱도 가능하다.

멤버 함수

CalculateRawConditionValue

  • 데코레이터 조건의 raw 값을 계산
  • 조건 달성됐는 지 파악하는 도구로 사용 가능

UBTTaskNode::TickTask

virtual void TickTask
(
    UBehaviorTreeComponent & OwnerComp,
    uint8 * NodeMemory,
    float DeltaSeconds
)

EBTNodeResult

namespace EBTNodeResult
{
    enum Type
    {
        Succeeded,
        Failed,
        Aborted,
        InProgress,
    }
}

UAIPerceptionComponent

  • AIPerceptionComponent is used to register as stimuli listener in AIPerceptionSystem and gathers registered stimuli
class UAIPerceptionComponent : public UActorComponent

Leave a comment