声音
车包里写在 vehicles/<名字>.json 的 engine 和 sounds 节(格式见「车包」页),声音事件写在车包的 assets/<id>/sounds.json 里;不写就用 T15 的柴油机声音。下面用 Java 写法说明每种声音是什么:
java
.sounds(new VehicleType.EngineSounds(
MySounds.IDLE, MySounds.MID, MySounds.LOAD, MySounds.COAST, // 怠速、中速、加油、松油门:循环音
MySounds.CRANK, MySounds.START, MySounds.STOP, MySounds.KEY, // 起动机、起动、熄火、钥匙
null)) // 柴油机预热继电器的咔嗒声,汽油机写 null每个参数是一个声音(Java 里是 Supplier<SoundEvent>,用 DeferredRegister<SoundEvent> 注册;车包里是 "<车包>:<事件>")。循环音要能无缝循环,单声道。
转速阶梯(跑车推荐):有一组不同转速下的定转速录音时,用 EngineSounds.ladder。Vettura 按当前转速取相邻的两段交叉淡化,每段按自己的录音转速变调;踩油门用 on 一组,松油门滑行用 off 一组:
java
List<EngineSounds.Step> on = List.of(new EngineSounds.Step(MySounds.ON_1170, 1170), new EngineSounds.Step(MySounds.ON_1410, 1410), ...);
List<EngineSounds.Step> off = ...; // 同样的转速,收油录音
.sounds(EngineSounds.ladder(on, off, VetturaSounds.TRUCK_CRANK, MySounds.START, MySounds.STOP, VetturaSounds.TRUCK_KEY,
new double[]{-1.0, 0, 0.6})) // 发动机位置:前、右、上(米),中置发动机在驾驶室后面每段 2–4 秒、按升序排列,相邻两段的转速差不要超过 1.3 倍(变调太多会失真)。最低一段同时当怠速。
起动:起动机声(第三个参数)是一段循环,起动机转多久就播多久,最好用真实起动机录音里稳定转动的那一段。着车那一下有两种做法:录好的一段起动音(start),或者 start 写 null,在物理参数里设 startFlare,让引擎真的冲高再回落,声音直接由转速阶梯播出来(跑车推荐,和 BeamNG 的做法一样)。车包 JSON 里写 "start": null。

