跳转到内容
CRUSHFORMV1.1.0
在 Fab 上获取

车辆车辆适配器

车辆适配器

Crushform 车辆适配器让插件作用于带车轮的 Actor。添加一次,然后列出车轮即可。之后它会创建凹陷和污垢、玻璃、轮胎、滚动声音和特效、发动机声音、道具破坏以及撞击反馈,并回答插件关于该车辆的各种问题。适用于不是 Chaos 车辆的带车轮 Actor,例如拖车。Chaos 车辆应使用 Chaos 适配器,它会从移动组件读取车轮。

适配器是 Actor 上的一个组件。它回答插件关于车辆的问题,并在每一端上以固定名称创建插件的各个组件。每个组件都有自己的开关,列在下面的主要设置中。快速入门会逐一介绍这些组件。

车轮来自 Wheels 列表,或在游戏中通过 SetWheels 设置。适配器每帧都会对每个车轮下方的地面进行检测。检测从轮毂开始,结束于轮胎半径加上 Ground Probe Margin,因此略高于地面的轮胎仍会接触地面。车轮的速度来自其组件自上一帧以来的移动,所以被拖动的拖车即使没有发动机也有车轮速度。车轮扬起的尘土由该速度决定。

Authority 决定由哪一端模拟车辆并判定其命中:

  • Server 是默认值。服务器模拟车辆,并拒绝来自客户端的命中报告。
  • Owning Client 让控制该车辆的端成为其命中的来源。当没有玩家控制车辆时,由服务器承担这一角色。只有当报告的速度变化不超过车辆近期峰值速度加上 Ram Allowance Mps 时,服务器才会接受该命中报告;对于较轻、会被撞开的车身,这一允许值会相应放大。

在专用服务器上,适配器不检测任何车轮,因为服务器上没有任何东西会显示它们。

轮胎压上障碍物时,轮辋会嵌入障碍物。适配器会把整个车轮沿轮胎请求的推挤量移离障碍物,因此轮胎会绕着障碍物凹陷,轮辋留在外面。推挤量受 UCFTireProfile::MaxPush 限制;超过此值,轮辋可能会嵌入障碍物。所有接触点都比橡胶允许的深度浅的轮胎不会被推挤。

推挤量在到达时一次性转换到车轮父级的空间中。对于父级相对于车身转动的车轮,例如转向节,转动期间推挤量是错误的。如何为这类车轮关闭推挤,见 宿主接口 指南。

覆盖了 Set Crushform Tire Wheel Offsets 的蓝图自行摆放车轮,不会获得推挤。此时轮胎会像没有推挤时那样凹陷,最深到其 Max Deflection,轮辋可能嵌入障碍物。

拖车是带有车轮网格、但没有移动组件的 Actor。将其车轮列在 Wheels 中。适配器根据每个车轮自上一帧以来的移动来获取其速度,因此拖车被拖动时,滚动声音、滚动特效和扬尘依然有效,车上无需发动机。

每辆车的数值(撞击阈值、道具速度、滚动和发动机调节以及车厢数值)会在适配器注册时复制到各组件上。游戏运行中之后的更改不会传递到这些组件。

适配器本身的步骤与自定义车辆相同,请按那里的说明操作。拖车的情况只需以下差异。

  1. 按照自定义车辆中 With the Crushform Vehicle Adapter 下的说明添加适配器并列出车轮。这里不再重复这些步骤。
Crushform
Wheels
Wheels4 Array elements
Index [ 0 ]SM_Wheel_Front_L
WheelSM_Wheel_Front_L
Radius0.0 cm
Index [ 1 ]SM_Wheel_Front_R
WheelSM_Wheel_Front_R
Radius0.0 cm
Index [ 2 ]SM_Wheel_Rear_L
WheelSM_Wheel_Rear_L
Radius0.0 cm
Index [ 3 ]SM_Wheel_Rear_R
WheelSM_Wheel_Rear_R
Radius0.0 cm
Ground ChannelVisibility
Ground Probe Margin2.0 cm
Crushform 车辆适配器的 Wheels 列表,包含四个车轮。
  1. 拖车没有移动组件,因此 Wheels 列表是它唯一的车轮设置。对每个车轮,打开其条目,在 Wheel 中选择该车轮的组件:列表显示蓝图中的场景组件,因此无需手动输入。如果某个车轮的网格没有边界,请设置其 Radius,具体见下方主要设置表格(为 0 时取网格边界高度的一半)。
  2. 同样检查那里的 Authority 和功能开关。所有开关默认均为开启。
Crushform
AuthorityServer
Deform ProfileDA_CF_DefaultProfile
Tire ProfileDA_CF_DefaultTireProfile
Ram Allowance Mps15.0 m/s
Features
Dirt and Dents
Glass
Tires
Rolling Sound
Rolling FX
Engine Sound
Impact Feedback
Breaks Props
Crushform 车辆适配器的 Crushform 分类。所有功能开关均已开启。

在蓝图中,告诉适配器车辆状态的调用,在自定义车辆的 Tell the adapter what the vehicle does 小节中有说明。图中在 CF_Adapter 上调用了 SetBraking 和 SetCabinMuffled:

图中在 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 面板中开关的标签。数值为代码中的默认值。

