2016-03-27 21 views
0

Behavior Tree Quick Start Guide'u takip ettim ve herşeyin yeteri kadar çalışmasını sağladım.Mavi Baskı kullanmadan Davranış Ağacı'nı Geri Al

Follower_AI_CON denetleyicisini Blue Print to C++ 'ye dönüştürmeye çalışıyorum ancak Behavior Tree'ye (yalnızca C++ kullanarak) başvuru alamıyorum.

AIController ana sınıfına sahip bir Blue Print yaratarak ve editör içinde (aşağıdaki resim) Davranış Ağacı'mı seçerek bir başvuru alabiliyorum, ancak Mavi kullanmayacağımı düşünürsek bu israf görünüyor Bu küçük açılır menüden başka bir şey için yazdırın.

Blue Print that only exists so that I can access my Behaviour Tree

Ben basit bir görev gibi görünen saatlerce bir sinir bozucu sayıda geçirdim. Sanırım insanları inanmaya itecek kadar akıllı değilim! : D

Benim çıplak kemikleri .h/.cpp dosyaları şuna benzer:

.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); 
    } 
} 

cevap

0

Yani bir davranış ağacı belirtmek gerekir bir AIController planı yapmadan mı?

Hardcode yolu

Kodunuzdaki ağacın yolunu hardcode ve sonra yükleyebilirsiniz: İki seçeneğiniz vardır.

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

başka bir yere Set

için bir plan var diğer bazı küresel sınıfta ağaç ayarlayın: Ama bu yaklaşım çok veri tabanlı değil. Özel bir GameMode Blueprint'e koydum ve sonra onu aldım:

UBehaviorTree* Tree = Cast<AMyGameMode>(GetWorld()->GetAuthGameMode())->MyBehaviorTree;