본문 바로가기
Unreal/Manual

Unreal BehaviorTree에서 Random Selector Composite 만들기

by Dev_카페인 2024. 2. 14.
반응형

[Unreal/C++] BehaviorTree에서 Random Selector Composite 만들기

 

언리얼 엔진 비헤비어트리를 사용하다보면 데코레이터를 하나하나 추가해서 failed를 만드는 것 보다

무작위로 하위 노드가 선택되어 실행되는 것이 필요할 때가 있습니다.

 

필요한 경우 BTCompositeNode를 상속받아 Composite를 만들면 되는데 생각보다 어렵지 않습니다.

 

먼저 기본 Composite 인 Selector를 살펴보겠습니다.

 

BTComposite_Selector 클래스는 생각보다 단순한 함수로 구현되어 있습니다.

기본 생성자에서 NodeName을 설정하고 GetNextChildHandler 함수에서 다음 실행할 노드를 설정해 줍니다.

 

코드에서 보이는 것 처럼 첫 실행에서는 첫 번째 실행될 노드 번호 0번 을 설정 후 반환합니다.

그 외의 경우(이전 노드의 결과가 실패)에는 다음 노드의 번호 PrevChild + 1 을 반환합니다.

이 코드를 참고하여 Random한 선택을 가져올 수 있습니다.

 

1. BTCompositeNode를 상속받는 클래스를 만든다.

 

2. 헤더파일에 생성자와 GetNextChildHandler 함수를 오버라이딩 한다.

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTCompositeNode.h"
#include "BTC_RandomSelector.generated.h"

UCLASS()
class MULTIPLAYER_API UBTC_RandomSelector : public UBTCompositeNode
{
	GENERATED_BODY()
	
public :
	UBTC_RandomSelector();

	/* Random Selector
	* 하위노드 중 하나를 랜덤으로 선택해서 실행합니다.
	*/
	virtual int32 GetNextChildHandler(struct FBehaviorTreeSearchData& SearchData, int32 PrevChild, EBTNodeResult::Type LastResult) const override;
};

 

3. 함수를 정의한다.

#include "AI/BTComposite/BTC_RandomSelector.h"

UBTC_RandomSelector::UBTC_RandomSelector()
{
	NodeName = "Random Selector";
}

int32 UBTC_RandomSelector::GetNextChildHandler(FBehaviorTreeSearchData& SearchData, int32 PrevChild, EBTNodeResult::Type LastResult) const
{
	int32 NextChildIdx = BTSpecialChild::ReturnToParent;

	if (PrevChild == BTSpecialChild::NotInitialized)
	{
		// newly activated: start from first
		NextChildIdx = FMath::RandRange(0, GetChildrenNum() - 1);
	}

	return NextChildIdx;
}
반응형