车包
车包是做车的主要方式:一个文件夹或 zip 压缩包,放进 <游戏目录>/vettura/packs/,不写代码、不编译模组。游戏启动时 Vettura 读取所有车包,里面的车出现在创造模式物品栏的「Vettura · 载具」里。
服务器和玩家要装同样的车包。进服务器时 Vettura 会对比双方的车包,缺少或版本不同会在聊天栏提示。
模板:制作工具包里的 examples/packs/example(白模双门跑车 example:whitebox_coupe)。复制整个文件夹、改名,就是一个新车包。
结构
mypack/ 文件夹,或者 mypack.zip(pack.json 在压缩包的根目录)
├─ pack.json
├─ vehicles/my_coupe.json 一辆车一个文件;车的 ID 是 mypack:my_coupe
├─ assets/mypack/
│ ├─ meshes/my_coupe*.vxmesh.json 导出脚本生成(见「导出与碰撞外壳」)
│ ├─ geo/my_coupe*.geo.json 导出脚本生成
│ ├─ textures/entity/vehicle/my_coupe*.png 图集(见「贴图」)
│ ├─ textures/item/my_coupe.png 生成器图标(可选,没有就显示 T15 的)
│ ├─ geo、meshes、textures/item 里的 my_coupe_key* 钥匙模型(可选,没有就用 T15 的钥匙)
│ ├─ sounds.json、sounds/ 自己的声音(可选)
│ └─ lang/zh_cn.json、lang/en_us.json 车名、钥匙名
└─ data/mypack/vehicle_hulls/my_coupe.bin 碰撞外壳(见「导出与碰撞外壳」)pack.json:
{"id": "mypack", "name": "My Pack", "version": "1.0.0", "author": "你的名字", "description": "一句话介绍"}id 只用小写字母、数字和下划线,它也是资源的命名空间(assets/<id>、data/<id>)。每次改了车包都要改 version,玩家和服务器才分得清是不是同一版。
vehicles/<名字>.json
| 节 | 内容 | 必填 |
|---|---|---|
format | 格式版本,现在是 1 | 否 |
physics | 物理参数,字段见「物理参数」页的表;没写的字段用 T15 的值 | 是 |
layout | 车身布局:车身盒子、座位、方向盘、车门、引擎盖、加油口,见「车身布局」页 | 是 |
engine | 引擎声音,见下文 | 否,默认 T15 的柴油机 |
sounds | {"handbrake": [拉起, 放下] 或 null, "shift": 声音或 null, "horn": 声音, "doors": [开门, 关门]} | 否,默认 T15 的 |
fuel | "diesel" 或 "petrol" | 否,默认柴油 |
keyless | true:一键启动,钥匙带在身上,按住启动键 | 否 |
paints | 出厂漆色:[{"id": "my_red", "main": "#A51616", "second": "#A51616"}, ...],至少两种 | 否,默认 T15 的漆色 |
hudPanes | 损伤界面上四块玻璃的位置(风挡、后窗、左窗、右窗) | 否 |
gauges screens fonts | 仪表:指针表的量程,液晶屏的画面 | 否 |
拼错的字段名、类型不对的值都会报错,报错写明是哪个文件的哪个字段,不会悄悄忽略。
单位:physics 和 Java 接口一样用米、千克、牛顿、秒、转/分,只有这几个换成了更好填的单位:maxSteer steerRate steerReturn slipPeak 用度,topSpeed fourWheelSpeed lowRangeSpeed 用 km/h,steerGrip 用 g。
碰撞形状 physics.hull:顶点列表 [x, y, z, x, y, z, ...](模型坐标),或者两个盒子拼的车形 {"box": [半宽, 车头 z, 车尾 z, 底, 腰线, 车厢半宽, 车厢前 z, 车厢后 z, 车顶]}。
布局:盒子写 [前0, 前1, 右0, 右1, 上0, 上1](米,车身坐标,每对从小到大);座位写 {"forward": -0.15, "right": -0.37},可以再加 cushion(坐垫高度)、yaw、look;第一个座位是驾驶座。
引擎声音,两种写法任选:
"engine": {"ladder": {"on": [[1170, "mypack:v10.on_1"], [1410, "mypack:v10.on_2"]], "off": [[1170, "mypack:v10.off_1"], [1410, "mypack:v10.off_2"]]},
"crank": "mypack:v10.starter", "start": null, "stop": "mypack:v10.stop", "at": [-1.0, 0, 0.6]}
"engine": {"idle": "...", "mid": "...", "load": "...", "coast": "...", "rpms": [770, 1830, 1830, 1300], "crank": "...", "start": "...", "stop": "..."}声音 ID 是 <车包 id>:<事件名>,事件写在车包的 assets/<id>/sounds.json 里,和资源包一样。每种声音的要求见「声音」页。
语言(assets/<id>/lang/zh_cn.json 和 en_us.json 一起写):entity.<id>.<名字> 车名(生成器也用它),item.<id>.<名字>_key 钥匙名,tooltip.<id>.vehicle_key.<名字> 钥匙说明,screen.vettura.vehicle_spawner.paint.<漆色 id> 漆色名。
检查、安装、分享
- 进游戏前先跑检查工具:
python tools/check_vehicle.py <车包文件夹> <名字>,把每条FAIL和WARN处理掉。 - 把文件夹放进
<游戏目录>/vettura/packs/(整合包是实例目录下的vettura/packs/),重启游戏。车包只在启动时读取。 - 有错误时,日志里写明是哪个车包、哪个文件、哪个字段,进存档后屏幕上也会提示;同一个车包里其他没问题的车照常加载。
- 分享时打成 zip:
python tools/make_pack_zip.py <车包文件夹>,生成<id>-<版本>.zip(pack.json在压缩包根目录,Blender 文件不打进去)。自己压缩的话,选中pack.json和vehicles、assets、data一起压,不要把外面那层文件夹压进去。 - 只分享你有权分发的模型、贴图和声音。

