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

表面车轮与路面

车轮与路面

车轮下方的路面决定了车轮会做什么:它向车身抛出多少污垢,以及轮胎在上面发出什么声音、呈现什么样子。插件通过路面所用的物理材质找到每个车轮下方的地面,再在一张表中查找该材质。本页介绍这张表、车身读取的车轮,以及如何添加自己的地面。

Crushform
Surfaces7 Map elements
Index [ 0 ]
KeyPM_CF_Asphalt
Value
Dirt
Rolling SoundSW_CF_Tire_Asphalt_Loop
Rolling FXNS_CF_Rolling_Asphalt
Rolling FX Intensity Parameter
Index [ 1 ]
Index [ 2 ]
Index [ 3 ]
Index [ 4 ]
Index [ 5 ]
Index [ 6 ]
Default
DA_CF_Surfaces 的路面表:每个物理材质一行,第一行展开,显示滚动声音和特效。

你用于地面的每个物理材质,在路面表中都有一行。该行说明车轮在这种地面上会给车身多少污垢,播放哪种滚动声音,以及显示哪种滚动特效。随附资产 DA_CF_Surfaces 为插件自带的七种物理材质各提供了一行。

Proving Ground 上并排的五条地面路段,橙色地面上从左到右标注为 WATER、MUD、SNOW、DIRT 和 ASPHALT。
Proving Ground 的五条地面路段,从左到右依次为:WATER、MUD、SNOW、DIRT 和 ASPHALT。
  • 路面表。 UCFSurfaces 是一个数据资产。它的 Surfaces 映射保存每个物理材质的一行 FCFSurface;Default 行则用于没有对应行的地面,以及没有物理材质的悬空车轮。行中留空的字段保持为空,不会借用 Default 行的声音或特效。
  • 一行。 FCFSurface 有四个字段。Dirt 保存该地面给车身的灰尘、泥浆、积雪和湿润速率,以及它从车身上带走各种污垢的速率。Rolling Sound 是轮胎在其上发出的声音。Rolling FX 是一个 Niagara 系统。Rolling FX Intensity Parameter 指定接收强度的浮点参数名。留空时,使用项目中的 FXIntensityParameter。
  • 车轮。 车轮来自车辆。通用车辆适配器(UCFVehicleAdapterComponent)会追踪其 Wheels 列表中的车轮。每一项需要拥有者上的一个 Wheel 组件:车轮的网格体,或车轮绕其转动的场景组件(车轮位于骨骼上时即以此命名)。Radius 是轮胎半径,单位厘米;为 0 时,首次使用该列表时取网格体包围盒高度的一半。Ground Channel 是车轮追踪地面所用的通道,Ground Probe Margin 则让离地几厘米的轮胎仍然视为接触地面。车辆系统适配器(例如 Chaos 适配器)读取它自己的车轮,并忽略这个列表。
  • 车轮接触。 每一帧,拥有者的宿主会为每个车轮报告一个 FCFWheelContact:轮胎与地面的接触点、半径、表面速度、物理材质、是否着地,以及一个在车轮整个生命周期内保持不变的 WheelIndex。悬空车轮的接触点和材质不被读取。车辆适配器通过 Build Wheel Contacts 填充这些接触。其他 Actor 则自行实现 ICFWheelHost。没有宿主时,车身没有车轮,也永远不会变脏。
  • 读取车轮。 形变组件记录每个车轮所踩的路面。GetWheelSurface 返回车轮的当前状态,OnWheelSurfaceChanged 在车轮的物理材质或着地状态变化时触发。仅速度变化不会触发它。
  • 专用服务器。 车轮路面检查不在专用服务器上运行。
  1. 在 Content Browser 中选择 Add > Miscellaneous > Data Asset,选择类 CFSurfaces,并把资产命名为 DA_MyGame_Surfaces。
  2. 打开它,把 Default 设为所有没有自己一行的地面所用的行。
  3. 为每种地面在 Surfaces 中添加一项。以该地面的物理材质作为键,然后填写它的 Dirt 速率、Rolling Sound 和 Rolling FX。不需要的字段留空即可。
  4. 在 Project Settings > Plugins > Crushform 中,把 Surfaces 设为 DA_MyGame_Surfaces。
  5. 在车辆适配器上,为 Wheels 的每个车轮各填一项:选择它的 Wheel 组件并设置 Radius,或者把半径留为 0,让它从网格体取值。
  6. 在每种地面的材质上,于 Physical Material 下把 Phys Material 设为该地面的物理材质。核心概念页更详细地介绍了路面设置。

