1、设置项目

我希望只管即便让事情变得大略,以是本文将利用基本资产,让我们以 Advanced Vehicle C++ 模板作为出发点。

1.1 设置玩家pawn

首先,我们将设置一个玩家Pawn,这不是逼迫性的。
但我喜好有一个类似 RTS 的第一人称玩家从顶部不雅观察。
以是,让我们创建这样一个玩家角色。
添加基于 Pawn 的新蓝图并定义以下事宜处理程序:

添加弹簧臂和相机,并根据你的喜好设置它们:

添加 FloatingPawnMovement 组件,否则玩家不会移动。

UE4车辆AI控制器实现

然后从默认关卡中删除所有 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 掌握器。

这是我的实当代码。
下面便是它实际实行的样子:

原文链接:http://www.bimant.com/blog/ue4-vehicle-ai/