반응형
[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;
}
반응형
'Unreal > Manual' 카테고리의 다른 글
Unreal Editor Module 만들기 (0) | 2024.03.10 |
---|---|
Unreal 향상된 입력 InputMappingContext 사용하기 (0) | 2024.02.23 |
Unreal Animation Instance, 캐릭터의 속도와 방향 구하기 (1) | 2024.02.08 |
Unreal 인공지능 AIController 구성하기 (3) | 2024.02.07 |
Unreal 아군, 적군, 중립 구별 TeamID 설정하기 (0) | 2024.02.06 |