属性作用默认值
UCFVehicleAdapterComponent::Authority由哪一端模拟车辆并判定其命中。Server:由服务器判定,并拒绝客户端的报告。Owning Client:驱动车辆的端进行判定,并上报其命中。Server
UCFVehicleAdapterComponent::DeformProfile车身的凹陷和污垢。留空则使用项目设置中 Crushform 下的默认值。空
UCFVehicleAdapterComponent::TireProfile轮胎。留空则使用项目设置中 Crushform Tire 下的默认值。空
UCFVehicleAdapterComponent::bDirtAndDentsDirt and Dents:车身会凹陷并沾上污垢。玻璃板和车轮的污垢需要它。开
UCFVehicleAdapterComponent::bGlassGlass:玻璃板会开裂和破碎。需要 Dirt and Dents,它用于找到这些玻璃板。开
UCFVehicleAdapterComponent::bTiresTires:轮胎在车轮网格上发生形变。开
UCFVehicleAdapterComponent::bRollingSoundRolling Sound:每个车轮播放其所在路面的滚动声音。在专用服务器上无声。开
UCFVehicleAdapterComponent::bRollingFXRolling FX:每个车轮显示其所在路面的滚动特效。专用服务器上没有。开
UCFVehicleAdapterComponent::bEngineSoundEngine Sound:发动机播放其声音。还需要 Crushform Engine 中的发动机声音开关。开
UCFVehicleAdapterComponent::bImpactFeedbackImpact Feedback:命中会在每一端上播放撞击声音和特效。与 Dirt and Dents 同时开启时,铰接部件的命中也会播放。开
UCFVehicleAdapterComponent::bBreaksPropsBreaks Props:车辆会撞碎它驶入的可破坏道具。开
UCFVehicleAdapterComponent::Wheels适配器追踪的车轮,每个车轮对应一个 FCFAdapterWheel。游戏运行时可由 SetWheels 替换。空
FCFAdapterWheel::Wheel车轮的组件,即随车轮转动的网格或场景组件。无
FCFAdapterWheel::Radius轮胎半径,单位为厘米。0 表示在首次使用该列表时,取车轮网格边界高度的一半。0 厘米
UCFVehicleAdapterComponent::GroundChannel车轮检测地面所用的通道。Visibility
UCFVehicleAdapterComponent::GroundProbeMargin轮胎在离地多高时仍接触地面,单位为厘米。2 厘米
UCFVehicleAdapterComponent::ImpactEventTag撞车时播放的撞击标签。留空则不播放撞击声音。Crushform.Impact.Vehicle.Crash
UCFVehicleAdapterComponent::ImpactImpulsePerKgForFullIntensity以满强度播放所需的速度变化,单位为厘米/秒。600 厘米/秒
UCFVehicleAdapterComponent::ImpactMinImpulsePerKg低于此速度变化时,命中不播放任何内容,单位为厘米/秒。50 厘米/秒
UCFVehicleAdapterComponent::PropContactMinSpeedCmS低于此速度时,车辆不破坏道具,单位为厘米/秒。50 厘米/秒
UCFVehicleAdapterComponent::bOverrideRollingSoundTuning为此车辆使用 RollingSoundTuning,而不是 Crushform Wheels 设置中的值。关
UCFVehicleAdapterComponent::bOverrideRollingFXTuning为此车辆使用 RollingFXTuning,而不是 Crushform Wheels 设置中的值。关
UCFVehicleAdapterComponent::bOverrideCabinMuffling在 SetCabinMuffled 中使用此车辆的 CabinVolumeScale 和 CabinLowPassFrequency,而不是设置中的值。关
UCFVehicleAdapterComponent::CabinVolumeScale开启覆盖时,车厢内滚动声音和发动机声音的音量。0.8
UCFVehicleAdapterComponent::CabinLowPassFrequency开启覆盖时,车厢内声音的低通截止频率,单位为赫兹。3000 赫兹
UCFVehicleAdapterComponent::EngineSoundProfile发动机的声音。留空则使用 Crushform Engine 中的默认值。空
UCFVehicleAdapterComponent::EngineSoundOffset发动机声音的播放位置,相对于拥有者的根部,单位为厘米。零
UCFVehicleAdapterComponent::RamAllowanceMps配合 Owning Client:上报的命中速度可以比近期峰值速度快多少,单位为米/秒。15 米/秒

关于从移动组件获取车轮的 Chaos 适配器,请参见 Chaos 适配器页面。

  1. 按 Play,将车辆撞向墙壁,然后打开控制台。
  2. 运行 Crushform.Stats。它会为插件凹陷的每个车身输出一行。撞击后,你的车辆对应的那一行会显示大于 0 的 hits 计数。
  3. 运行 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:留空则使用项目默认值。

原因。 Authority 为 Server,它会拒绝每一个来自客户端的命中报告。

修复。 对于玩家驾驶的车辆,将 Authority 设为 Owning Client。对于仅由服务器模拟的车辆,保留 Server。

某个车轮被跳过,日志提示它没有半径或未指定场景组件

Section titled “某个车轮被跳过,日志提示它没有半径或未指定场景组件”

原因。 车轮的 Radius 为 0,而其网格没有可用于计算半径的边界;或者其 Wheel 条目没有指定任何组件。

修复。 以厘米为单位设置 Radius,并在 Wheel 中选择该车轮的组件。

在运行中的游戏里更改发动机声音偏移或撞击阈值没有效果

Section titled “在运行中的游戏里更改发动机声音偏移或撞击阈值没有效果”

原因。 适配器在创建组件时会把这些值复制到组件上,运行中的车辆再做更改,不会传递到这些组件。

修复。 在车辆生成之前设置该值,或在蓝图的默认值中设置,然后生成新的车辆。