0

ビヘイビア ツリー クイック スタート ガイドに従って、すべてが簡単に機能するようになりました。

現在、コントローラーをブルー プリントから C++ に変換しようとしてFollower_AI_CONいますが、ビヘイビア ツリーへの参照を取得できません (C++ のみを使用)。

の親クラスを持つブルー プリントを作成しAIController、エディター内からビヘイビア ツリーを選択することで参照を取得できます (下の画像) が、ブルー プリントをそれ以外の目的で使用しないことを考えると、無駄に思えます。その小さなドロップダウンメニュー。

ビヘイビア ツリーにアクセスするためだけに存在するブルー プリント

単純な作業のように見える作業に、イライラするほどの時間を費やしてきました。私は人々を信じ込ませるほど賢くないと思います!:D

私の最低限の .h / .cpp ファイルは次のようになります。

.h

UCLASS()
class THIRDPERSON_API AAIController : public AAIController
{
    GENERATED_BODY()

    ATPAIController(const class FObjectInitializer& ObjectInitializer);

public:

    virtual void Possess(class APawn* InPawn) override;

    // Reference to the AI's blackboard component.
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AI")
    UBlackboardComponent* BlackboardComponent;

    // The Behavior Tree Component used by this AI.
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AI")
    UBehaviorTreeComponent* BehaviorTreeComponent;

    UPROPERTY(EditDefaultsOnly, Category = "AI")
    class UBehaviorTree* BehaviorTree;

};

.cpp

AAIController::AAIController(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
    BlackboardComponent = ObjectInitializer.CreateDefaultSubobject<UBlackboardComponent>(this, TEXT("EnemyAIBlackboard"));
    BehaviorTreeComponent = ObjectInitializer.CreateDefaultSubobject<UBehaviorTreeComponent>(this, TEXT("EnemyAIBehaviorTree"));
}

void AAIController::Possess(APawn* InPawn)
{
    Super::Possess(InPawn);

    if (BehaviorTree)
    {
        BlackboardComponent->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
        BehaviorTreeComponent->StartTree(*BehaviorTree, EBTExecutionMode::Looped);
    }
}
4

1 に答える 1

0

AIController ブループリントを作成せずにビヘイビア ツリーを指定する必要があるのでしょうか? 次の 2 つのオプションがあります。

パスをハードコードする

ツリーへのパスをコードにハードコードしてからロードできます。しかし、このアプローチはあまりデータ駆動型ではありません。

FString Path = "/Game/AIStuff/FollowerBT";
UBehaviorTree* Tree = Cast<UBehaviorTree>(StaticLoadObject(UBehaviorTree::StaticClass(), nullptr, *Path.ToString()));

別の場所に設定

設計図がある他のグローバル クラスにツリーを設定します。これをカスタムの GameMode ブループリントに入れてから取得します。

UBehaviorTree* Tree = Cast<AMyGameMode>(GetWorld()->GetAuthGameMode())->MyBehaviorTree;
于 2016-08-20T16:34:06.380 に答える