- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
MCreator 的流体(Fluid)元素提供"着色类型"(Tint Type)选项,可让自定义液体像原版的草、树叶和水一样,根据所处生物群系动态改变渲染颜色。本文以 德语帮助文档(及同源 英文默认文档)为骨架,结合仓库中流体元素的数据模型、GUI 定义与 NeoForge 代码生成模板,完整讲解着色类型的全部可选值、底层颜色计算逻辑、灰度纹理最佳实践,以及它对自动生成纹理的影响。读完本文,你将能精准配置出"随生物群系变色"的液体,并理解生成代码中每个选项背后的实际取值来源。
一、什么是流体着色类型
在 MCreator 中创建流体元素时,"着色类型"决定引擎对流体纹理施加何种色调(tint)。其核心行为是:
该选项会基于生物群系颜色(biome colors)对流体应用着色,效果与原版中草、树叶、水随生物群系变色的机制相同。
这意味着,当你把流体设置成"草"或"水"着色类型后,同一种液体在森林、平原、沙漠等不同生物群系中会呈现出不同的颜色——不是美术贴图不同,而是运行时由着色器根据当前位置的生物群系数据实时叠加颜色。
从数据模型看,该属性定义在 Fluid.java 中,通过@LimitedOptions注解限定为一组固定枚举值,并通过isFluidTinted()方法(return !"No tint".equals(tintType),见 Fluid.java)判断该流体是否启用了着色。默认值为"No tint"(不着色),即新创建的流体默认不启用该功能。
二、可用的着色类型及适用场景
根据 Fluid.java 中@LimitedOptions的声明,流体着色类型共有以下 11 个可选值:
| 可选值 | 效果说明 | 参考对象 |
|---|---|---|
No tint | 不着色,使用纹理原始颜色 | 默认值 |
Grass | 使用生物群系的草颜色 | 草方块 |
Foliage | 使用生物群系的树叶颜色 | 树叶 |
Dry foliage | 使用干燥植物/枯叶颜色 | 干草丛 |
Birch foliage | 使用固定白桦树叶颜色 | 白桦树 |
Spruce foliage | 使用固定云杉(常绿)树叶颜色 | 云杉树 |
Default foliage | 使用默认树叶颜色 | 橡树树叶 |
Water | 使用生物群系的水体颜色 | 原版水 |
Sky | 使用生物群系的天空颜色 | 天空 |
Fog | 使用生物群系的雾颜色 | 雾 |
Water fog | 使用生物群系的水下雾颜色 | 水下雾 |
其中Grass、Foliage、Water属于"随生物群系动态变化"的类型(适合表现自然水体);Birch foliage、Spruce foliage、Default foliage属于固定颜色类型(结果稳定,不随群系变化);Sky、Fog、Water fog则把流体颜色与当前群系的天空/雾色绑定,可用于制作具有环境氛围感的特殊液体。
值得一提的是,这一套枚举并非流体独有——Block.java 与 Plant.java 中定义了完全相同的着色类型集合,因此你可以在方块、植物、流体之间保持一致的着色风格。
三、在 GUI 中配置着色类型
在流体元素的编辑界面中,"着色类型"以下拉框形式出现在渲染设置区域。相关实现位于 FluidGUI.java:
- 下拉框组件由
ComponentFromAnnotation.options(Fluid.class, "tintType")自动创建(FluidGUI.java),直接读取上文Fluid类中@LimitedOptions注解声明的枚举值; - 加载元素时调用
tintType.setSelectedItem(fluid.tintType)回显已保存的值(FluidGUI.java); - 保存元素时通过
fluid.tintType = (String) tintType.getSelectedItem()写回数据模型(FluidGUI.java)。
在简体中文界面中,该控件显示为"着色类型:",对应的本地化文案定义于 texts_zh_CN.properties。操作路径为:新建或打开"Fluid"元素 → 在渲染设置分组中找到"着色类型"下拉框 → 从 11 个候选中选择一项 → 保存并生成代码。
四、生成代码的底层原理:getTintColor 双方法
启用任意非No tint着色类型后,MCreator 的代码生成器会在流体类型(FluidType)客户端扩展中生成两个getTintColor方法,二者共同完成"静态底色 + 动态群系色"的渲染控制。以 NeoForge 1.21.1 生成器模板 fluidtype.java.ftl 为例:
**第一个方法(无参)**返回一个固定的 ARGB 颜色值,作为流体渲染的静态色调。生成逻辑如下(#if data.tintType == ...条件分支):
| 着色类型 | 生成的静态颜色值 |
|---|---|
Grass | -6506636 |
Foliage/Default foliage | -12012264 |
Birch foliage | -8345771 |
Spruce foliage | -10380959 |
Dry foliage | 10710342(1.21.1 无此类型,改用常量替代) |
Water | -13083194 |
Sky | -8214273 |
Fog | -4138753 |
其他(含Water fog) | -16448205 |
**第二个方法(带FluidState state, BlockAndTintGetter world, BlockPos pos参数)**则逐位置查询生物群系数据,实现真正的"随群系变色":
Grass→BiomeColors.getAverageGrassColor(world, pos)Foliage→BiomeColors.getAverageFoliageColor(world, pos)Default foliage→FoliageColor.getDefaultColor()Birch foliage→FoliageColor.getBirchColor()Spruce foliage→FoliageColor.getEvergreenColor()Dry foliage→ 常量10710342(模板注释明确说明"该着色类型在 1.21.1 中不存在,使用常量值代替")Water→BiomeColors.getAverageWaterColor(world, pos)Sky→Minecraft.getInstance().level.getBiome(pos).value().getSkyColor()Fog→Minecraft.getInstance().level.getBiome(pos).value().getFogColor()Water fog(模板中的else分支)→Minecraft.getInstance().level.getBiome(pos).value().getWaterFogColor()
所有动态颜色最终通过| 0xFF000000强制补齐不透明 alpha 通道,保证着色后的液体不会出现半透明色带异常。
版本差异提示:在较新的 NeoForge 26.3.x 生成器模板 fluidtype_client.java.ftl 中,实现改为直接使用BiomeColors.getAverageDryFoliageColor(world, pos)与FoliageColor.FOLIAGE_DEFAULT、FOLIAGE_BIRCH、FOLIAGE_EVERGREEN等常量,Dry foliage在 26.3.x 中已拥有专属的生物群系颜色 API,无需再使用常量替代。
从模板外层还能看到:只有当data.isFluidTinted()为真时,整个getTintColor相关代码块才会被生成(fluidtype.java.ftl);而isFluidTinted()又通过extendsFluidAttributes()联动控制流体属性扩展逻辑(Fluid.java)。因此,选择No tint的流体生成代码更精简,运行时也省去了逐方块的颜色查询开销。
五、最佳实践:使用灰度纹理
原文档特别强调:为获得最佳效果,流体应使用灰度(grayscale)纹理。
这是 Minecraft 生物群系着色机制的内在要求。着色器的工作方式是"纹理颜色 × 着色颜色"的乘法混合:若纹理本身已经带有明显颜色,乘以群系色后会产生难以预料的色偏;而灰度纹理只携带明暗信息(白色为最亮、黑色为最暗),再与生物群系颜色相乘,就能得到"明暗细节保留、色相完全受控"的理想效果——这与你为草方块、树叶准备灰度贴图再交给群系着色的做法完全一致。
实操建议:
- 在像素画编辑器中把流体的"静态纹理"(Still Texture)与"流动纹理"(Flowing Texture)绘制为灰度图,只保留亮度层次(如深浅不一的水波纹、气泡等);
- 随后在"着色类型"中选择目标群系色(如
Water表现海洋、Grass表现绿色液体); - 若希望液体在任意群系都呈现完全一致的颜色,则保留
No tint并直接在纹理中绘制最终颜色。
六、着色类型对自动生成纹理的影响
原文档同时指出:着色类型也会影响自动生成的桶(bucket)纹理。
从源码可以印证这一联动关系。MCreator 在 MinecraftImageGenerator.java 中通过generateFluidBucketIcon(ImageIcon fluid)自动生成流体桶的图标:先将流体纹理缩放裁剪为 32×32,再与bucket_mask遮罩做透明度蒙版,最后叠加在bucket_base桶底座之上,得到最终桶图标。同时,流体元素的预览图也直接取自静态纹理(ImageUtils.resizeAndCrop(textureStill.getImage(TextureType.BLOCK), 32),见 Fluid.java)。
因此,虽然着色本身发生在运行时渲染阶段,但当你切换着色类型时,MCreator 会在生成工作区资源时重新计算与流体外观相关的自动生成纹理,确保方块预览、桶图标与游戏内最终渲染效果保持一致。建议在切换着色类型后重新生成并检查桶图标,确认其在对应生物群系中的观感符合预期。
七、使用要点与常见陷阱
- 默认不着色:新流体默认
No tint,需要主动选择其他类型才能获得群系变色效果; - 颜色来源分清:
Grass/Foliage/Water是动态群系色,Birch / Spruce / Default foliage是固定常量色,Sky / Fog / Water fog绑定环境色——按表现需求而非名称直觉选择; - 纹理灰度化:启用着色前务必检查纹理是否为灰度图,否则容易出现颜色脏污或不可控偏色;
- 版本兼容:
Dry foliage在 1.21.1 生成器中以常量值替代(生成代码与 fluidtype.java.ftl 注释一致),而在 26.3.x 中已支持原生群系颜色 API; - 与方块/植物一致:流体、方块、植物共享同一套着色类型枚举,可通过统一设置让液体与其"容器"方块(如水池)的着色风格保持一致。
通过合理组合"着色类型 + 灰度纹理",你可以在不改动任何贴图的情况下,让自定义液体像原版水与草一样自然地融入 MCreator 生成的任意生物群系世界。
- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
相关推荐
MCreator 方块着色选项 tintType:基于生物群系颜色着色的原理与源码实现解析
MCreator 方块着色选项 tintType:基于生物群系颜色着色的原理与源码实现解析 本文围绕 MCreator 中方块编辑器内的 tint_type 选
低代码代码生成桌面应用游戏开发MCreator 基岩版方块着色方式(Tint Method)完全指南:利用生物群系色彩让方块自然融入世界
MCreator 基岩版方块着色方式(Tint Method)完全指南:利用生物群系色彩让方块自然融入世界 导读 在 MCreator 中制作 Minecraf
低代码代码生成桌面应用游戏开发MCreator 方块物品染色(Item Tint)功能详解:原理、配置与代码生成全流程
MCreator 方块物品染色(Item Tint)功能详解:原理、配置与代码生成全流程 MCreator 是一款用于制作 Minecraft Java 版模组
低代码代码生成桌面应用游戏开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考