我跟踪了行为树快速启动指南,让一切都足够简单了。
现在,我正在尝试将Follower_AI_CON
控制器从蓝图转换为C++,但无法获得对行为树的引用(仅使用C++)。
我可以通过创建一个具有AIController
父类的蓝图并在编辑器中选择menu (下图)来获得引用,但考虑到除了那个微小的下拉菜单之外,这似乎是浪费了。
我花了很多令人沮丧的时间在看似简单的任务上。我想我不像我引导人们相信的那样聪明!
我的基本.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);
}
}
发布于 2016-08-20 16:34:06
因此,您需要指定行为树而不生成AIController蓝图?你有两个选择:
硬编码路径
您可以在代码中硬编码到树的路径,然后加载它。但这种方法并不是由数据驱动的:
FString Path = "/Game/AIStuff/FollowerBT";
UBehaviorTree* Tree = Cast<UBehaviorTree>(StaticLoadObject(UBehaviorTree::StaticClass(), nullptr, *Path.ToString()));
设置在其他地方,
在您有蓝图的其他全局类中设置树。我会把它放在一个定制的GameMode蓝图中,然后检索它:
UBehaviorTree* Tree = Cast<AMyGameMode>(GetWorld()->GetAuthGameMode())->MyBehaviorTree;
https://stackoverflow.com/questions/36248721
复制相似问题