1. Wiki
  2. /动画
  3. /渲染控制器

渲染控制器

在 Minecraft Bedrock 中用渲染控制器选择生物的模型、材质和纹理:数组、纹理变种、part_visibility 和颜色。

动画让生物动起来,而渲染控制器决定生物用什么来绘制:哪个模型、哪张纹理、哪种材质。它还能隐藏模型的某些部分。在本指南中,我们的红宝石傀儡会有三种宝石颜色,还有一顶只在某些时候才戴的王冠。

渲染控制器放在资源包中。和动画一样,它只改变生物的外观。

文件一览

资源包
RP/
  entity/
    ruby_golem.entity.json
  render_controllers/
    ruby_golem.render_controllers.json
  textures/
    entity/
      ruby_golem/
        red.png
        pink.png
        dark.png

你真的需要它吗?

很多生物只有一个模型和一张皮肤。这种情况直接用原版控制器 controller.render.default 就行。它会绘制客户端实体中都叫 default 的几何体、纹理和材质,你不需要写任何文件。你的第一个自定义生物就是这么做的。

以下情况你需要自己的渲染控制器:

  • 生物有多张纹理可选,比如不同颜色或皮肤,
  • 生物会更换模型,比如被剪了毛的羊,
  • 模型的某些部分需要出现或消失,比如鞍或盔甲,
  • 生物需要被染上某种颜色。

简称来自客户端实体

渲染控制器从不使用文件路径。它使用你在客户端实体中起的简称,并在前面加上前缀:

在客户端实体中在渲染控制器中
"geometry": { "default": "geometry.wiki.ruby_golem" }geometry.default
"textures": { "red": "textures/entity/ruby_golem/red" }texture.red
"materials": { "default": "entity_alphatest" }material.default

所以 texture.red 的意思是“我在客户端实体中叫作 red 的那张纹理”。

第 1 步:最简单的控制器

渲染控制器文件放在 render_controllers 文件夹中:

RP/render_controllers/ruby_golem.render_controllers.json
{
  "format_version": "1.8.0",
  "render_controllers": {
    "controller.render.ruby_golem": {
      "geometry": "geometry.default",
      "materials": [{ "*": "material.default" }],
      "textures": ["texture.red"]
    }
  }
}

三个主要部分:

字段内容
geometry一个模型。是单个值,不是列表。
materials把骨骼和材质对应起来的列表。* 表示所有骨骼。
textures纹理列表。大多数生物只需要一张。

名称必须以 controller.render. 开头。然后在客户端实体中列出它:

RP/entity/ruby_golem.entity.json
"render_controllers": ["controller.render.ruby_golem"]

第 2 步:三种宝石颜色

现在进入有趣的部分。先在客户端实体中列出全部三张纹理:

RP/entity/ruby_golem.entity.json
"textures": {
  "red": "textures/entity/ruby_golem/red",
  "pink": "textures/entity/ruby_golem/pink",
  "dark": "textures/entity/ruby_golem/dark"
}

然后在渲染控制器中把它们放进一个数组,再用 Molang 选出一张:

RP/render_controllers/ruby_golem.render_controllers.json
{
  "format_version": "1.8.0",
  "render_controllers": {
    "controller.render.ruby_golem": {
      "arrays": {
        "textures": {
          "array.gem_colors": [
            "texture.red",
            "texture.pink",
            "texture.dark"
          ]
        }
      },
      "geometry": "geometry.default",
      "materials": [{ "*": "material.default" }],
      "textures": ["array.gem_colors[query.variant]"]
    }
  }
}

array.gem_colors[query.variant] 的意思是“从列表中取第 query.variant 项”。从 0 开始数,所以变种 0 是红色,1 是粉色,2 是深色。

query.variant 从哪里来?

来自行为包。minecraft:variant 组件在生物身上存一个数字,query.variant 读取它。这里每个傀儡在生成时随机选一种颜色:

