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 掌握器。
这是我的实当代码。下面便是它实际实行的样子:
原文链接:http://www.bimant.com/blog/ue4-vehicle-ai/