方块碰撞箱与半透明材质

我们知道,栅栏实际高度是1.5格。我们也知道,蓝冰的材质是半透明的。那么这是怎么实现的呢?

方块碰撞箱

方块碰撞箱分为4种,分别需要覆写的方法有:getShape()getCollisionShape()getRenderShape()getRaytraceShape()

这些方法都需要返回一个VoxelShape

方块碰撞箱不只是简单的一个立方体,还有类似于楼梯、炼药锅等的不规则形状。这些可以通过将两个VoxelShape相互加减来实现。具体可以参阅这篇文章

getShape()

这个方法的返回值决定了当准星指向方块时出现的黑色框线的形状,即默认的碰撞箱,这个没有什么好讲的。

但如果该方块未指定其它三种类型的碰撞箱,则默认使用该方法的返回值。

getCollisionShape()

这个方法用于指定方块与实体“碰撞”的碰撞箱。例如栅栏,当用准星指向该方块时,仅出现一格高的黑色框线,但它的CollisionShape却是1.5格高,阻止了玩家跳过

getRenderShape()

这个方法用于渲染相关,用于阴影的渲染等。大多数方块的RenderShape与它的默认碰撞箱相同,但头颅、栅栏等却有所不同

getRaytraceShape

这个方法与算法有关。一般,当玩家与方块互动、挖掘方块时,Minecraft一般都要获取玩家查看的方块的面(如东、上、西等)。如果是类似于漏斗、炼药锅等,获取方块的面就比较麻烦,因此需要使用RaytraceShape

半透明材质与RenderType

如果读者尝试创建纹理带有孔或者半透明材质的方块,就会发现游戏中方块的材质并不是读者所想的那样。纹理的带孔部分会被渲染为黑色,而半透明材质也是差不多的结果。

这是为什么呢?如果所有的方块,Minecraft都以半透明材质的形式渲染,那渲染成本将会大大提高。因此,Minecraft引入了RenderType。方块默认的RenderType都是SOILD,即完全不透明。

四种RenderType

RenderType一共有四种:

  • SOILD——完全不透明。
  • CUTOUT——纹理带有孔。
  • CUTOUT_MIPPED——纹理带有孔,且开启了mip映射 (这是一种改善纹理外观、节约系统资源的技术)。
  • TRANSLUCENT——半透明。

更改方块的RenderType

我们说了那么多,那重点来了,怎么更改方块的RenderType呢?

这里直接放出代码,我相信凭借读者的理解能力,应该能看的懂。

private void doClientStuff(final FMLClientSetupEvent event) {
    RenderTypeLookup.setRenderLayer(<your_block>, <render_type>);
}

注意:更改RenderType涉及到渲染,是由客户端处理的,必须在FMLClientSetupEvent进行,否则在服务端会造成崩溃!!!

results matching ""

    No results matching ""