Files
netease-modsdk-wiki/docs/wiki/entities/render-controllers.md
2025-03-20 11:52:46 +08:00

310 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 渲染控制器
category: 基础
tags:
- beginner
mentions:
- SirLich
- MedicalJewel105
- Overload252
- ChibiMango
---
# 渲染控制器
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
渲染控制器是资源包中常被误解的部分。但您无需畏惧!您可以将渲染控制器视为逻辑包,它们接收来自资源包实体文件中的短名称定义,并决定这些资源在游戏中如何组合/分层/渲染。
## 定义短名称
渲染控制器基于资源包实体文件中的短名称定义运作。短名称是我们在资源包实体文件中定义的本地标识符,可供渲染控制器(及其他地方)调用。我们可以在实体中定义`geometry`(几何体)、`materials`(材质)和`textures`(纹理)等变量。
让我们看看蜘蛛资源包实体文件的简化版本:
::: code-group
```json [RP/entity/spider.json]
{
"format_version": "1.8.0",
"minecraft:client_entity": {
"description": {
"identifier": "minecraft:cave_spider",
"materials": {
"default": "spider",
"invisible": "spider_invisible"
},
"textures": {
"default": "textures/entity/spider/cave_spider"
},
"geometry": {
"default": "geometry.spider.v1.8"
},
"render_controllers": ["controller.render.spider"]
}
}
}
```
:::
此示例中创建了四个短名称定义:
- `default`(材质数组)
- `invisible`(材质数组)
- `default`(纹理数组)
- `default`(几何体数组)
您可以在每个数组中定义多个短名称如上方的材质示例。将短名称定义视为_导入_所需资源的操作。在此阶段您在定义实体要使用的纹理、几何体和材质。在渲染控制器阶段不会导入新内容而是使用已导入的资源来构建最终渲染的实体。
## 简单渲染控制器
一个基础渲染控制器示例如下:
::: code-group
```json [RP/render_controllers/cow.render.json]
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.cow": {
"geometry": "Geometry.default",
"materials": [
{
"*": "Material.default"
}
],
"textures": ["Texture.default"]
}
}
}
```
:::
该控制器从实体文件获取短名称定义并进行_渲染_。例如`"textures": [ "Texture.default"]`表达:"采用default纹理并应用于实体"。渲染控制器本身并不知晓default纹理的具体内容只是执行应用指令。
## 复用渲染控制器
由于渲染控制器基于短名称工作,您可以在所有实体中复用同一个渲染控制器。对于只含单一材质、单一纹理和单一几何体的简单实体,无需创建自定义渲染控制器。
例如上方示例的控制器用于`minecraft:cow`实体。若要在自定义包中使用此控制器,只需在实体文件中声明:`"render_controllers": [ "controller.render.cow" ]`。
:::warning 注意!
渲染控制器基于短名称工作。若使用牛的渲染控制器,必须提供其所需的短名称:
- `default`几何体
- `default`纹理
- `default`材质
:::
## 创建自定义渲染控制器
当我们需要更精细控制实体渲染时(如分层纹理、多重几何体、不同骨骼应用不同材质),可通过复制原版渲染控制器到`render_controllers`文件夹进行定制化修改。
## 纹理分层
通过纹理分层技术可为自定实体创建叠加纹理。基础思路是通过多个纹理的透明像素区域实现叠加显示。
假设一个**画框**实体框架固定但画面可变。虽然可以复制10个框架纹理并制作10幅画作但修改框架时需要改动所有文件。采用分层纹理方案时首先放置框架纹理再叠加画作纹理即可实现框架的集中管理。
### 通过渲染控制器实现
若对渲染控制器不熟悉,建议参考原版案例。例如含有多个纹理的`horse`实体具有典型参考价值。
#### 渲染控制器
::: code-group
```json [RP/render_controllers/controller.render.texture_layering.json]
{
"format_version": "1.10.0",
"render_controllers": {
"controller.render.texture_layering": {
"geometry": "Geometry.default",
"materials": [
{
"*": "Material.default"
}
],
"textures": [
// 你可以添加任意数量的图层,按从上到下的顺序叠加
"Texture.bottom_layer",
"Texture.top_layer"
]
}
}
}
```
:::
#### 实体配置
需要定义所有纹理并使用`villager_v2_masked`材质:
::: code-group
```json [RP/entity/my_entity.json]
"materials": {
"default": "villager_v2_masked"
},
"textures": {
"top_layer": "textures/top",
"bottom_layer": "textures/bottom"
// 在此添加更多纹理短名称定义
}
```
:::
### 动态变体分层
通过动态索引实现纹理切换能创造更灵活的效果:
#### 实体配置
定义多个顶部纹理以供索引:
::: code-group
```json [RP/entity/my_entity.json#description]
"textures": {
"top_1": "textures/top_1",
"top_2": "textures/top_2",
"top_3": "textures/top_3",
"bottom_layer": "textures/bottom"
}
```
:::
#### 渲染控制器
::: code-group
```json [RP/render_controllers/controller.render.wool_only]
{
"format_version": "1.10.0",
"render_controllers": {
"controller.render.wool_only": {
"arrays": {
"textures": {
"Array.top": [
"Texture.top_1",
"Texture.top_2",
"Texture.top_3"
]
}
},
"geometry": "Geometry.default",
"materials": [
{
"*": "Material.default"
}
],
"textures": [
"Texture.bottom", // 静态底层纹理
"Array.top[q.variant]" // 根据实体变体选择顶部纹理
]
}
}
}
```
:::
通过数组和`q.variant`查询可根据实体variant值动态选择顶部纹理。
#### 设置变体值
要使分层显示生效需在实体中设置variant组件
::: code-group
```json [BP/entities/my_entity.json#components]
"minecraft:variant": {
"value": 0
}
```
:::
注意组件参数采用零索引制,`0`对应第一个纹理,`1`和`2`对应后续纹理。
#### 动态更换纹理
如需在游戏中动态更换纹理,只需修改`variant`值。可通过组件组和事件系统实现此功能。
#### 动态分层进阶
通过添加更多纹理数组和使用虚拟组件dummy components作为索引可实现更复杂的动态分层效果。关于虚拟组件的详细信息请参阅[此文档](/wiki/entities/dummy-components)。
### 动态几何体切换
动态切换几何体的原理与纹理类似:
以下示例展示如何根据variant值切换不同几何体。注意几何体不可分层叠加因此不需要基础层定义但仍需使用`villager_v2_masked`材质。
::: code-group
```json [RP/render_controllers/controller.render.player.third_person.json]
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.player.third_person": {
"materials": [
{
"*": "Material.default"
}
],
"textures": [
"Texture.bottom",
"Array.top[q.variant]"
],
"arrays": {
"geometries": {
"Array.geo": [
"Geometry.default",
"Geometry.custom_1",
"Geometry.custom_2"
]
},
"textures": {
"Array.top": [
"Texture.bottom",
"Texture.top_1",
"Texture.top_2"
]
}
},
"geometry": "Array.geo[q.variant]"
}
}
}
```
:::
#### 实体配置
确保在实体文件中包含对应几何体变体:
::: code-group
```json
"geometry": {
"default": "geometry.entity.default",
"custom_1": "geometry.entity.custom_1",
"custom_2": "geometry.entity.custom_2"
}
```
:::
## 常见错误
在渲染控制器中:
- 可引用多个纹理但只能引用一个几何体(数组形式亦适用)
::: code-group
```json
"arrays": {
"textures": {
"array.skin": [],
"array.dress": []
},
"geometries": {
"array.geo": []
}
}
```
```json
"textures": [
"array.skin[q.variant]",
"array.dress[q.skin_id]"
],
"geometry": "array.geo[q.mark_variant]"
```
:::