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

表面污垢

污垢

车辆驶过泥地时,它的下车身和轮拱会沾上泥浆;在沥青上行驶则保持干净。车轮起着主要作用:每个车轮把它所在路面能提供的污垢交给车身,车身会保留这些污垢,直到它们褪去或你把车洗干净。本页介绍四种污垢、它们如何附着在车身上,以及影响它们形态的设置。

插件自带轿车的前左侧视角,略微俯视,保险杠、轮拱、车门、后侧围和车轮上都有棕色污垢。
插件轿车车身和车轮上的污垢。

每个车轮行驶在路面上时,都会把污垢抛到它所属的车身上。插件为每个车身保存四种污垢:灰尘、泥浆、积雪和湿润。每种污垢都落在自己的形状里:灰尘沿车身向上喷溅,泥浆溅入轮拱和车轮后方,积雪则贴近地面,落在同样的位置。车身的漆面和车轮会绘制这些污垢,因此车身被覆盖得越多,外观变化越明显。

轿车驶上 MUD 车道时甩出泥浆。
  • 通道。 污垢图集的每个纹素为每种污垢保存一个值:灰尘在红色通道,泥浆在绿色通道,积雪在蓝色通道,湿润在 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),它记录每个纹素最后一次增加污垢的时间。出厂通道如下:
通道BlendZOrderFade Delay (s)Fade Duration (s)
灰尘Layer010120
泥浆Layer110120
积雪Layer21090
湿润Overlay3225
  • 烘焙顺序。 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 部分中绘制自己的外观。
  • 专用服务器。 专用服务器不绘制任何内容,因此不在车身上保留污垢,也不触发任何污垢事件。
  1. 在 Content Browser 中选择 Add > Miscellaneous > Data Asset,选择类 CFProfile,并把资产命名为 DA_MyVehicle_Profile。这是车身的形变配置文件,污垢形状保存在其中。
  2. 打开该配置文件,在 Dirt 下把 Dirt Scale 设为 1。四种形状从默认值开始:灰尘喷溅,泥浆和积雪抛入拱形与尾迹,湿润则以较轻的拱形喷溅。
  3. 在车辆的适配器组件上勾选 Dirt and Dents,并把 Deform Profile 设为该配置文件。Deform Profile 为空时,使用项目的默认配置文件。
  4. 检查路面表。在 Project Settings > Plugins > Crushform 中,Surfaces 默认指向 DA_CF_Surfaces。表中每一行都说明该地面能提供多少污垢(参见车轮与路面)。
  5. 驶过一条污垢路段,并按下文“验证是否生效”所述检查结果。

要清洗玩家击中的车身位置,请在形变组件上调用 Wash At,传入击中点和以厘米为单位的半径。下方的蓝图在自定义事件 WashNearMe 触发时运行,清洗 Actor 周围半径 150 厘米的圆形区域。

当自定义事件 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。

在 Proving Ground 上,把轿车从 ASPHALT 路段开上 DIRT 路段并停在上面。车身两侧和轮拱会在车轮碾过时沾上污垢。开回沥青路段后停下。灰尘和泥浆会在最后一次获得新鲜污垢 10 秒后开始消退,之后还需最多 120 秒才会完全消退,除非你先清洗过车身。

原因。 有三种情况会让车身保持干净。Surfaces 中没有路面资产时,任何车身都不会变脏。Dirt Scale 为 0 的配置文件没有污垢网格。专用服务器不绘制污垢。

修复。 把 Surfaces 设为包含你所用地面各行的路面资产。把配置文件的 Dirt Scale 设为大于 0 的值。请在监听服务器或客户端上测试,不要在专用服务器上测试。

原因。 车轮的沉积量随其路面速度增长,因此锁死不转的车轮不沉积任何东西。污垢速率全为 0 的行同样不提供任何污垢。物理材质没有对应行的车轮会使用 Default 行,悬空的车轮则一无所得。

修复。 让车轮滚动起来。为该地面物理材质所在的行设置污垢速率;对于没有对应行的地面,则在 Default 行中设置。

原因。 通道的 Fade Duration 为 0 时,它的污垢会一直保留,直到被洗掉。

修复。 在项目设置的 Dirt > Channels 下,把该通道的 Fade Duration 设为大于 0 的值,或者清洗车身。

原因。 顺序被烘焙在 MF_CF_Paint 和 MF_CF_DirtAmount 中,因此修改 Dirt Layer Order、Blend 或 ZOrder 后,只有两个函数都重建之后才会生效。只要其中任一函数在材质编辑器中打开,就不会重建,通知会说明这一点。

修复。 关闭 MF_CF_Paint 和 MF_CF_DirtAmount,在编辑器控制台中运行 Crushform.RebakeDirtOrder,然后保存这两个函数。该命令仅限编辑器使用。

原因。 该顺序读取污垢新鲜度图集。没有可用的 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 渲染目标;否则日志会指出它,并且退回状态保持不变。