C++AI中切换BlackBoard的值

首先定义一个FBlackboardKeySelector

UPROPERTY(EditAnywhere)
FBlackboardKeySelector State;

将其设为public,在行为树引用此Task时,就会在属性面板看到这个值,可以将其与黑板值绑定,作为key使用。

接下来就可以通过这个key来修改黑板的值,此处以枚举举例。

依然是参考蓝图类似行为的实现,这样对于API的掌握就会快速很多。

void UToolFunctionLibrary::SetBlackboardValueAsEnum(UBTNode* NodeOwner, const FBlackboardKeySelector& Key, uint8 Value)
{
    //获取黑板对象
    if (UBlackboardComponent* BlackboardComp = GetOwnersBlackboard(NodeOwner))
    {
        //注意此处,枚举值应当转化为Unit8来使用,通过FBlackboardKeySelector的Name来实现
        BlackboardComp->SetValue<UBlackboardKeyType_Enum>(Key.SelectedKeyName, StaticCast<uint8>(EAIState::Attack));
    }
}

//通过节点获取黑板对象
UBlackboardComponent* UToolFunctionLibrary::GetOwnersBlackboard(UBTNode* NodeOwner)
{
    UBehaviorTreeComponent* BTComponent = GetOwnerComponent(NodeOwner);
    if (ensureAsRuntimeWarning(BTComponent != nullptr))
    {
        return BTComponent->GetBlackboardComponent();
    }
    return nullptr;
}

//通过节点获取行为树
UBehaviorTreeComponent* UToolFunctionLibrary::GetOwnerComponent(UBTNode* NodeOwner)
{
    ensureAsRuntimeWarning((NodeOwner != nullptr));

    UBehaviorTreeComponent* OwnerComp = NodeOwner ? Cast<UBehaviorTreeComponent>(NodeOwner->GetOuter()) : nullptr;
    ensureAsRuntimeWarning(OwnerComp != nullptr);

    return OwnerComp;
}