车辆车辆适配器
车辆适配器
Crushform 车辆适配器让插件作用于带车轮的 Actor。添加一次,然后列出车轮即可。之后它会创建凹陷和污垢、玻璃、轮胎、滚动声音和特效、发动机声音、道具破坏以及撞击反馈,并回答插件关于该车辆的各种问题。适用于不是 Chaos 车辆的带车轮 Actor,例如拖车。Chaos 车辆应使用 Chaos 适配器,它会从移动组件读取车轮。
适配器是 Actor 上的一个组件。它回答插件关于车辆的问题,并在每一端上以固定名称创建插件的各个组件。每个组件都有自己的开关,列在下面的主要设置中。快速入门会逐一介绍这些组件。
车轮来自 Wheels 列表,或在游戏中通过 SetWheels 设置。适配器每帧都会对每个车轮下方的地面进行检测。检测从轮毂开始,结束于轮胎半径加上 Ground Probe Margin,因此略高于地面的轮胎仍会接触地面。车轮的速度来自其组件自上一帧以来的移动,所以被拖动的拖车即使没有发动机也有车轮速度。车轮扬起的尘土由该速度决定。
Authority 决定由哪一端模拟车辆并判定其命中:
- Server 是默认值。服务器模拟车辆,并拒绝来自客户端的命中报告。
- Owning Client 让控制该车辆的端成为其命中的来源。当没有玩家控制车辆时,由服务器承担这一角色。只有当报告的速度变化不超过车辆近期峰值速度加上 Ram Allowance Mps 时,服务器才会接受该命中报告;对于较轻、会被撞开的车身,这一允许值会相应放大。
在专用服务器上,适配器不检测任何车轮,因为服务器上没有任何东西会显示它们。
压上障碍物的轮胎
Section titled “压上障碍物的轮胎”轮胎压上障碍物时,轮辋会嵌入障碍物。适配器会把整个车轮沿轮胎请求的推挤量移离障碍物,因此轮胎会绕着障碍物凹陷,轮辋留在外面。推挤量受 UCFTireProfile::MaxPush 限制;超过此值,轮辋可能会嵌入障碍物。所有接触点都比橡胶允许的深度浅的轮胎不会被推挤。
推挤量在到达时一次性转换到车轮父级的空间中。对于父级相对于车身转动的车轮,例如转向节,转动期间推挤量是错误的。如何为这类车轮关闭推挤,见 宿主接口 指南。
覆盖了 Set Crushform Tire Wheel Offsets 的蓝图自行摆放车轮,不会获得推挤。此时轮胎会像没有推挤时那样凹陷,最深到其 Max Deflection,轮辋可能嵌入障碍物。
拖车是带有车轮网格、但没有移动组件的 Actor。将其车轮列在 Wheels 中。适配器根据每个车轮自上一帧以来的移动来获取其速度,因此拖车被拖动时,滚动声音、滚动特效和扬尘依然有效,车上无需发动机。
每辆车的数值(撞击阈值、道具速度、滚动和发动机调节以及车厢数值)会在适配器注册时复制到各组件上。游戏运行中之后的更改不会传递到这些组件。
适配器本身的步骤与自定义车辆相同,请按那里的说明操作。拖车的情况只需以下差异。
- 按照自定义车辆中 With the Crushform Vehicle Adapter 下的说明添加适配器并列出车轮。这里不再重复这些步骤。
| Crushform | ||
|---|---|---|
| Wheels | ||
| Wheels | 4 Array elements | |
| Index [ 0 ] | ||
| Wheel | ||
| Radius | 0.0 cm | |
| Index [ 1 ] | ||
| Wheel | ||
| Radius | 0.0 cm | |
| Index [ 2 ] | ||
| Wheel | ||
| Radius | 0.0 cm | |
| Index [ 3 ] | ||
| Wheel | ||
| Radius | 0.0 cm | |
| Ground Channel | ||
| Ground Probe Margin | 2.0 cm | |
- 拖车没有移动组件,因此 Wheels 列表是它唯一的车轮设置。对每个车轮,打开其条目,在 Wheel 中选择该车轮的组件:列表显示蓝图中的场景组件,因此无需手动输入。如果某个车轮的网格没有边界,请设置其 Radius,具体见下方主要设置表格(为 0 时取网格边界高度的一半)。
- 同样检查那里的 Authority 和功能开关。所有开关默认均为开启。
| Crushform | ||
|---|---|---|
| Authority | ||
| Deform Profile | DA_CF_DefaultProfile | |
| Tire Profile | DA_CF_DefaultTireProfile | |
| Ram Allowance Mps | 15.0 m/s | |
| Features | ||
| Dirt and Dents | ||
| Glass | ||
| Tires | ||
| Rolling Sound | ||
| Rolling FX | ||
| Engine Sound | ||
| Impact Feedback | ||
| Breaks Props | ||
在蓝图中,告诉适配器车辆状态的调用,在自定义车辆的 Tell the adapter what the vehicle does 小节中有说明。图中在 CF_Adapter 上调用了 SetBraking 和 SetCabinMuffled:
C++ 中的相同调用。先从 Actor 获取适配器,然后调用函数。每个签名都以适配器头文件中的为准。你调用的 Crushform 模块必须列在你的 Build.cs 中,参见安装。
#include "CFVehicleAdapterComponent.h"
void AMyVehicle::Tick(float DeltaSeconds){ Super::Tick(DeltaSeconds);
if (UCFVehicleAdapterComponent* Adapter = FindComponentByClass<UCFVehicleAdapterComponent>()) { Adapter->SetBraking(BrakeInput); Adapter->SetCabinMuffled(bListenerInCabin);
// The front side's deepest dent, 0 untouched to 1: the damage the server has confirmed. const float FrontMaxDent = Adapter->GetDamageZones().Front.Max; }}要读取车辆上某个盒形范围而非某一侧的损伤,请调用 GetDamageInBox,并传入以拥有者根空间表示的 FBox。
每行都是 UCFVehicleAdapterComponent 的属性,除非注明了其他类型。粗体标签是 Details 面板中开关的标签。数值为代码中的默认值。
关于从移动组件获取车轮的 Chaos 适配器,请参见 Chaos 适配器页面。
检查是否正常工作
Section titled “检查是否正常工作”- 按 Play,将车辆撞向墙壁,然后打开控制台。
- 运行
Crushform.Stats。它会为插件凹陷的每个车身输出一行。撞击后,你的车辆对应的那一行会显示大于 0 的hits计数。 - 运行
stat CrushformVehicle。车辆移动时会出现 Vehicle adapter 时间。
控制台命令在除 Shipping 之外的所有构建以及编辑器中都可用。
玻璃从不开裂,也没有 CF_Glass 组件
Section titled “玻璃从不开裂,也没有 CF_Glass 组件”原因。 Glass 需要 Dirt and Dents。只有两者都开启时,适配器才会创建玻璃组件。
修复。 打开 Dirt and Dents,然后重新编译并再次运行。
没有任何凹陷,OnDamageChanged 也从不触发
Section titled “没有任何凹陷,OnDamageChanged 也从不触发”原因。 Dirt and Dents 已关闭。没有它,适配器不会创建 CF_Deform 组件,因此损伤始终为零,事件也永远不会触发。
修复。 打开 Dirt and Dents。同时检查 Deform Profile:留空则使用项目默认值。
客户端上报的命中被忽略
Section titled “客户端上报的命中被忽略”原因。 Authority 为 Server,它会拒绝每一个来自客户端的命中报告。
修复。 对于玩家驾驶的车辆,将 Authority 设为 Owning Client。对于仅由服务器模拟的车辆,保留 Server。
某个车轮被跳过,日志提示它没有半径或未指定场景组件
Section titled “某个车轮被跳过,日志提示它没有半径或未指定场景组件”原因。 车轮的 Radius 为 0,而其网格没有可用于计算半径的边界;或者其 Wheel 条目没有指定任何组件。
修复。 以厘米为单位设置 Radius,并在 Wheel 中选择该车轮的组件。
在运行中的游戏里更改发动机声音偏移或撞击阈值没有效果
Section titled “在运行中的游戏里更改发动机声音偏移或撞击阈值没有效果”原因。 适配器在创建组件时会把这些值复制到组件上,运行中的车辆再做更改,不会传递到这些组件。
修复。 在车辆生成之前设置该值,或在蓝图的默认值中设置,然后生成新的车辆。