定义键值选择器
// BTTaskNode.h
UPROPERTY(EditAnywhere)
FBlackboardKeySelector OriginKey;
构造函数中初始化添加键值类型约束
// 假定某头文件中的枚举类和U类
UENUM()
enum EMyEnum { };
UCLASS()
class UMyClass : public UObject
{
GENERATED_BODY()
public:
};
// BTTaskNode.cpp
UBTTaskNode::UBTTaskNode()
{
UEnum* MyUEnumPtr=FindObject<UEnum>(ANY_PACKAGE, TEXT("EMyEnum"),true);
// 因为AddClassFilter存在重载二义性,我们需要前置定义推断类型
const TSubclassOf<UMyClass>MyClass = UMyClass::StaticClass();
// 添加不同的键值约束方法
OriginKey.AddBoolFilter(this, TEXT("OriginKey"));
// AddClassFilter存在重载二义性
OriginKey.AddClassFilter(this, TEXT("OriginKey"),MyClass);
OriginKey.AddEnumFilter(this, TEXT("OriginKey"),MyUEnumPtr);
OriginKey.AddFloatFilter(this, TEXT("OriginKey"));
OriginKey.AddIntFilter(this, TEXT("OriginKey"));
OriginKey.AddNameFilter(this, TEXT("OriginKey"));
OriginKey.AddObjectFilter(this, TEXT("OriginKey"),UMyClass::StaticClass());
OriginKey.AddRotatorFilter(this, TEXT("OriginKey"));
OriginKey.AddStringFilter(this, TEXT("OriginKey"));
OriginKey.AddVectorFilter(this, TEXT("OriginKey"));
OriginKey.AddNativeEnumFilter(this, TEXT("OriginKey"), TEXT("EMyEnum"));
}
初始化黑板资产与键值关联函数
// BTTaskNode.h
// 头文件声明重写初始化函数
virtual void InitializeFromAsset(UBehaviorTree& Asset) override;
// BTTaskNode.cpp
void UBTTaskNode::InitializeFromAsset(UBehaviorTree& Asset)
{
Super::InitializeFromAsset(Asset);
// 获取黑板资产
if(const UBlackboardData* BBData = GetBlackboardAsset())
{
// 解析选择的键值
OriginKey.ResolveSelectedKey(*BBData);
}
}
执行任务函数:
// BTTaskNode.h
// 头文件声明重写执行任务函数
virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
// BTTaskNode.cpp
EBTNodeResult::Type UBTTaskNode::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
// 函数参数NodeMemory在使用本节点的AI上开辟一块新空间,作用是使行为多样化
//UBlackboardKeyType_Class::StaticClass();
//UBlackboardKeyType_Object::StaticClass();
//UBlackboardKeyType_Vector::StaticClass();
//UBlackboardKeyType_Bool::StaticClass();
//UBlackboardKeyType_Enum::StaticClass();
//UBlackboardKeyType_NativeEnum::StaticClass();
//UBlackboardKeyType_Float::StaticClass();
//UBlackboardKeyType_Int::StaticClass();
//UBlackboardKeyType_Name::StaticClass();
//UBlackboardKeyType_Rotator::StaticClass();
//UBlackboardKeyType_String::StaticClass();
// 检查OriginKey是黑板中的什么类型
if(OriginKey.SelectedKeyType == UBlackboardKeyType_Vector::StaticClass())
{
// 获取键值
FVector TargetVector = OwnerComp.GetBlackboardComponent()->GetValue<UBlackboardKeyType_Vector>(OriginKey.GetSelectedKeyId());
// 设置键值
OwnerComp.GetBlackboardComponent()->SetValue<UBlackboardKeyType_Vector>(OriginKey.GetSelectedKeyId(), TargetVector);
// 清除键值
OwnerComp.GetBlackboardComponent()->ClearValue(OriginKey.GetSelectedKeyId());
}
}