插槽

插槽(slot)和 slotType 部分用于定义一个组件在车辆部件树中的安装位置。如果你想了解部件和组件系统的基础知识,可以阅读 组件/插槽系统简介

每个部件也有一个 slotType,用于标识该部件在车辆中的安装位置,并允许多个部件作为相互替代的选项。一个特殊的slotType是 main,它代表车辆的“根”组件。

slots 部分根据 slotType 定义了哪些组件是该组件的“子组件”。

你可以在 Slots 部分使用可选参数,把参数传递给所选部件中的所有部分(以及所有其子部件,只要值没有被覆盖)。这通常配合 nodeOffsetnodeMove 参数使用,它们能给节点、柔体和道具应用偏移效果,从而将安装在目标插槽中的部件整体移动一段距离。

插槽变量

0.32 版本开始,你可以通过 Slots 部分将变量 的值传递给某个插槽,这种机制称为插槽变量(Slot Variables)。

这些值会被传递给安装在该插槽中的零件以及其所有子零件。它们的作用方式与在调校菜单中设置的变量值相同,但用户无法编辑这些插槽变量。你也可以传递字符串值,并可以将其与其他字符串进行拼接,例如作为节点名称的前缀。布尔值同样适用,配合禁用修饰符 ,可以根据零件所在的插槽启用或禁用 Jbeam 的某些部分。

这种机制可以让零件更易于复用,无需创建多个仅有细微差异的零件变体,可以通过变量来控制这些差异。

0.38 版本中,对插槽变量机制进行扩展,加入了特殊的命名空间变量 。这两个特定变量名为 $prefix$suffix,用来简化语法。

插槽类型(SlotType)

必要参数

string/table
type
组件的插槽类型,或插槽类型列表
在几乎所有情况下,这将是一个与父组件插槽类型相同的字符串。不过,它也可以是一个表,指定该零件可以适配的多个插槽类型。

插槽(Slots)

必要参数

string
type
插槽的内部名称
该插槽中的部件应具有此值作为其 slotType
string
type
如果车辆配置文件中未定义部件时,默认加载的组件

string
type
type
default
部件选择器中显示的插槽名称

可选参数

boolean
type
如果启用,部件选择器/车库中将无法选择让插槽为空
dictionary
type
包含变量名(作为字典键)及其变量值(作为字典值)

变量名必须以 $ 符号开头。

示例用法:

["log_trailer_bolsters_R","log_trailer_bolsters_R","Rear Bolsters", {"variables": {"$bolster_offset":-0.39}}],

有两个特殊的命名空间变量,$prefix$suffix,在子部件中不需要显式引用即可生效,从而简化了语法。

常用传递参数

以下参数通常在 Slots 部分作为可选参数传递给节点(Nodes)、柔体(Flexbodies)和道具(Props)部分。这些参数会影响当前部件及其所有子部件,直到该值被重置为 0 为止。

下列参数名都可以加上一个单数字后缀(1-9)来决定顺序,例如:

"nodeRotate1": {"x": 0, "y": 0, "z": 45}
"nodeMove2": {"x": 0, "y": 0, "z": 0.2},
"nodeOffset3": {"x": 0.1, "y": 0, "z":0},
"nodeRotate4": {"x": 5, "y": 0, "z": 0}

带有较小顺序编号的操作会先执行。如果没有指定数字,则顺序与 0 相同。具有相同后缀的节点变换执行顺序为:nodeRotate、nodeOffset、nodeMove。如果父子插槽中出现相同后缀(或无后缀)的参数,则子插槽中的值会覆盖父插槽中的值。

节点变换为固有操作,这意味着平移和旋转均以之前已变换过的坐标系为基础。例如,"nodeRotate1": {"x": 0, "y": 0, "z": 45} 会让坐标系绕其 Z 轴旋转 45 度。随后,"nodeRotate2": {"x": 15, "y": 0, "z": 0} 则会让新坐标系再绕其 X 轴旋转 15 度。

dictionary
type
{“x”:0, “y”:0, “z”:0}
default
沿 YZ 轴偏移所有节点、柔体和道具,并以镜像方式沿 X 轴偏移节点、柔体和道具(单位:米)
大多数情况下可以与 nodeMove 互换。对于车轮等部件通常为必需,此时 X 偏移量会使每侧的节点、柔体和道具相对于中线等距地远离或靠近。对于柔体来说,其中心取决于 "pos" 参数在 X 轴上为 0(默认值)。也就是说,如果柔体未设置 pos 参数,nodeOffset 将不会正确工作。
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
沿 XYZ 轴偏移所有节点、柔体和道具(单位:米)
大多数情况下可以与 nodeOffset 互换。该修饰符会直接将节点、柔体和道具沿 X 轴向左或向右平移,而不是镜像式移动。

dictionary
type
{“x”:0, “y”:0, “z”:0, “px”:0, “py”:0, “pz”:0}
default
将所有节点、柔体和道具按照 XYZ 轴的 x, y, z 角度、绕中心点 px, py, pz 进行旋转

如果未定义旋转中心点,则旋转会以原点为中心。例如,\"nodeRotate\":{\"x\":-45, \"y\":0, \"z\":0} 的效果等同于 \"nodeRotate\":{\"x\":-45, \"y\":0, \"z\":0, \"px\":0, \"py\":0, \"pz\":0}

