渲染控制器

Render Controllers,是实体在资源包中的重要部分之一,定义了实体的渲染,与materials也有密不可分的关系。
渲染控制器的文件被存储在资源包根目录的render_controllers文件夹内


解释

最基本的渲染控制器:

{
  "format_version": "1.8.0",
  "render_controllers": {
    "controller.render.byh_entity": {
      "geometry": "Geometry.default",
      "materials": [ { "*": "Material.default" } ],
      "textures": [ "Texture.default" ]
    }
  }
}

“controller.render.byh_entity”即为该渲染控制器的标识符,注意,这与普通标识符的格式不一样
渲染控制器标识符格式大都为:controller.render.xxxx,前面是不可变的
接下来看标识符内的对象,分别是模型、材料、纹理(贴图)

  • 模型的定义:"geometry": "Geometry.default",这意味着要在该实体上渲染的模型是简称为“ default”的模型。
  • 材料定义了游戏中的渲染方式。可以在不同部位上渲染不同的材质。星号“*“可替换成部位骨骼的名称。星号本身是指所有骨骼。举例:如果是换成byh_,那么所有名称以此开头的骨骼都将使用此材料进行渲染。
  • 纹理(贴图)定义:"textures": "Texture.default":这意味着要在该实体上渲染的纹理是简称为“ default”的纹理。

不同纹理(贴图)实体

原版狐狸渲染控制器示例:

{
  "format_version": "1.8.0",
  "render_controllers": {
    "controller.render.fox": {
      "arrays": {
        "textures": {
          "Array.skins": [
            "Texture.red",
            "Texture.arctic"
          ]
        }
      },
      "geometry": "Geometry.default",
      "materials": [ { "*": "Material.default" } ],
      "textures": [ "Array.skins[query.variant]" ]
    }
  }
}

狐狸资源包entity定义内:

  "textures": {
    "red": "textures/entity/skele_yaklin",
    "arctic": "textures/entity/skele_yaklin_arctic"
  }

首先映入眼帘发现不同的地方是,在标识符内多了个一个名为“arrays”的对象,实际上这里键的名字是可自定义的。
arrays定义了该实体的不同纹理贴图,分别有redarctic
其中“red”为默认纹理,"arctic"为北极狐的纹理

  • “ Array.skins”同时包含“ Texture.red”和“ Texture.arctic”
  • “纹理”通常具有[ "Texture.default" ],但是这里却没有。因为,已经有[ "Array.skins[query.variant]" ]
    这是一段Molang,作用是查询实体的变种值,而变种值是在实体行为文件的组件组里就设置好了的
    "red": {
        "minecraft:variant": {
            "value": 0
        }
    },
    "arctic": {
        "minecraft:variant": {
            "value": 1
        }
    }

这样 结构或许就非常清晰了,带有不同变种值的组件组将会在该实体生成时被minecraft:entity_spawned事件触发到,然后会以设置好的几率来随机添加这些变种值的组件组中的任意一个。


骨骼的可见性

不说废话,直接上示例:
依旧是狐狸的

{
  "format_version": "1.8.0"A,
  "render_controllers": {
    "controller.render.fox": {
      "arrays": {
        "textures": {
          "Array.skins": [
            "Texture.red",
            "Texture.arctic"
          ]
        }
      },
      "geometry": "Geometry.default",

      "part_visibility": [
        { "leg*": "!query.is_sleeping" },
        { "head": "!query.is_sleeping" },
        { "head_sleeping": "query.is_sleeping" }
      ],

      "materials": [ { "*": "Material.default" } ],
      "textures": [ "Array.skins[query.variant]" ]
    }
  }
}

使用渲染控制器时,可以在“ part_visibility”数组中设置指定骨骼在指定条件下隐藏。
语法:

{"要隐藏的骨骼名字": "条件(Molang表达式)"}

示例:

{ "leg*": "!query.is_sleeping" }

!query.is_sleeping返回true,即狐狸没有睡觉的时候,所有以“leg”(腿)开头的骨骼都可见。如若返回false,即狐狸在睡觉,将会隐藏以“leg”开头的骨骼。