User Tools

Site Tools


zh_cn:tutorial:entity

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
zh_cn:tutorial:entity [2023/01/15 01:09] – [创建并注册一个实体] solidblockzh_cn:tutorial:entity [2023/01/15 01:22] – [生成你的实体] solidblock
Line 103: Line 103:
 ===== 注册实体的渲染器 ===== ===== 注册实体的渲染器 =====
  
-最后一个需要注册的是实体的**渲染器**。渲染器一般通过提供模型来决定实体的 *外观*。 +最后一个需要注册的是实体的**渲染器**。渲染器一般通过提供模型来决定实体的 //外观//。 
-''MobEntityRenderer'' 是生物实体最好的选择。继承这个类需要重写一个用于提供贴图的方法,和三个用于父类构造的参数: +''MobEntityRenderer'' 是生物实体最好的选择。继承这个类需要重写一个用于提供纹理的方法,和三个用于父类构造的参数: 
-  * ''EntityRenderDispatcher'' 一个EntityRenderDispatcher对象+  * ''EntityRenderDispatcher'' 实例
   * ''Model'' 实体的模型   * ''Model'' 实体的模型
   * 实体阴影的大小,''float''类型   * 实体阴影的大小,''float''类型
    
-下面的代码展示了一个简单的实体渲染器,它的阴影大小是0.5f, 贴图的路径为 ''resources/assets/entitytesting/textures/entity/cube/cube.png''. +下面的代码展示了一个简单的实体渲染器,阴影大小是 0.5f,纹理的路径为 ''resources/assets/entitytesting/textures/entity/cube/cube.png'' 
-注意:用到的贴图和模型将在下一步创建。+注意:用到的纹理和模型将在下一步创建。
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
 /* /*
-    * 一个用来提供模型、阴影大小和贴图的渲染器+    * 一个用来提供模型、阴影大小和纹理的渲染器
     */     */
 public class CubeEntityRenderer extends MobEntityRenderer<CubeEntity, CubeEntityModel> { public class CubeEntityRenderer extends MobEntityRenderer<CubeEntity, CubeEntityModel> {
Line 137: Line 137:
     public void onInitializeClient() {     public void onInitializeClient() {
         /*         /*
-            * 方块实体渲染器的注册,提供模型、阴影大小和贴图的渲染器。 +         * 方块实体渲染器的注册,提供模型、阴影大小和纹理的渲染器。 
-            +         
-            * 实体渲染器也可以在实体基于上下文进行渲染前(EndermanEntityRenderer#render). 操作模型。 +         * 实体渲染器也可以在实体基于上下文进行渲染前(EndermanEntityRenderer#render). 操作模型。 
-            */+         */
         EntityRendererRegistry.INSTANCE.register(EntityTesting.CUBE, (dispatcher, context) -> {         EntityRendererRegistry.INSTANCE.register(EntityTesting.CUBE, (dispatcher, context) -> {
             return new CubeEntityRenderer(dispatcher);             return new CubeEntityRenderer(dispatcher);
Line 148: Line 148:
 </code> </code>
  
-===== 创建模型和贴图 =====+===== 创建模型和纹理 =====
  
-完成实体创建的最后一步是创建模型和贴图 +完成实体创建的最后一步是创建模型和纹理。模型定义了实体的//结构// ,而纹理提供了实体的颜色。
-模型定义了实体的 //结构// ,而贴图提供了实体的颜色。+
  
-标准的模型在类的顶部提供并在构造方法中初始化"部位(parts)", 或 ''ModelPart'' 对象, +标准的模型在类的顶部提供并在构造方法中初始化部位parts)”,即 ''ModelPart'' 对象,在构造方法中实例化,在 ''getTexturedModelData'' 方法中获得数据,然后在 ''render'' 方法中渲染它们。注意 ''setAngles'' 和 ''render'' 是 ''EntityModel'' 类的抽象方法,必须重写。
-然后在 ''render'' 方法中渲染它们。 +
-注意 ''setAngles'' 和 ''render'' 是 ''EntityModel'' 类的抽象方法,必须重写。 +
- +
-''ModelPart'' 有几个不同的构造方法,其中最简单的一个需要以下参数: +
-  * 当前模型对象 +
-  * textureOffsetU, ''int''类型的贴图偏移值 +
-  * textureOffsetV, ''int''类型的贴图偏移值 +
-  +
-贴图偏移值指在你的贴图文件中,当前模型贴图的位置。 +
-我们的实体的一个简单的方块,所以 ''ModelPart'' 的贴图的偏移为0, 0.+
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 170: Line 159:
     private final ModelPart base;     private final ModelPart base;
          
-    public CubeEntityModel() { +    public CubeEntityModel(ModelPart modelPart) { 
-        base = new ModelPart(this, 0, 0);+        base = modelPart.getChild(EntityModelPartNames.CUBE);
     }     }
          
Line 177: Line 166:
 } }
 </code> </code>
- +在创建一个部位之后,我们需要添加一个形状shape)。为此,我们必须为根部添加一个子形状。新部分的纹理位置在 ''.uv'' 中,其偏移位于 ''.cuboid'' 的前三个数字中,尺寸则为 ''.cuboid'' 的后三个数字。注意,模型的原点从拐角处开始,所以你需要一些偏移让它居中:
-在创建一个部位之后,我们需要为他添加一个形状(shape) +
-注意,模型的原点从拐角处开始,所以你需要一些偏移让它居中:+
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 187: Line 174:
          
     public CubeEntityModel() {     public CubeEntityModel() {
-        base = new ModelPart(this, 0, 0)+        [...] 
-        base.addCuboid(-6-6, -6121212);+    } 
 +  
 +    // 你可以使用 BlockBench,制作你的模型并为你的实体模型导出以得到这个方法。 
 +    public static TexturedModelData getTexturedModelData() { 
 +        ModelData modelData = new ModelData(); 
 +    ModelPartData modelPartData = modelData.getRoot(); 
 +        modelPartData.addChild(EntityModelPartNames.CUBEModelPartBuilder.create().uv(0, 0).cuboid(-6F12F, -6F12F12F12F), ModelTransform.pivot(0F, 0F, 0F));
     }     }
-     
-    [...] 
 } }
 </code> </code>
  
-O我们的实体模型现在有了一个12x12x12的方块(大约一个方块的75%),并以0, 0, 0为中心。  +我们的实体模型现在有了一个 12x12x12 的方块大约一个方块的75%,并以0, 0, 0为中心。''setAngles'' 用于模型的动画,但是目前我们留空。''render'' 用来告诉游戏我们的实体出现在哪。注意标准的原版模型通常看起来比它们的碰撞体积更大,因此,我们在这里把模型变小。
-''setAngles'' 用于模型的动画,但是目前我们留空。 +
- ''render'' 用来告诉游戏我们的实体出现在哪。注意标准的原版模型通常看起来比它们的碰撞体积更大,因此,我们在这里把模型变小。+
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 213: Line 202:
     @Override     @Override
     public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {     public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
-        // 把模型变小 +        ImmutableList.of(this.base).forEach((modelRenderer) -> { 
-        matrices.translate(0, 1.125, 0); +            modelRenderer.render(matrices, vertices, light, overlay, red, green, blue, alpha); 
-     +        });
-        // 渲染方块实体 +
-        base.render(matrices, vertices, light, overlay);+
     }     }
 } }
 </code> </code>
