UID82897性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2021-7-23最后登录1970-1-1
| 本帖最后由 Cat_Anchor 于 2025-4-19 11:10 编辑
闲话:关于为什么这期教程隔了38天才发……
实际上我已经写到第32期(动态纹理)了,但我突然懒得每天把写好的教程发出来了,然后就莫名其妙地停了。不过我还要继续更新,不像某某说好的方块教程现在还没有出来。这几期的教程质量比较低,因为我想尽快使教程进入实体阶段。不过以后假期有时间了可能会重写(但是我不敢保证一定会)。
不管怎样,我会持续推送这个系列,直到第32期。目前还没有完结的打算,第32期以后我会讲解一些实战篇目,例如根据情境添加一些物品、方块和实体。以前我一直用理论层面写教程,第32期之后,我将会在实践中写。
好了,目前就是这样的更新计划。我不敢保证,但这个教程系列的总期数可能会达到 40。
如果以后 Mojang 开放了更多接口,例如新维度的接口和新状态效果的接口,我会在研究完之后在现有的基础上新出教程。
承接上一点,目前其实已经开放了一小部分的维度接口,可以在“行为包根目录/dimensions”下新建 overworld.json 然后输入特定代码来覆盖主世界维度的一些特性。但是以上功能仅仅可以实现数据驱动的主世界高度,而且限制很多。根据官方文档的说法,这个特性可能仅仅是为了创建一张虚空地图,或者让建筑党造很高的建筑,没别的用途。因此,我认为开放维度接口的可能性不大。关于状态效果,目前压根没有什么消息;更多的物品和方块接口更是遥遥无期。至于功能域,已经处于无人问津的地步了,那个特性自然也没有修复。 |
|
前言 | | 上期,我们学习了动画。由于上上期留下的疑问,今天我们来学习渲染控制器。 |  | 渲染控制器 | 打开资源包根目录,创建并打开 render_controllers 文件夹,这里用于存放渲染控制器。还要明确的是,如果是普通的实体,那么渲染控制器可以直接用 controller.render.default 来凑数。这个渲染控制器是内置的,十分方便。
下面来看这个默认的渲染控制器,了解最基本的模式。
- {
- "format_version": "1.8.0", // 格式版本。
- "render_controllers": { // 可以在一个文件中定义很多个渲染控制器,但是没什么人这么做。
- "controller.render.default": { // 这里的键 controller.render.default 是这个渲染控制器的 ID。
- "geometry": "Geometry.default", // 指定要渲染的模型—— default 模型
- "materials": [
- {
- "*": "Material.default" // 指定材料为 default 材料
- }
- ],
- "textures": [
- "Texture.default" // 指定纹理为 default 纹理
- ]
- }
- }
- }
复制代码
如果要有一些特殊的渲染,比如一个实体有不同的变种(variants),每个变种的纹理不一样,那就要用渲染控制器来控制每个变种到底该拥有什么纹理。
现在我放一段示例,让你们了解渲染控制器的结构。
- {
- "format_version": "1.8.0",
- "render_controllers": {
- "controller.render.bear": { // 一个渲染控制器。controller.render.bear是这个渲染控制器的ID。
- "arrays": { // 这里决定了纹理(或模型、材质)有多少种。
- "textures": {
- "Array.skins": [ // Array.可以替换成你想要的,比如 Bear. 这样的。
- "Texture.default", // 这里的 default 就是资源包根目录下 entity 文件夹下实体文件中的 default,那里指定了 default 指向的路径。
- "Texture.angry", // 这里的 angry 就是资源包根目录下 entity 文件夹下实体文件中的 angry,那里指定了 angry 指向的路径,下同。
- "Texture.sleep",
- "Texture.sheared",
- "Texture.honey",
- "Texture.berries"
- ]
- }
- },
- "geometry": "Geometry.default", // 决定了模型。
- "materials": [ // 决定了材料。
- {
- "*": "Material.default"
- }
- ],
- "textures": [
- "Array.skins[q.variant]" // 注意,这里的 [q.variant] 旨在查询实体的变种,根据返回的值,从上面的数组列表里找出对应的值去应用,如果上边将 Array. 改成了其他的,这里也要改。
- ]
- }
- }
- }
复制代码 这就是渲染控制器的示例文件。
渲染控制器还有一些其他字段,它们在每个渲染控制器的根目录下,与 textures materials geometry 等字段同级。以下是所有已知的字段。
part_visibility
指定模型的可见性。
- "part_visibility": [
- { "goggles_up": "!query.property('minecraft:can_move') || !query.has_player_rider" },
- { "goggles": "query.property('minecraft:can_move') && query.has_player_rider" }
- ]
复制代码
它是一个列表,列表中有若干个对象。每个对象中都有一个键值对,其中键是模型文件中定义的骨骼名称,值是用于决定那个骨骼是否渲染的 Molang 表达式。
goggles 是快乐恶魂挽具的护目镜,如果有玩家骑乘,护目镜就会放下,此时 goggles 骨骼显示而 goggles_up 骨骼消失。
query.property('minecraft:can_move') 是一个 Molang 查询函数。快乐恶魂有一个实体属性 minecraft:can_move,决定它是否可以自由移动。query.has_player_rider 也是 Molang 查询函数,返回是否有玩家骑乘它。&& 是逻辑与,两条件成立时成立。
- "part_visibility": [
- { "Saddle": "query.is_saddled" },
- { "Bit*": "query.is_saddled" },
- { "Bridle": "query.is_saddled" },
- { "Reins*" : "query.is_saddled && query.has_rider" },
- { "Bag*" : false },
- { "MuleEar*" : false}
- ]
复制代码
除此之外,我们可以使用通配符 * 指定骨骼名称。可见性也可以通过布尔值 true false 直接指定。
color
指定渲染的染色。
- "color": {
- "r": "variable.armor_texture_slot ? query.armor_color_slot(1, 0) : this",
- "g": "variable.armor_texture_slot ? query.armor_color_slot(1, 1) : this",
- "b": "variable.armor_texture_slot ? query.armor_color_slot(1, 2) : this",
- "a": "variable.armor_texture_slot ? query.armor_color_slot(1, 3) : this"
- }
复制代码
它是一个对象,有四个属性 r g b a,分别指定红色分量、绿色分量、蓝色分量和不透明度。值可以填写 Molang 表达式。每个值的范围都是 [0.0, 1.0]。
uv_anim
指定 UV 映射的动画。修改此项可以实现动态实体纹理。
- "uv_anim": {
- "offset": [
- "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0",
- "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0"
- ],
- "scale": [ 1.0, 1.0 ]
- }
复制代码
scale 是 UV 映射的缩放量。
offset 是一个数组,指定如何偏移 UV 映射。其中有两个值,指定 U 坐标的表达式和 V 坐标的表达式。这里,可以通过 query.life_time 获得一个随时间流逝而增加的值,其函数图像为标准的 y=x 图像。
以下是一个动态纹理的实现文件,适用于竖向排列的 64*16 的四帧纹理。
- {
- "format_version": "1.20.0",
- "render_controllers": {
- "controller.render.entity": {
- "geometry": "Geometry.default",
- "textures": ["Texture.default"],
- "materials": [
- {
- "*": "Material.default" // 注意,这里使用的材料需要在材料定义文件中启用 USE_UV_ANIM。
- }
- ],
- "uv_anim": {
- "scale": [1, 1],
- "offset": [0, "Math.mod(Math.floor(q.life_time * 10), 1)"]
- }
- }
- }
- }
复制代码
可以通过 Blockbench 的动态纹理功能生成此文件。
以下是启用了 USE_UV_ANIM 的材料。player_animated(推荐)conduit_wind(推荐)breeze_wind_chargebreeze_windexperience_orbentity_beambeacon_beamcharged_creeperplayer_spectator
建议使用前两个,不要使用后面那些,因为它们含有其他专为游戏特性设计的代码。
也可以考虑自定义一个材料,在资源包根目录 /materials/entity.material 中:
- {
- "materials": {
- "version": "1.0.0",
- "custom_material_name:entity_alphatest": {
- "+defines": [ "USE_UV_ANIM" ]
- }
- }
- }
复制代码
其中 custom_material_name 可以替换为其他名称,使用在实体客户端定义文件中。
ignore_lighting
指定是否忽略环境光照,需要一个布尔值。
light_color_multiplier
见于闪电苦力怕的渲染控制器文件中,用途未知。
- "light_color_multiplier": 0.5
复制代码
rebuild_animation_matrices
见于玩家的渲染控制器文件中,用途未知。
- "rebuild_animation_matrices": true
复制代码
overlay_color
指定覆盖的颜色,格式与 color 相同。
- "overlay_color": {
- "r": 1.0,
- "g": 1.0,
- "b": 1.0,
- "a": 1.0
- }
复制代码 |  | 总结
| | 这一期,我们简单学完了渲染控制器。在第 32 期,你还会看到关于渲染控制器的巧妙运用。下一期,我们就要讲声音了。 |
|
|