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

车辆CHAOS 适配器

Chaos 适配器

Crushform Chaos 车辆适配器用于 Chaos 轮式车辆:即带有 Chaos 移动组件的 AWheeledVehiclePawn。它从该移动组件获取车辆的车轮、发动机和车轮载荷,因此你无需列出任何车轮。插件内置的轿车使用的就是这个适配器。车辆适配器在车身、玻璃、轮胎、声音和撞击方面的所有功能,这里同样具备。本页介绍 Chaos 适配器额外增加的内容。

插件内置的轿车:车头压溃,引擎盖和车身凹陷,两扇车门都打开,位于平坦的测试场地上。
撞击后的轿车:车身和引擎盖上有凹陷。

车轮。 适配器读取移动组件中的车轮设置和车轮状态。车轮的网格是附着在车辆网格上、位于该车轮骨骼处的网格组件。如果某个车轮的骨骼上没有网格,它就没有可以形变的轮胎,也不会有车轮污垢。适配器仍然会读取它与地面的接触。

轮胎。 轮胎沿车辆的上方向下沉,该操作在骨骼移动之后进行,因为车轮骨骼会旋转和转向。把车轮推离障碍物的推挤量会与下沉一起应用,采用车主坐标系;见 轮胎形变。适配器还会把每个车轮的载荷与其名义份额之比交给对应的轮胎。载荷来自悬挂的弹簧力,因此承重更大的车轮会读取到更高的载荷。

发动机。 Chaos 没有点火系统。只要移动组件存在,发动机就在运转。它的转速来自移动组件的发动机转速,其怠速和最高转速来自移动组件的发动机设置。它的负载来自驾驶员的油门,倒车时则还来自刹车踏板。由其他端驾驶的车辆不会读取本地踏板的负载,因此在你的端上听起来像是在滑行。

隐藏的设置。 Chaos 适配器会隐藏通用适配器中的车轮列表、Ground Channel 和 Ground Probe Margin,因为移动组件提供了车轮和地面接触点。这些设置在这里不起作用。

设置检查。 如果拥有者不是带有 Chaos 移动组件的 AWheeledVehiclePawn,适配器会记录一条错误,并报告没有车轮。适配器的其余部分仍会创建其组件。

从已满足快速入门要求的 Pawn 开始。添加适配器的步骤在快速入门的第 3 步中,这里只说明与之不同的部分。

  1. 按照快速入门第 3 步添加适配器:添加 Crushform Chaos Vehicle Adapter,而不是通用适配器。编译并保存。

  2. 选中适配器。设置 Deform Profile 和 Tire Profile,或将其留空以使用项目默认值。

  3. 检查功能开关。每个开关都会关闭它所对应的组件,与车辆适配器表格中的说明一致。

Crushform
AuthorityServer
Deform ProfileNone
Tire ProfileNone
Ram Allowance Mps15.0 m/s
Features
Dirt and Dents
Glass
Tires
Rolling Sound
Rolling FX
Engine Sound
Impact Feedback
Breaks Props
Chaos 适配器的 Crushform 分类。其车轮列表、Ground Channel 和 Ground Probe Margin 已隐藏。
  1. 检查每个车轮的网格是否位于其车轮骨骼上。只有骨骼的车轮不会获得轮胎形变和车轮污垢。

在 C++ 中读取发动机转速。先从 Pawn 获取 Chaos 适配器,然后调用其获取函数。每个签名都以头文件中的为准。你的模块必须在 Build.cs 中列出 Crushform 模块,参见安装。

#include "CFChaosVehicleAdapterComponent.h"
void AMyVehicle::UpdateHud()
{
if (const UCFChaosVehicleAdapterComponent* Adapter = FindComponentByClass<UCFChaosVehicleAdapterComponent>())
{
const float Rpm = Adapter->GetEngineRPM();
const float IdleRpm = Adapter->GetEngineIdleRPM();
const float MaxRpm = Adapter->GetEngineMaxRPM();
HudRpmFraction = (MaxRpm > IdleRpm) ? (Rpm - IdleRpm) / (MaxRpm - IdleRpm) : 0.f;
}
}

