入门核心概念
核心概念
Crushform 由几个协同工作的部分组成:一个把插件装到车辆上的适配器、一个使车身弯曲的晶格、一个调节弯曲方式的配置文件、一组绘制结果的材质,以及回答那些只有你的游戏才能回答的问题的宿主。本页按此顺序依次介绍它们。
车辆只需一个组件即可获得完整的插件。在 Chaos 轮式车辆上,使用 UCFChaosVehicleAdapterComponent:它从移动组件中读取车轮。在其他任何 Actor 上,使用 UCFVehicleAdapterComponent 并列出它的车轮。拖车使用通用适配器。它的车轮随其运动而转动,因此被拖着的拖车即使没有发动机也会扬起尘土。
适配器会在每个端上创建下表第一列名称下的组件。每个组件都由第三列中的开关控制。
| 名称 | 类 | 开关 | 作用 |
|---|---|---|---|
CF_Deform | UCFDeformComponent | Dirt and Dents | 车身的凹陷和污垢。 |
CF_Glass | UCFGlassUnitsComponent | Glass | 使玻璃板开裂并破碎。需要 Dirt and Dents,它借此找到玻璃板。 |
CF_PropContact | UCFPropContactComponent | Breaks Props | 破坏车辆撞上的可破坏道具。 |
CF_ImpactFeedback | UCFNetImpactFeedbackComponent | Impact Feedback | 撞击声音和特效,在每个端上播放。 |
CF_PartImpactFeedback | UCFPartImpactFeedbackComponent | Impact Feedback 且 Dirt and Dents | 铰接部件的声音和特效。 |
CF_Tires | UCFTireComponent | Tires | 轮胎在车轮网格体上发生形变:在载荷下被压扁,并包裹住它所压上的物体。 |
CF_RollingAudio | UCFRollingAudioComponent | Rolling Sound | 每个车轮的滚动声音,取自其下方的路面。 |
CF_RollingFX | UCFRollingFXComponent | Rolling FX | 每个车轮的滚动 FX,取自其下方的路面。 |
CF_EngineAudio | UCFEngineAudioComponent | Engine Sound | 发动机声音。Crushform Engine 设置中的 Engine Sound 开关也必须开启。 |
凹陷、玻璃、道具接触和撞击反馈会进行复制。每个组件都在每个端上以固定名称创建,因此客户端上的副本代表服务器上的组件。声音和特效只在有东西被渲染的地方运行,因此它们从不在专用服务器上运行。
UCFVehicleAdapterComponent::Authority 中的 Authority 决定由哪个端模拟车辆并判定其命中:
- Server:服务器模拟车辆,并且不接受客户端的命中上报。这是 Chaos 的标准设置。
- Owning Client:由操控车辆的玩家所在的端模拟车辆并上报其命中。当没有玩家操控车辆时,由服务器来做。服务器只在被上报的命中不超过车辆近期速度所允许的程度时才会采信,允许的程度为车辆近期速度加上 Ram Allowance Mps,然后该和再乘以最多约 2.2。这个倍数是为撞上较轻、会让步的车身预留的余量:这类撞击比同样速度变化量下撞墙,会从车辆身上带走更多能量,服务器需要把这一点考虑在内。
晶格与配置文件
Section titled “晶格与配置文件”游戏开始时,UCFDeformComponent 会在车身上铺设一个晶格节点网格,位于根组件的空间中。每个节点保存一个位移值和一个漆面磨损值。命中会以金属被压溃的方式推动节点:凹陷像手风琴一样从接触点向后延伸,并扩散到整个受击区域。在已发生形变的网格体上的物理接触,会成为模拟车身的那个端上的一次命中。滑动接触会磨损漆面。
晶格会使不是实例化的静态网格体以及拥有者的骨骼网格体发生弯曲。配置文件中的 Include Tags 和 Exclude Tags 按组件标签对它们进行过滤。晶格在 BeginPlay 时固定到根组件上,因此要排除所有相对车身会移动的部件,例如车门或方向盘。否则,这类部件将以其在 BeginPlay 时的姿态发生弯曲。
铰接部件,例如挂在 UCFHingeComponent 上的车门或引擎盖,在其凹陷超过摆动阈值后会绕铰链摆动。只有被压得足够严重时,它才会脱落。
损伤的形态由配置文件决定,即 UCFProfile 数据资产。创建一个配置文件并将其设置到组件上,可以在类的默认值中设置,也可以在 SpawnActorDeferred 和 FinishSpawning 之间设置。没有配置文件,组件就什么都不做。主要设置如下:
- Resolution(
UCFProfile::Resolution):每个轴上的晶格节点数。每个轴都是 4 的倍数。晶格会缩小以适配一个图集槽位,资产的校验会在它不得不缩小时报告一个错误,并给出游戏会将其钳制到的尺寸。 - Min Delta V:车身开始凹陷前的命中速度,单位 m/s。较轻的撞击不会使车身凹陷。
- Stiffness:每超过 Min Delta V 1 m/s 的速度,凹陷深度增加的厘米数。
- Max Displacement(
UCFProfile::MaxDisplacement):任意节点能移动的最远距离,单位 cm。车身材质必须将它用作 Max World Position Offset Displacement。 - Stiffness Zones(
UCFProfile::StiffnessZones):车身根组件空间中的盒体,在这些区域中车身比其余部分更硬或更软,例如车头的压溃软区,或保持形状的车厢。每个区域都有自己的 Stiffness。Crushform.ShowZones 1会绘制它们。 - Include Tags 和 Exclude Tags:会弯曲的网格体,如上所述。
- Dents:关闭时,命中和挤压从不会使车身凹陷或留下划痕。污垢仍然有效。
- Deform Collision:车身的碰撞会跟随其凹陷。每个盒体或凸体都会在被凹陷弯曲处切分为若干块。质量和惯性保持原值。
- Hinged Parts:关闭时,铰接部件从不摆动或脱落。它们会和其他面板一样随车身凹陷。
使用 Crushform.Debug 2 时,晶格会显示为节点以及节点之间的梁。
材质绘制损伤
Section titled “材质绘制损伤”车身的损伤由其材质绘制。所有受损的组件共用一个图集 RT_CF_LatticeAtlas(/Crushform/Atlas/RT_CF_LatticeAtlas),这是一个 RGBA8 渲染目标,尺寸为 1024 × 256 纹素。默认情况下,它包含 128 个槽位,每个槽位为 256 × 8 纹素。UCFRenderSubsystem 为每个受损组件分配一个槽位,并将该组件的晶格复制到其中。材质通过自定义基元数据找到它的槽位。插件从 Custom Data Offset 开始写入 18 个浮点数,该偏移默认为 0。更改它会重建烘焙它的材质函数:保存这些材质函数,或在编辑器中运行 Crushform.RebakeOffsets。
三个材质函数负责绘制车身和车轮:
MF_CF_Deform通过 World Position Offset 移动顶点,并转动法线。在缩短了金属的凹陷处,它还会产生褶皱。MF_CF_Paint磨损漆面并绘制划痕线。它位于你的漆面与 Base Color、Roughness、Metallic 之间,其磨损值和划痕线数据由MF_CF_Deform提供。MF_CF_WheelDirt绘制车轮上的污垢。
在每个应当弯曲的网格体的材质中,将 MF_CF_Deform 接到 World Position Offset 和 Normal。将 Max World Position Offset Displacement 设为不小于配置文件的 Max Displacement 加上材质的褶皱幅度,因为褶皱会使顶点移动到凹陷之外。没有损伤的组件没有槽位,其绘制效果与未安装插件时完全相同。当图集的槽位耗尽时,离玩家摄像机最远的受损 Actor 会以未受损的状态绘制,直到有槽位释放。
灰尘、泥浆、积雪和湿润由 MF_CF_Paint 和 MF_CF_WheelDirt 绘制,玻璃裂纹由 MF_CF_GlassCrack 绘制。每一种都有内置的外观。在 Project Settings › Plugins › Crushform › Look 中,你可以将 Body Dirt Look、Wheel Dirt Look 和 Glass Crack Look 指向你自己的材质函数。
车轮在地面上的表现取决于其下方的路面。路面就是一种物理材质。UCFSurfaces 为每种物理材质保存一行。它在 Project Settings › Plugins › Crushform › Surfaces 中指定,默认为 /Crushform/Surfaces/DA_CF_Surfaces。每一行说明该地面上的车轮会对其产生怎样的影响:
- Dirt:该路面每秒在参考速度下给车身施加的污垢,以及从车身上去除的污垢。
- Rolling Sound:轮胎在该路面上的滚动声音。
- Rolling FX:滚动 FX,一个 Niagara 系统。
- Rolling FX Intensity Parameter:特效中接收强度的 float 参数。为空时,特效使用
UCFWheelSettings::FXIntensityParameter。
空字段表示没有。没有 Rolling Sound 的行是静音的,它不会借用 Default 行的声音。没有对应行的材质,或者没有材质的车轮,会使用 Default 行。没有路面资产时,车身都不会变脏。
随附的资产为七种物理材质 PM_CF_Asphalt、PM_CF_Dirt、PM_CF_Grass、PM_CF_Mud、PM_CF_Swamp、PM_CF_Snow 和 PM_CF_Water 各提供一行,另有一行 Default。要使用其中之一,请在 Physical Material 下将地面材质的 Phys Material 设为该物理材质。要使用你自己的路面,请为其物理材质添加一行。
由谁决定损伤
Section titled “由谁决定损伤”每个车身都有一个决定其损伤的端,即模拟它的那个端。对于车辆,这由 Authority 决定。对于其他任何车身,宿主可以通过 ICFDeformHost 回答哪个端是撞击源。
- 服务器持有真正的晶格。它以 4 × 4 × 4 的块为单位发布晶格,每次网络更新发布一块,变化最大的先发。每个客户端都绘制它收到的块。
- 模拟该车身的客户端会立即应用自己的命中,作为预测。它将每次命中上报给服务器,并保留该命中,直到服务器发来的块确认它或服务器拒绝它为止。
- 服务器会拒绝任何超过配置文件 Max Plausible Delta V 的上报,即客户端可以上报的最猛烈的命中或滑动。
- 专用服务器会模拟并判定损伤,但它不绘制任何内容:没有污垢、没有声音,也没有特效。
组件会向其拥有者提出一些只有游戏才能回答的问题:哪个端模拟车身、哪些车轮接触地面、哪些网格体是车轮,以及轮胎位于何处。每组问题都是一个接口。在拥有者或其某个组件上实现它,可以用 C++ 或蓝图实现。你没有实现的蓝图事件,其回答与没有宿主时相同。
| 接口 | 提问者 | 回答内容 |
|---|---|---|
ICFDeformHost | UCFDeformComponent、撞击反馈 | 哪个端是撞击源,忽略的 Actor,上报是否合理,哪些网格体会发生形变,车轮网格体,玻璃板 |
ICFWheelHost | 污垢层、UCFRollingAudioComponent、UCFRollingFXComponent | 本帧车轮的一份列表:位置、半径、速度、物理材质、是否接触地面 |
ICFBreakerHost | UCFPropContactComponent | 本机是否模拟车身,接触的刚体,上报路径,被破坏单元所凹陷的组件 |
ICFTireHost | UCFTireComponent | 车轮,写回的偏移量和推挤量,接触载荷比,车辆组合 |
ICFTireViewer | 轮胎预算 | 在 Pawn 上:玩家乘坐的是哪辆车 |
ICFEngineHost | UCFEngineAudioComponent | 发动机是否关闭、启动中或运行中,其转速、怠速与最高转速,以及油门 |
组件按以下顺序查找其宿主:
- 显式宿主,在 BeginPlay 之前用
SetCrushformHost设置。 - 在世界子系统
UCFHostRegistry中为拥有者注册的对象。 - 拥有者本身,当它实现了该接口时。
- 没有宿主。
适配器会将自己注册为其拥有者在形变、车轮、破坏、轮胎和发动机接口上的宿主。带有显式宿主的形变组件会为拥有者注册该宿主,因此拥有者的其他组件会找到同一个宿主。未实现该接口的宿主会被拒绝,并报错。同一 Actor 的同一接口若设置第二个宿主,会替换第一个,并给出警告。
C++ 宿主会被直接调用。蓝图宿主只会运行它实现为脚本的事件。要将你自己的车辆接入插件,请参见自定义车辆。
设置类位于 Project Settings › Plugins 下,每个都以其显示名称列出:
| 分区 | 类 | 包含内容 |
|---|---|---|
| Crushform | UCFSettings | Atlas(渲染目标和槽位尺寸)、Network(客户端上报的限制)、Contact(什么算作新的接触)、Repair、Surfaces、默认配置文件、Dirt、Look、Loose Parts(铰接部件如何摆动以及如何脱落)和 Collision(何时重建凹陷车身的碰撞)。 |
| Crushform Wheels | UCFWheelSettings | Rolling Sound(开关、衰减、声音类、调节以及车厢参数)和 Rolling FX(开关、强度参数以及 FX 调节)。 |
| Crushform Tire | UCFTireSettings | Budget(哪些轮胎会形变,以及对此的限制)、Sleep(静止的车轮何时休眠)、Tracing(轮胎地面追踪忽略的通道)以及默认轮胎配置文件。 |
| Crushform Engine | UCFEngineSettings | Engine Sound:开关、默认配置文件、声音类、优先级以及车厢参数。 |
| Crushform Impact Feedback | UCFImpactFeedbackSettings | Default Set 的声音和特效,以及 Breakable Host 开关。 |
| Crushform Breakable | UCFBreakableSettings | Debris 的限制和碰撞,以及被破坏道具的重生。 |
| Crushform Zone Editor | UCFEditorSettings | Zone Editor 的区域预设(保存到 DefaultEditor.ini)。 |
检查是否正常工作
Section titled “检查是否正常工作”在除 Shipping 之外的任何构建中,用波浪号键打开控制台并运行以下命令。
Crushform.Stats输出正在使用的图集槽位,以及世界中每个可受损 Actor 的计数器。它在除 Shipping 之外的所有构建中都可用。Crushform.Debug 2绘制移动网格体的晶格节点,以及节点之间的梁。Crushform.Debug 1只绘制受损的节点。最近的命中显示为蓝色球体。Crushform.ShowZones 1将刚度区域绘制为盒体,颜色从表示柔软的蓝色经绿色过渡到表示坚硬的红色。
Crushform.Debug 和 Crushform.ShowZones 是作弊指令,因此它们在除 Shipping 之外的所有构建以及编辑器中都可用。

