表面车轮与路面
车轮与路面
车轮下方的路面决定了车轮会做什么:它向车身抛出多少污垢,以及轮胎在上面发出什么声音、呈现什么样子。插件通过路面所用的物理材质找到每个车轮下方的地面,再在一张表中查找该材质。本页介绍这张表、车身读取的车轮,以及如何添加自己的地面。
| Crushform | ||
|---|---|---|
| Surfaces | 7 Map elements | |
| Index [ 0 ] | ||
| Key | PM_CF_Asphalt | |
| Value | ||
| Dirt | ||
| Rolling Sound | SW_CF_Tire_Asphalt_Loop | |
| Rolling FX | NS_CF_Rolling_Asphalt | |
| Rolling FX Intensity Parameter | ||
| Index [ 1 ] | ||
| Index [ 2 ] | ||
| Index [ 3 ] | ||
| Index [ 4 ] | ||
| Index [ 5 ] | ||
| Index [ 6 ] | ||
| Default | ||
你用于地面的每个物理材质,在路面表中都有一行。该行说明车轮在这种地面上会给车身多少污垢,播放哪种滚动声音,以及显示哪种滚动特效。随附资产 DA_CF_Surfaces 为插件自带的七种物理材质各提供了一行。
- 路面表。
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在车轮的物理材质或着地状态变化时触发。仅速度变化不会触发它。 - 专用服务器。 车轮路面检查不在专用服务器上运行。
- 在 Content Browser 中选择 Add > Miscellaneous > Data Asset,选择类 CFSurfaces,并把资产命名为 DA_MyGame_Surfaces。
- 打开它,把 Default 设为所有没有自己一行的地面所用的行。
- 为每种地面在 Surfaces 中添加一项。以该地面的物理材质作为键,然后填写它的 Dirt 速率、Rolling Sound 和 Rolling FX。不需要的字段留空即可。
- 在 Project Settings > Plugins > Crushform 中,把 Surfaces 设为 DA_MyGame_Surfaces。
- 在车辆适配器上,为 Wheels 的每个车轮各填一项:选择它的 Wheel 组件并设置 Radius,或者把半径留为 0,让它从网格体取值。
- 在每种地面的材质上,于 Physical Material 下把 Phys Material 设为该地面的物理材质。核心概念页更详细地介绍了路面设置。
蓝图可以从形变组件读取车轮的路面。下方的蓝图在自定义事件 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 |
验证是否生效
Section titled “验证是否生效”打开 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。
某种地面有行,却没有声音
Section titled “某种地面有行,却没有声音”原因。 Rolling Sound 为空,意味着该地面没有声音。该行不会借用 Default 行的声音。
修复。 在该行中设置 Rolling Sound。声音应当是循环资产:不循环的声音会被记录下来,并且会在重新开始播放之间断开。
每种地面给出的污垢都一样
Section titled “每种地面给出的污垢都一样”原因。 地面的材质没有物理材质,或者它的物理材质在路面表中没有对应行。两种情况下,车轮都会使用 Default 行。
修复。 在地面材质上设置 Phys Material,并在路面表中为该物理材质添加一行。
车轮从不报告路面变化
Section titled “车轮从不报告路面变化”原因。 宿主把车轮的 WheelIndex 设为 INDEX_NONE 时,该车轮永远不会被报告给 OnWheelSurfaceChanged。宿主只报告着地的车轮时,它也永远看不到车轮离地,因为除非宿主另行说明,车轮都被视为着地。
修复。 为每个车轮设置从 0 开始的 WheelIndex,并每帧报告所有车轮;车轮在空中时把 bGrounded 设为 false。
