User Tools

Site Tools


zh_cn:tutorial:colorprovider

提供颜色

有没有想过,草木和树叶如何根据生物群落而改变色调,或者皮革装甲如何具有看似无限的颜色模式? 与颜色提供者见面,后者可让您根据位置,NBT或块状态等属性对块和项目模型纹理进行色调和着色。

现有例子

首先,现有的哪些原版内容使用颜色提供程序? 一些示例包括:

  • 树叶
  • 皮革盔甲垂死
  • 红石线
  • 瓜类,甘蔗和睡莲等植物
  • 尖箭头

颜色提供程序功能强大,但是Mojang选择对混凝土,羊毛和玻璃等有色块坚持使用单独的纹理。 此时的主要用例是针对生物群落阴影块和对现有纹理的细微调整,例如带尖箭头的彩色末端。

颜色提供程序背后的概念很简单。 您向其注册块或项目,并在渲染该块或项目的模型时,颜色提供程序将色调调整应用于纹理的每一层。 两家提供商都可以访问模型的层,这意味着您可以分别对模型的每个部分进行色调设置,皮革盔甲和带尖头的箭头就是这种情况。 当您只想更改几个像素而不是整个纹理时,这很有用。

请记住,提供颜色是客户端机制。 确保将与其相关的所有代码放入客户端初始化程序中。

注册方块 Color Provider

要将块注册到块颜色提供程序,您需要使用Fabric的ColorProviderRegistry。 此类中有一个BLOCK和ITEM提供程序的实例,您可以调用register。 register方法接受您的颜色提供程序的一个实例,以及您要使用该提供程序进行着色的每个块的变量。

ColorProviderRegistry.BLOCK.register(new BlockColorProvider() {
        @Override
	public int getColor(BlockState state, ExtendedBlockView world, BlockPos pos, int layer) {
		return 0x3495eb;
	}
}, MY_BLOCK);

我们在这里所做的只是说:“Hi,MY_BLOCK应被着色为0x3495eb”,这是蓝色。 您具有BlockState,World和BlockPos上下文,这是您可以根据生物群系或位置更改颜色的方式。 最后的int是图层; 每个人都要求一种颜色,但是在这种情况下,我们总是返回蓝色。

该模型也很重要:这里的主要提示是您需要为要色调的模型的每个部分定义一个tintindex。 要查看此示例,请查看leaves.json,这是用于原版叶的基本模型。 这是用于我们的块的模型:

{
  "parent": "block/block",
  "textures": {
    "all": "block/white_concrete",
    "particle": "#all"
  },
  "elements": [
    {   "from": [ 0, 0, 0 ],
      "to": [ 16, 16, 16 ],
      "faces": {
        "down":  { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "down" },
        "up":    { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "up" },
        "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "north" },
        "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "south" },
        "west":  { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "west" },
        "east":  { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "east" }
      }
    }
  ]
}

在这种情况下,我们添加了一个单一的tintindex,它会出现在`layer`参数(第0层)中。

这是最终结果-请注意,原始模型使用了white_concrete纹理:

注册颜色提供物品

项目相似;区别在于提供的上下文。 您无需访问状态,世界或位置,而可以访问ItemStack

ColorProviderRegistry.ITEM.register((itemStack, layer) -> {
	return 0x3495eb;
}, COLORED_ITEM);

这将色相相同的方式为块库存量的项目。

局限性

使用颜色提供程序的一个关键问题是项目提供程序中缺少上下文。 这就是为什么原版草不会根据您站立的位置改变存货颜色的原因。 为了实现诸如块的颜色变体(混凝土,玻璃,羊毛等)之类的东西,建议您为每个版本简单地提供单独的纹理。

zh_cn/tutorial/colorprovider.txt · Last modified: 2019/12/19 05:49 by lightcolour