蓝图可以从形变组件读取车轮的路面。下方的蓝图在自定义事件 ReadWheelZero 触发时运行,读取 0 号车轮,并打印它是否着地。

当自定义事件 ReadWheelZero 触发时,蓝图运行,读取 0 号车轮并打印它是否着地。

在 C++ 中,读取车轮的路面,并在使用其材质之前检查它是否着地。该调用需要 Crushform 模块(CFDeformComponent.h),请把它加入模块 Build.cs 的 PublicDependencyModuleNames。

const FCFWheelSurface Surface = Deform->GetWheelSurface(0);
if (Surface.bGrounded && IsValid(Surface.PhysicalMaterial))
{
// The wheel stands on Surface.PhysicalMaterial.
}

不使用适配器的自定义车辆需要实现车轮宿主,并报告它的车轮。接口方法位于 Crushform 模块的 CFWheelHost.h 中,其签名如下:

void GatherCrushformWheelContacts_Implementation(TArray<FCFWheelContact>& OutContacts) const override;

每一帧都给每个车轮相同的 WheelIndex,并报告每一个车轮,无论它是否着地,这样离开地面的车轮也能被发现。

属性作用默认值
FCFSurface::Dirt该路面的污垢速率,即参考速度下每秒的数值:Dust、Mud、Snow、Wet,以及它们从车身上带走的量。每项速率均为 0
FCFSurface::RollingSound该路面上的滚动声音。None 表示该处没有滚动声音。None
FCFSurface::RollingFX该路面上的 Niagara 滚动特效。None 表示该处没有特效。None
FCFSurface::RollingFXIntensityParameter特效中接收强度的浮点参数。None,即使用 UCFWheelSettings::FXIntensityParameter
UCFSurfaces::Surfaces每个物理材质一行。类中为空;随附资产为七行
UCFSurfaces::Default没有对应行的地面,以及悬空车轮所用的行。所有字段为空的行
UCFSettings::Surfaces项目使用的路面资产。/Crushform/Surfaces/DA_CF_Surfaces
FCFAdapterWheel::Radius适配器列表中某车轮的轮胎半径,单位厘米。为 0 时取网格体包围盒高度的一半。0
UCFVehicleAdapterComponent::GroundChannel适配器车轮追踪地面所用的通道。ECC_Visibility
FCFWheelContact::bGrounded车轮是否接触地面。悬空的车轮不留下污垢。true
FCFWheelContact::WheelIndex车轮的索引,在其整个生命周期内保持稳定。INDEX_NONE 表示宿主不为车轮命名。INDEX_NONE

打开 DA_MyGame_Surfaces,检查它列出了你的各种地面以及 Default 行。然后运行 Lvl_ProvingGround,把轿车从 ASPHALT 路段开上 DIRT 路段。滚动声音会在新路面在车轮下保持住了 Surface Hold Time(默认 0.15 秒)后,平滑过渡到新的路面声音。

车轮一直无声,日志提示路面资产无法加载

Section titled “车轮一直无声,日志提示路面资产无法加载”

原因。 项目设置中的软引用指向了一个无法加载的资产。插件会记录一次日志,车轮保持无声:

Crushform surfaces %s do not load; wheels stay silent

修复。 在 Project Settings > Plugins > Crushform 中,把 Surfaces 设为一个存在的资产,例如 /Crushform/Surfaces/DA_CF_Surfaces。

原因。 Rolling Sound 为空,意味着该地面没有声音。该行不会借用 Default 行的声音。

修复。 在该行中设置 Rolling Sound。声音应当是循环资产:不循环的声音会被记录下来,并且会在重新开始播放之间断开。

原因。 地面的材质没有物理材质,或者它的物理材质在路面表中没有对应行。两种情况下,车轮都会使用 Default 行。

修复。 在地面材质上设置 Phys Material,并在路面表中为该物理材质添加一行。

原因。 宿主把车轮的 WheelIndex 设为 INDEX_NONE 时,该车轮永远不会被报告给 OnWheelSurfaceChanged。宿主只报告着地的车轮时,它也永远看不到车轮离地,因为除非宿主另行说明,车轮都被视为着地。

修复。 为每个车轮设置从 0 开始的 WheelIndex,并每帧报告所有车轮;车轮在空中时把 bGrounded 设为 false。