Skip to main content
Version: 1.21.4

方块实体渲染器(BlockEntityRenderer)

BlockEntityRenderer(通常缩写为 BER)用于渲染那些无法通过静态烘焙模型(如 JSON、OBJ 等)表现的方块。例如,你可以用它来动态渲染类似箱子的方块内部物品。要使用方块实体渲染器,目标方块必须拥有一个BlockEntity,即使该方块本身并不存储任何额外数据。

要创建一个 BER,需要定义一个继承自 BlockEntityRenderer 的类。这个类带有一个泛型参数,指定该渲染器对应的 BlockEntity 类,这个类型会作为 BER 的 render 方法的参数类型。

// 假设 MyBlockEntity 是 BlockEntity 的子类。
public class MyBlockEntityRenderer implements BlockEntityRenderer<MyBlockEntity> {
// 构造函数参数用于下面的 lambda。你也可以用它获取一些上下文(context),
// 并存储在本地字段里,比如实体渲染器分发器(entity renderer dispatcher),如果有需要的话。
public MyBlockEntityRenderer(BlockEntityRendererProvider.Context context) {
}

// 该方法会在每一帧被调用,用于渲染方块实体。参数说明如下:
// - blockEntity: 当前被渲染的方块实体实例。类型为传递给父接口的泛型类型。
// - partialTick: 自上一次 tick 以来经过的时间(以 tick 的小数表示,范围 0.0 到 1.0)。
// - poseStack: 用于渲染的姿态栈(pose stack)。
// - bufferSource: 用于获取顶点缓冲区的缓冲源(buffer source)。
// - packedLight: 方块实体的光照值。
// - packedOverlay: 当前的叠加值,通常为 OverlayTexture.NO_OVERLAY。
@Override
public void render(MyBlockEntity blockEntity, float partialTick, PoseStack stack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
// 在这里实现渲染逻辑。
}
}

对于每一种 BlockEntityType<?>,只能存在一个 BER。因此,某个具体方块实体实例的专属数据应当存储在该方块实体实例中,而不是 BER 本身。

当你创建好 BER 后,还需要将其注册到 EntityRenderersEvent.RegisterRenderers 事件中。该事件会在模组事件总线上被触发:

@SubscribeEvent
public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderers event) {
event.registerBlockEntityRenderer(
// 需要注册渲染器的方块实体类型。
MyBlockEntities.MY_BLOCK_ENTITY.get(),
// BlockEntityRendererProvider.Context 到 BlockEntityRenderer 的函数。
MyBlockEntityRenderer::new
);
}

如果你的 BER 不需要提供者上下文(provider context),也可以省略构造函数:

public class MyBlockEntityRenderer implements BlockEntityRenderer<MyBlockEntity> {
@Override
public void render( /* ... */ ) { /* ... */ }
}

// 在你的事件处理类中
@SubscribeEvent
public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderers event) {
event.registerBlockEntityRenderer(MyBlockEntities.MY_BLOCK_ENTITY.get(),
// 将 context 传递给一个空(默认)构造函数
context -> new MyBlockEntityRenderer()
);
}

方块物品渲染(Item Block Rendering)

并不是所有带有渲染器的方块实体(block entity)都能用静态模型进行渲染,因此你可以创建一个特殊渲染器(special renderer)来自定义物品渲染流程。这可以通过 SpecialModelRenderers 实现。在这种情况下,你既需要创建一个特殊模型渲染器来正确渲染物品,也需要注册一个对应的特殊方块模型渲染器,以便在方块作为物品被渲染时(例如末影人拿着方块)能够正确显示。

请参考 客户端物品文档 获取更多信息。

有关链接: 特殊模型 方块 方块实体 事件 事件总线 物品 模型