要在 C++ 中修改适配器对某个车轮的应答,请在子类中覆盖其 _Implementation。在覆盖函数中通过 Super:: 调用同一个 _Implementation 函数,以保留 Chaos 的应答,且绝不按名称调用该事件。

Chaos 适配器继承了 UCFVehicleAdapterComponent 的以下设置。

属性作用默认值
UCFVehicleAdapterComponent::DeformProfile车身的凹陷和污垢。留空则使用项目默认值。空
UCFVehicleAdapterComponent::TireProfile轮胎。留空则使用项目默认值。空
UCFVehicleAdapterComponent::Authority由哪一端模拟车辆并判定其命中。Server
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。开
UCFVehicleAdapterComponent::bBreaksPropsBreaks Props。开
UCFVehicleAdapterComponent::EngineSoundProfile发动机的声音。留空则使用 Crushform Engine 中的默认值。空
UCFVehicleAdapterComponent::EngineSoundOffset发动机声音的播放位置,相对于拥有者的根部。零
UCFVehicleAdapterComponent::Wheels在 Details 面板中隐藏,且不起作用:车轮由移动组件提供。空
UCFVehicleAdapterComponent::GroundChannel隐藏且不起作用:接触点由移动组件提供。Visibility
UCFVehicleAdapterComponent::GroundProbeMargin隐藏且不起作用。2 厘米

每车调节值、撞击阈值和车厢数值的用法与车辆适配器页面中的相同。

  1. 按 Play 并驾驶车辆。然后打开控制台,运行 stat CrushformChaos。会出现 Chaos Adapter Wheel Contacts 和 Chaos Adapter Tyre Offsets 的耗时。
  2. 运行 Crushform.Stats。撞击后,你的车辆对应的那一行会显示大于 0 的 hits 计数。
  3. 驶过泥地条带。车轮会变脏,车轮下方的地面会显示飞溅效果。

控制台命令在除 Shipping 之外的所有构建以及编辑器中都可用。

日志提示拥有者不是 Chaos 轮式车辆,适配器报告没有车轮

Section titled “日志提示拥有者不是 Chaos 轮式车辆,适配器报告没有车轮”

原因。 Actor 不是带有 UChaosWheeledVehicleMovementComponent 的 AWheeledVehiclePawn。适配器找不到可供读取的移动组件。

修复。 将车辆的父类设为带有 Chaos 移动组件的轮式车辆 Pawn,如快速入门所要求的那样。只有对于不是 Chaos 车辆的 Actor,才使用通用的车辆适配器。

某个车轮没有轮胎形变,也没有车轮污垢

Section titled “某个车轮没有轮胎形变,也没有车轮污垢”

原因。 该车轮只是一个骨骼。适配器只在车辆网格上、位于该车轮骨骼处的网格组件中查找车轮网格,而这个车轮没有这样的网格组件。

修复。 将车轮的网格组件附着到车辆网格上,并以该车轮的骨骼作为插槽。

发动机停在怠速,读数也一直停在怠速

Section titled “发动机停在怠速,读数也一直停在怠速”

原因。 移动组件没有模拟发动机时,发动机转速读数为 0,声音就会以怠速播放。

修复。 检查车辆的发动机是否在模拟中运行,并确认发动机设置中有怠速和最高转速。

其他玩家的车听起来像是在滑行

Section titled “其他玩家的车听起来像是在滑行”

原因。 适配器读取的是本地驾驶员的油门和刹车踏板。在由其他端驾驶的车辆上,这些踏板读数为 0,因此发动机声音会停留在滑行音量。

修复。 这是 Chaos 适配器的预期行为。若要在远程车辆上听到负载,请在适配器的蓝图子类中覆盖 GetEngineLoad,并根据你自己车辆复制得到的油门值返回结果。