BP/entities/ruby_golem.json(部分)
"component_groups": {
  "wiki:color_red": { "minecraft:variant": { "value": 0 } },
  "wiki:color_pink": { "minecraft:variant": { "value": 1 } },
  "wiki:color_dark": { "minecraft:variant": { "value": 2 } }
},
"events": {
  "minecraft:entity_spawned": {
    "randomize": [
      { "weight": 2, "add": { "component_groups": ["wiki:color_red"] } },
      { "weight": 1, "add": { "component_groups": ["wiki:color_pink"] } },
      { "weight": 1, "add": { "component_groups": ["wiki:color_dark"] } }
    ]
  }
}

红色的权重是 2,所以它出现的概率是其他每种颜色的两倍。

超出范围不会报错

如果数字比列表长度大,会从头绕回:在 3 项的列表中,数字 3 又会选到第 0 项。负数会选第 0 项。所以变种写错只会显示错误的颜色,不会崩溃。

模型和材质也能用数组

arrays 可以放三种列表。每个列表只能放一种东西:

arrays 中的键内容示例项
textures纹理texture.red
materials材质material.default
geometries模型geometry.default

并不总是需要数组。二选一的简单情况可以用 Molang 三元表达式:

不用数组选择模型
"geometry": "query.is_baby ? geometry.small : geometry.default"

第 3 步:隐藏和显示部件

part_visibility 用来开关骨骼。我们的傀儡有一根 crown 骨骼,只有被驯服时才显示:

RP/render_controllers/ruby_golem.render_controllers.json
"part_visibility": [
  { "*": true },
  { "crown": "query.is_tamed" }
]
  • 每个条目是一个骨骼名和一个值。true 或任何非 0 的值表示显示,false 或 0 表示隐藏。
  • 隐藏一根骨骼也会隐藏它的子骨骼。
  • 条目按顺序应用,后面的会覆盖前面的。这里先显示所有部分,再由查询决定王冠是否显示。
  • * 可以作通配符:"gem_*" 会匹配 gem_left、gem_right 等等。

materials 列表的规则相同:先用 { "*": ... } 设定全部骨骼,再在后面覆盖个别骨骼。

发光的核心
"materials": [
  { "*": "material.default" },
  { "core": "material.glow" }
]

要让它生效,glow 必须是客户端实体 materials 中的一个简称,并指向一个真正会发光的材质,比如 entity_emissive_alpha。

颜色和效果

渲染控制器还能改变颜色。以下都是可选的:

字段作用
color给生物染色。需要支持染色的材质。
overlay_color在整个生物上覆盖一层颜色,a 表示强度
is_hurt_color生物受伤时的闪烁颜色。原版是红色。
on_fire_color着火时的颜色
ignore_lighting设为 true 时以全亮度绘制生物,夜里也一样
uv_anim用 offset 和 scale 让纹理随时间滑动,做出流动效果

每种颜色都有 r、g、b 和 a,取值 0 到 1,而且每个都可以是 Molang:

喊叫时闪白光
"overlay_color": {
  "r": 1.0,
  "g": 1.0,
  "b": 1.0,
  "a": "variable.is_shouting ? 0.5 : 0.0"
}

多个控制器

客户端实体中的 render_controllers 是一个列表。每个控制器都会用自己的模型把生物绘制一遍,所以可以叠加使用。原版就用这种方式做盔甲或发光眼睛这类图层。

你还可以加一个条件,让某个控制器只在特定时候绘制:

RP/entity/ruby_golem.entity.json
"render_controllers": [
  "controller.render.ruby_golem",
  { "controller.render.ruby_golem_shine": "query.is_powered" }
]

出问题时

你看到的现象最可能的原因
生物看不见客户端实体中的渲染控制器名称拼错了,或文件不在 render_controllers 中
紫黑格子纹理简称或路径写错了,或路径以 .png 结尾
每个傀儡都是红色行为包从未设置 minecraft:variant,所以 query.variant 是 0
隐藏的部件仍然显示后面的 part_visibility 条目又把它打开了,比如放在最后的 *
染色没有效果材质不支持染色。试试为此设计的原版材质

更多帮助见故障排查。

下一步

动画: 指南

We use cookies to improve your experience and analyse site traffic. Learn more