【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法

虚幻引擎版本:5.5.4

 问题描述

        刚创建的Third Person项目里,定义一个BP_Enemy蓝图,拖拽到场景中产生的实例会追随玩家,但SpawnActor产生的实例会固定不动。BP_Enemy蓝图具体设计如下:

BP_Enemy的Event Graph
​​

        又定义了一个Actor蓝图BP_SpawnEnemy,在场景中随机半径内根据BP_Enemy蓝图生成实例,BP_SpawnEnemy蓝图具体设计如下:

BP_SpawnEnemy的Event Graph

        场景中也添加了NavMeshBoundsVolume覆盖,将BP_SpawnEnemy放置在场景中时产生的BP_Enemy实例静止不动,如下图。

可能原因

1. AI Move To节点没有生效

2. SpawnActor产生的实例没有激活,不会执行BeginPlay

3. AI Move To节点的输入有问题

4. NavMeshBoundsVolume设置有问题

分析过程

        问题的关键在于:拖拽到场景中的实例和通过SpawnActor产生的实力有什么区别?

        通过在不同的节点前添加Print String节点,可以发现AI Move To的On Success和On Fail都没有执行,怀疑过是不是异步操作的原因,但更大的可能性是输入存在问题,在AI Move To节点前添加Print String节点打印发现输入都很正常,Pawn和TargetActor能获取DisplayedName,即表明成功获取到实例引用,其他还会是什么输入出现问题呢?

        在两天与豆包的交流里它多次提起“AIController异常”的问题,查看BP_Enemy蓝图里“AI Controller Class”发现设置成功,在SpawnActor后获取实例并打印其AIController,Is Valid节点判断为false,果然是没有初始化。在知乎里查到这样一个设置“Auto Possess AI”,看了选项恍然大悟,该设置用来定义角色的AIController在什么场景下初始化。

根本原因

        配置问题,AIController没有初始化。

解决方案 

       在BP_Enemy蓝图中,确认“AI Controller Class”配置是否设为“AIController”,并修改配置“Auto Possess AI”是否设置正确,各选项含义如下:

1. Disabled 不自动初始化AI Controller

2. Placed in world 当实例在场景初始化时就被放置在场景中,自动初始化AI Controller

3. Spawned 当实例是被生成出来的,生成时自动初始化AI Controller

4. Placed in world or spawned 无论实例是被放置或被生成出来的,都会自动初始化AI Controller

如果你通过`SpawnActor`生成的角色没有使用`AIController`,那么生成的角色将会自动拥有AI控制器的功能。要将AI控制器与生成的角色关联起来,可以按照以下步骤进行操作: 1. 创建一个继承自`AIController`的C++类,用于控制AI角色的行为。例如,创建一个名为`MyAIController`的类。 ```cpp // MyAIController.h #include "CoreMinimal.h" #include "AIController.h" #include "MyAIController.generated.h" UCLASS() class YOURPROJECT_API AMyAIController : public AAIController { GENERATED_BODY() public: // 构造函数 AMyAIController(); }; ``` 2. 在`MyAIController.cpp`文件中实现构造函数,并在构造函数中指定AI角色的类,以及设置是否启用黑板感知系统。 ```cpp // MyAIController.cpp #include "MyAIController.h" #include "YourAIClass.h" // 替换成你自己的AI角色类 AMyAIController::AMyAIController() { // 指定AI角色的类 static ConstructorHelpers::FClassFinder<APawn> PawnClass(TEXT("Class'/Script/YourProject.YourAIClass'")); if (PawnClass.Class != nullptr) { DefaultPawnClass = PawnClass.Class; } // 启用黑板感知系统(可选) bWantsPlayerState = true; SetPerceptionComponent(*CreateDefaultSubobject<UAIPerceptionComponent>(TEXT("PerceptionComponent"))); } ``` 3. 在某个适当的地方(例如关卡初始化或玩家进入触发器时),生成AI角色并将其与AI控制器关联起来。 ```cpp // 在某个适当的地方生成AI角色 void SpawnAI() { // 获取世界指针 UWorld* World = GetWorld(); if (World) { // 设置生成位置旋转 FVector SpawnLocation(0.0f, 0.0f, 0.0f); FRotator SpawnRotation(0.0f, 0.0f, 0.0f); // 生成AI角色 AYourAIClass* AICharacter = World->SpawnActor<AYourAIClass>(AYourAIClass::StaticClass(), SpawnLocation, SpawnRotation); if (AICharacter) { // 生成AI控制器 AMyAIController* AIController = World->SpawnActor<AMyAIController>(AMyAIController::StaticClass()); if (AIController) { // 将AI角色与AI控制器关联 AIController->Possess(AICharacter); } } } } ``` 通过以上步骤,你可以生成带有AI控制器的角色,并且角色将具有AI控制器的功能。请确保在生成AI角色后,使用`Possess`函数将AI角色与AI控制器关联起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值