方块碰撞箱与半透明材质
我们知道,栅栏实际高度是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
进行,否则在服务端会造成崩溃!!!