表面污垢
污垢
车辆驶过泥地时,它的下车身和轮拱会沾上泥浆;在沥青上行驶则保持干净。车轮起着主要作用:每个车轮把它所在路面能提供的污垢交给车身,车身会保留这些污垢,直到它们褪去或你把车洗干净。本页介绍四种污垢、它们如何附着在车身上,以及影响它们形态的设置。
每个车轮行驶在路面上时,都会把污垢抛到它所属的车身上。插件为每个车身保存四种污垢:灰尘、泥浆、积雪和湿润。每种污垢都落在自己的形状里:灰尘沿车身向上喷溅,泥浆溅入轮拱和车轮后方,积雪则贴近地面,落在同样的位置。车身的漆面和车轮会绘制这些污垢,因此车身被覆盖得越多,外观变化越明显。
- 通道。 污垢图集的每个纹素为每种污垢保存一个值:灰尘在红色通道,泥浆在绿色通道,积雪在蓝色通道,湿润在 alpha 通道。
ECFDirtChannel列出这四个通道。 - 速率。 路面表中该路面的一行,为其上的每个车轮提供四个增益速率(
Dust、Mud、Snow、Wet),单位是参考速度下每秒的数值。车轮沿路面的速度相对 Dirt Reference Speed 越高,沉积得越多,但最多为速率的 Max Dirt Speed Scale 倍。静止在路面上的车轮不产生污垢,悬空的车轮同样不产生。 - 形状。 通道通过一种由三部分组成的形状到达车身:从地面升起的喷溅,绕每个车轴的拱形,以及每个车轮后方拖出的尾迹。权重为 0 的部分会被关闭。配置文件为每种污垢保存一个形状(
DustShape、MudShape、SnowShape和WetShape)。Dirt Scale 乘以每次沉积量;设为 0 则车身保持干净,且完全不建立污垢网格。 - 脱落。 路面的
Shed速率会把整个车身上的污垢去掉,取各车轮的平均值。 - 叠加。 每个通道要么是 Layer(加入叠层),要么是 Overlay(绘制在所有叠层之上)。叠层按各通道的 ZOrder 排列,ZOrder 最低的先绘制。开启 Most Recent on Top 后,最近增加污垢的那一层会位于最上面。这一顺序读取新鲜度图集(Dirt Fresh Atlas),它记录每个纹素最后一次增加污垢的时间。出厂通道如下:
| 通道 | Blend | ZOrder | Fade Delay (s) | Fade Duration (s) |
|---|---|---|---|---|
| 灰尘 | Layer | 0 | 10 | 120 |
| 泥浆 | Layer | 1 | 10 | 120 |
| 积雪 | Layer | 2 | 10 | 90 |
| 湿润 | Overlay | 3 | 2 | 25 |
- 烘焙顺序。
MF_CF_Paint和MF_CF_DirtAmount把叠层顺序保存为常量:Dirt Layer Order,以及每个通道的 Blend 和 ZOrder。在编辑器中修改其中任一项,两个函数会同时重建。重建结果不会自动保存,因此需要把两个函数都保存,顺序才会保留。Fade Delay、Fade Duration 和通道名称在游戏运行时读取,无需重建。 - 清除。 通道在最后一次获得新鲜污垢后等待 Fade Delay 秒,然后在 Fade Duration 秒内清除。时长为 0 则永久保留。
- 外观。
MF_CF_Paint在车身上绘制污垢,MF_CF_WheelDirt在车轮上绘制。两者都读取MPC_CF_Dirt,这是所有车辆共享的外观集合。项目也可以在 Project Settings 的 Look 部分中绘制自己的外观。 - 专用服务器。 专用服务器不绘制任何内容,因此不在车身上保留污垢,也不触发任何污垢事件。
- 在 Content Browser 中选择 Add > Miscellaneous > Data Asset,选择类 CFProfile,并把资产命名为 DA_MyVehicle_Profile。这是车身的形变配置文件,污垢形状保存在其中。
- 打开该配置文件,在 Dirt 下把 Dirt Scale 设为 1。四种形状从默认值开始:灰尘喷溅,泥浆和积雪抛入拱形与尾迹,湿润则以较轻的拱形喷溅。
- 在车辆的适配器组件上勾选 Dirt and Dents,并把 Deform Profile 设为该配置文件。Deform Profile 为空时,使用项目的默认配置文件。
- 检查路面表。在 Project Settings > Plugins > Crushform 中,Surfaces 默认指向
DA_CF_Surfaces。表中每一行都说明该地面能提供多少污垢(参见车轮与路面)。 - 驶过一条污垢路段,并按下文“验证是否生效”所述检查结果。
要清洗玩家击中的车身位置,请在形变组件上调用 Wash At,传入击中点和以厘米为单位的半径。下方的蓝图在自定义事件 WashNearMe 触发时运行,清洗 Actor 周围半径 150 厘米的圆形区域。
在 C++ 中,从适配器获取形变组件并调用 WashAt。GetDirtAt 按通道读取某一点的污垢。这些调用需要 Crushform 模块(CFDeformComponent.h)和 CrushformVehicle 模块(CFVehicleAdapterComponent.h),请把两者都加入模块 Build.cs 的 PublicDependencyModuleNames。
UCFDeformComponent* Deform = Adapter->GetDeform();Deform->WashAt(HitLocation, 150.f);const FCFDirtValues Here = Deform->GetDirtAt(HitLocation);WashAt 只在本机生效,因此需要在每个应当看到结果的端上调用它。Wash 清洗整个车身,且仅限权威端调用:它在服务器上运行,并同步到每个端。
| 属性 | 作用 | 默认值 |
|---|---|---|
UCFProfile::DirtScale | 乘以车身上的每次污垢沉积量。0 使车身保持干净,且不建立污垢网格。 | 1 |
UCFProfile::DustShape | 灰尘通道的喷溅、拱形和尾迹。其他种类各有自己的形状:MudShape、SnowShape、WetShape。 | 灰尘喷溅;泥浆有拱形和尾迹;积雪三者都有;湿润以较轻的拱形喷溅 |
UCFSettings::DirtReferenceSpeed | 路面速率按原值生效时的轮胎速度,单位 m/s。 | 8 |
UCFSettings::MaxDirtSpeedScale | 速度更快的轮胎最多把速率放大的倍数。 | 2 |
UCFSettings::DirtUpdateInterval | 同一车身两次污垢更新之间的秒数。 | 0.2 |
UCFSettings::DirtLayerOrder | 叠层按各通道的 ZOrder 排列,或让最近的污垢位于最上面。烘焙进污垢函数中。 | 固定 |
FCFDirtChannelSettings::FadeDelay | 没有新鲜污垢后,通道开始消退前的秒数。 | 10(湿润为 2) |
FCFDirtChannelSettings::FadeDuration | 满污垢消退所需的秒数。0 则永久保留。 | 120(积雪为 90,湿润为 25) |
UCFSettings::DirtEventInterval | 同一车身两次污垢变化事件之间的最短间隔,单位秒。 | 0.5 |
UCFSettings::DirtEventThreshold | 一侧的平均污垢必须变化多少(0 到 1),才会触发下一次事件。 | 0.02 |
UCFSettings::DirtAtlas | 保存污垢的渲染目标,每种污垢占一个通道。 | /Crushform/Atlas/RT_CF_DirtAtlas |
UCFSettings::DirtLook | 所有车辆共享的外观集合:DirtStrength、WetDarken、WetGloss 及颜色。 | /Crushform/Materials/MPC_CF_Dirt |
UCFSettings::Surfaces | 路面表。没有它,任何车身都不会变脏。 | /Crushform/Surfaces/DA_CF_Surfaces |
DirtStrength 至少为 0,0 表示任何地方都没有污垢。WetDarken 是湿润层下方内容所乘的系数,范围 0 到 1,1 表示不变暗。WetGloss 是湿润的漆面所损失的粗糙度比例,范围 0 到 1。
验证是否生效
Section titled “验证是否生效”在 Proving Ground 上,把轿车从 ASPHALT 路段开上 DIRT 路段并停在上面。车身两侧和轮拱会在车轮碾过时沾上污垢。开回沥青路段后停下。灰尘和泥浆会在最后一次获得新鲜污垢 10 秒后开始消退,之后还需最多 120 秒才会完全消退,除非你先清洗过车身。
车身上完全没有污垢
Section titled “车身上完全没有污垢”原因。 有三种情况会让车身保持干净。Surfaces 中没有路面资产时,任何车身都不会变脏。Dirt Scale 为 0 的配置文件没有污垢网格。专用服务器不绘制污垢。
修复。 把 Surfaces 设为包含你所用地面各行的路面资产。把配置文件的 Dirt Scale 设为大于 0 的值。请在监听服务器或客户端上测试,不要在专用服务器上测试。
地面不留下污垢
Section titled “地面不留下污垢”原因。 车轮的沉积量随其路面速度增长,因此锁死不转的车轮不沉积任何东西。污垢速率全为 0 的行同样不提供任何污垢。物理材质没有对应行的车轮会使用 Default 行,悬空的车轮则一无所得。
修复。 让车轮滚动起来。为该地面物理材质所在的行设置污垢速率;对于没有对应行的地面,则在 Default 行中设置。
污垢一直留在车身上
Section titled “污垢一直留在车身上”原因。 通道的 Fade Duration 为 0 时,它的污垢会一直保留,直到被洗掉。
修复。 在项目设置的 Dirt > Channels 下,把该通道的 Fade Duration 设为大于 0 的值,或者清洗车身。
叠层没有按我的新顺序排列
Section titled “叠层没有按我的新顺序排列”原因。 顺序被烘焙在 MF_CF_Paint 和 MF_CF_DirtAmount 中,因此修改 Dirt Layer Order、Blend 或 ZOrder 后,只有两个函数都重建之后才会生效。只要其中任一函数在材质编辑器中打开,就不会重建,通知会说明这一点。
修复。 关闭 MF_CF_Paint 和 MF_CF_DirtAmount,在编辑器控制台中运行 Crushform.RebakeDirtOrder,然后保存这两个函数。该命令仅限编辑器使用。
Most Recent on Top 退回到 Z Order
Section titled “Most Recent on Top 退回到 Z Order”原因。 该顺序读取污垢新鲜度图集。没有可用的 Dirt Fresh Atlas 时,它会退回到 Z Order,并且每个世界只记录一次日志:
No usable Crushform dirt fresh atlas (Project Settings > Plugins > Crushform > Dirt Fresh Atlas): %s keeps the freshness of its dirt but cannot show it, so on the body Most Recent On Top falls back to Z Order (the wheels keep ranking by freshness)修复。 把 Dirt Fresh Atlas 设为 /Crushform/Atlas/RT_CF_DirtFreshAtlas。替换的资产必须是与晶格图集尺寸相同的 RGBA8 渲染目标;否则日志会指出它,并且退回状态保持不变。
