NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
虚幻引擎 4 具有开箱即用的人物 AI,之前我已经发布了关于简单行为树的文章。但是非人物角色呢?嗯,这是未知的领域。但好在 Epics 留下了一些钩子,你可以用它们来让事情变得生动起来。本文将介绍如何在 UE4 中实现简单车的辆 AI。
1、设置项目
我希望尽量让事情变得简单,所以本文将使用基本资产,让我们以 Advanced Vehicle C++ 模板作为起点。
1.1 设置玩家pawn
首先,我们将设置一个玩家Pawn,这不是强制性的。但我喜欢有一个类似 RTS 的第一人称玩家从顶部观察。所以,让我们创建这样一个玩家角色。添加基于 Pawn 的新蓝图并定义以下事件处理程序:
添加弹簧臂和相机,并根据你的喜好设置它们:
添加 FloatingPawnMovement 组件,否则玩家不会移动。
然后从默认关卡中删除所有 PlayerStart actor,并禁用载具上的“AutoPossessPlayer”属性。
将新创建的Pawn添加到场景中,并使其由玩家自动拥有。现在,当你开始游戏时,可以类似 RTS 的方式在地图上导航(使用 WASD 来控制视图)。
1.2 设置AI
现在让我们继续讨论AI。
首先,我们需要一个 AIController:
然后,我们需要一个只有一个 Vector 类型变量的黑板:“ClickLocation”。还有一个行为树,非常简单:
唯一的任务是移动到之前在 AIController 蓝图中设置的 ClickLocation。
还有一件事:在关卡中添加一个 NavMeshBoundsVolume,否则 PathFindingComponent 将不起作用。
如果它是Character,那么它已经可以工作了。但它是车辆,所以事情有点复杂。
2、车辆AI
让我们看看 MoveTo 链在 UE4 中是如何工作的。
当行为树运行 MoveTo 任务时,它实际上运行 AIController::MoveTo 方法。然后在 AIModule 的内部发生了很多事情。但最终,UNavMovementComponent::RequestDirectMove 被调用。
UCharacterMovementComponet 已实现此方法。这就是为角色设置 AI 如此简单的原因。另一方面,UWheeledMovementComponent 没有默认实现。因此,由开发人员决定将自定义Pawn移动到所需位置。
该方法本身具有以下原型:
void RequestDirectMove(const FVector& MoveVelocity, bool bForceMaxSpeed)
MoveVelocity 参数表示到目标的方向。矢量的长度表示目标与车辆的距离。事实上,如果将 MoveVelocity 乘以 DeltaTimeSeconds,将得到车辆位置和目标之间的距离。
通常起点和终点之间的路径由段组成。当车辆跟随非最终路段时,bForceMaxSpeed 为真。基本上,它是在告诉车辆:“尽可能快地行驶,目标离这里还很远”。
让我们看看它是如何工作的。
首先,我们需要创建一个基于 UWheeledVehicleMovementComponent4W 的新类。像这样覆盖它的 RequestDirectMove 方法:
Super::RequestDirectMove(MoveVelocity, bForceMaxSpeed);
FVector VehicleLocation = GetOwner()->GetActorLocation();
FVector Destination = VehicleLocation + MoveVelocity * GetWorld()->GetDeltaSeconds();
DrawDebugLine(GetWorld(), GetOwner()->GetActorLocation(), Destination, FColor::Red, false, 1.f, 0, 3.f);
不要忘记将这个类注入到车辆类中。通过以下方式更改车辆类构造函数:
// declaration:
AVehicleAIPawn(const FObjectInitializer& ObjectInitializer);
// definition:
AVehicleAIPawn::AVehicleAIPawn(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer.SetDefaultSubobjectClass<UAIVehicleMovement>(AWheeledVehicle::VehicleMovementComponentName))
如果项目中的所有设置都正确,你将得到一条从车辆到目标的红线。
3、PID控制器
至此,我们几乎完成了。指示很清楚。现在你只需要实现一个算法
有很多方法可以实现这一目标。我使用了 PID 控制器。PID算法在这本令人惊叹的书里得到了完美的描述。
我真的不想解释 PID 控制器是如何工作的。涉及到很多数学。有些事情超出了我的理解。我只是分享我的实现,所以你可以自己看看。我强烈建议你阅读 GameAIPro 的那篇文章——如果你决定使用它,它将帮助你了解如何调整 PID 控制器。
这是我的实现代码。下面就是它实际执行的样子:
原文链接:How to implement vehicle AI in UE4
BimAnt翻译整理,转载请标明出处