- +要完成我们的模型,我们还需要一个纹理文件。默认的纹理大小是64宽、32高的;你可以通过在 ''texturedModelData'' 添加返回值来改变。我们使用 64x64 的纹理
-我们还需要添加一个贴图文件来完成它。默认的贴图大小是64宽、32高的; +
-你可以通过改变模型构造函数里的 ''textureWidth'' 和 ''textureHeight'' 字段来改变 +
-我们使用64x64的贴图+
  
 {{https://i.imgur.com/JdF9zjf.png}} {{https://i.imgur.com/JdF9zjf.png}}
Line 233: Line 217:
     private final ModelPart base;     private final ModelPart base;
          
-    public CubeEntityModel() { +    public static TexturedModelData getTexturedModelData() {
-        this.textureHeight = 64; +
-        this.textureWidth = 64; +
-    +
         [...]         [...]
 +        return TexturedModelData.of(modelData, 64, 64);
     }     }
          
Line 245: Line 227:
  
 ===== 生成你的实体 ===== ===== 生成你的实体 =====
 +记得将客户端入口点添加到 fabric.mod.json 中,像这样:
 +<code json>
 +
 +  "entrypoints": {
 +    "main": [
 +      "mod.fabricmc.entitytesting.EntityTesting"
 +    ],
 +    "client": [
 +      "mod.fabricmc.entitytesting.EntityTestingClient"
 +    ]
 +  },
 +</code>
  
-你可以在游戏内使用 ''/summon entitytesting:cube'' 来生成你的实体,按下F3+b可以查看它的碰撞体积:+你可以在游戏内使用 ''/summon entitytesting:cube'' 来生成你的实体,按下 F3+b 可以查看它的碰撞体积:
 {{https://i.imgur.com/MmQvluB.png}} {{https://i.imgur.com/MmQvluB.png}}
  
 +**注意:**如果你的实体没有继承 ''LivingEntity'',你需要创建你自己的封包处理器。你可以通过网络 API 来完成,也可以对 ''ClientPlayNetworkHandler#onEntitySpawn'' 使用 mixin。
zh_cn/tutorial/entity.txt · Last modified: 2023/01/15 01:23 by solidblock