由于存在 万向节死锁(gimbal lock) 的问题,当需要绕多个轴旋转时,建议每次 nodeRotate 只指定一个轴的旋转。例如,不建议使用 {\"nodeRotate\":{\"x\":90, \"y\":45, \"z\":0}},而是应采用如下方式:{\"nodeRotate1\":{\"x\":90, \"y\":0, \"z\":0}, \"nodeRotate2\":{\"x\":0, \"y\":45, \"z\":0}}

简单示例

仅包含单一插槽、无修饰符的部件。

"autobello_spring_F": {
    "slotType":"autobello_spring_F",
    "slots":[
        ["type", "default", "description"],
        ["autobello_shock_F","autobello_shock_F", "Front Shocks"],
    ],
},

进阶示例

包含多个插槽类型的部件。

"semi_R_suspension_single_leaf": {
    "slotType" : ["us_semi_suspension_R_single","us_semi_suspension_R_tandem"],
},

使用了 nodeOffset 和 nodeMove 的车架 jbeam 示例。

"pickup_frame_ext":
{
    "slotType" :"pickup_frame",
    "slots":[
        ["type", "default", "description"],
        //行驶部件
        ["pickup_ABS","pickup_ABS", "防抱死制动系统"],
        ["pickup_ESC","", "电子稳定及牵引力控制"],
        ["pickup_fueltank","pickup_fueltank","油箱", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
        ["pickup_engine","pickup_engine_v8_4.5","发动机"],
        ["pickup_muffler_ext","pickup_muffler_ext","消音器"],
        ["pickup_suspension_R","pickup_axle_R","后悬架", {"nodeMove":{"x":0.0,"y":0.613,"z":0}}],
        ["pickup_suspension_F","pickup_IFS","前悬架"],
        ["pickup_driveshaft_R_ext","pickup_driveshaft_R_ext","后驱动轴"],
        ////车身部件
        ["pickup_radsupport", "pickup_radsupport", "水箱支架", {"nodeOffset":{"x":0.0,"y":0.0,  "z":0}}],
        ["pickup_bumper_F","pickup_bumper_F","前保险杠",           {"nodeOffset":{"x":0.0,"y":0.0,  "z":0}}],
        ["pickup_bumper_R","pickup_bumper_R","后保险杠",            {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
        ["pickup_body_ext","pickup_body_ext","车身",                   {"nodeOffset":{"x":0.0,"y":0.0,  "z":0}}],
        ["pickup_bed","pickup_bed","货箱",                              {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
        //杂项
        ["pickup_towhitch","","拖车钩", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
        ["pickup_sparetire","pickup_sparetire_6l","备胎", {"nodeOffset":{"x":0.0,"y":0.663,"z":0}}],
        ["linelock", "", "刹车线锁"],
        ["pickup_reversewarn", "", "倒车蜂鸣警报器"],
 
    ],
},

使用带有变量的 nodeOffset 以及核心插槽的悬挂部件示例。

"vivace_suspension_R": {
    "slotType" : "vivace_suspension_R",
    "slots": [
        ["type", "default", "description"],
        ["vivace_brake_R","vivace_brake_R", "后刹车"],
        //要更改基础轮距,请编辑表达式中的 trackoffset_R 偏移量。
        ["wheel_R_5","steelwheel_16a_16x7_R","后轮", {"nodeOffset":{"x":"$=$trackoffset_R+0.3", "y":1.338, "z":0.32}}],
        ["vivace_wheeldata_R","vivace_wheeldata_R", "后主轴", {"coreSlot":true}],
        ["vivace_spring_R","vivace_spring_R", "后弹簧"],
        ["vivace_shock_R","vivace_shock_R", "后减震器"],
    ],
},

传递插槽变量。

"slots": [
    ["type", "default", "description"],
    ["log_trailer_headache_rack","","防护架"],
    ["log_trailer_bolsters_F","log_trailer_bolsters_F","前加强杆"],
    ["log_trailer_bolsters_R","log_trailer_bolsters_R","后加强杆", {"variables": {"$bolster_offset":-0.39}}],
],

在被传递变量的部件中使用该插槽变量。

"log_trailer_bolsters_R": {
    "information":{
        "authors":"BeamNG",
        "name":"后加强杆",
        "value":500,
    },
    "slotType" : "log_trailer_bolsters_R",
    "flexbodies": [
         ["mesh", "[group]:", "nonFlexMaterials"],
         ["log_trailer_bolster_mount", ["log_trailer_frame"], [], {"pos":{"x":0,"y":5.14,"z":-0.22}}],
         ["log_trailer_bolster_mount", ["log_trailer_frame"], [], {"pos":{"x":0,"y":"$=8.425+$bolster_offset","z":-0.22}}],
         ["log_trailer_bolster", ["log_trailer_bolster_3"], [], {"pos":{"x":0,"y":5.14,"z":-0.22}}],
         ["log_trailer_bolster", ["log_trailer_bolster_4"], [], {"pos":{"x":0,"y":"$=8.425+$bolster_offset","z":-0.22}}],
    ],
},
上一次修订: 五月 19, 2026

还有其他问题?

加入我们的 Discord 服务器
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.