有时,你可能希望在游戏中对方块的外观进行特殊处理。 例如,某些方块可能是透明的,而以及某些方块则可能带有色调。
我们来看看如何操控方块的外观。
在本例中,我们先来注册一个方块。 如果你不熟悉这个过程,请先阅读有关方块注册的文档。
java
public static final Block WAXCAP_BLOCK = Registry.register(
BuiltInRegistries.BLOCK,
Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "waxcap"),
new Block(BlockBehaviour.Properties.of()
.noCollision()
.instabreak()
.offsetType(BlockBehaviour.OffsetType.XYZ)
.setId(WAXCAP_BLOCK_KEY)
));1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
请务必添加:
如果一切搞定,你应该能在游戏中看到这个方块。 但是,你会发现放置后,方块看起来不太对劲。

这是因为带有透明度的纹理需要一些额外的设置。
操纵方块外观
即使方块的纹理是透明或半透明的,它仍然会显示为不透明。 要解决这个问题,你需要设置方块的 子区块层。
子区块层是用于对不同类型的方块表面进行分组以进行渲染的类别。 这使得游戏能够针对每种类型使用正确的视觉效果和优化。
我们需要将方块注册到正确的子区块层。 原版游戏提供了以下选项。
SOLID:默认值,一个没有任何透明度的实心方块。CUTOUT和CUTOUT_MIPPED:使用透明度的方块,例如玻璃或花。CUTOUT_MIPPED在远处看起来效果更好。- TRANSLUCENT:使用半透明(部分透明)像素的方块,例如染色玻璃或水。
我们的示例带有透明度,因此将使用 CUTOUT。
在你的客户端初始化器中,使用 Fabric API 的 BlockRenderLayerMap 将方块注册到正确的 ChunkSectionLayer。
java
BlockRenderLayerMap.putBlock(ExampleModAppearance.WAXCAP_BLOCK, ChunkSectionLayer.CUTOUT);1
现在,你的方块应该具有合适的透明度了。

方块颜色提供者
虽然我们的方块在游戏中看起来不错,但它的纹理是灰度的。 我们可以动态地应用颜色色调,就像原版游戏中的树叶会根据生物群系变色一样。
Fabric API 提供了 ColorProviderRegistry 来注册一个色调颜色提供者,我们将使用它来动态地为方块着色。
我们使用这个 API 注册一个色调,这样当我们的 Waxcap 块放置在草地上时是绿色的,其他情况则是棕色的。
在你的客户端初始化器中,将你的代码块注册到 ColorProviderRegistry,并附上相应的逻辑。
java
ColorProviderRegistry.BLOCK.register((blockState, blockAndTintGetter, blockPos, i) -> {
if (blockAndTintGetter != null && blockPos != null) {
BlockState stateBelow = blockAndTintGetter.getBlockState(blockPos.below());
if (stateBelow.is(Blocks.GRASS_BLOCK)) {
return 0x98FB98; // Color code in hex format
}
}
return 0xFFDAB9; // Color code in hex format
}, ExampleModAppearance.WAXCAP_BLOCK);1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
现在,方块的颜色将根据其放置的位置而变化。


