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
zh_cn:tutorial:entity [2023/01/15 01:07] – [创建一个实体] solidblockzh_cn:tutorial:entity [2023/01/15 01:23] (current) – [创建一个实体] solidblock
Line 8: Line 8:
   * 船   * 船
    
-生物实体(Living Entity)是拥有生命值,并且可以造成伤害的实体。+生物实体Living Entity是拥有生命值,并且可以造成伤害的实体。
 为了实现不同的功能,生物实体有着不同的分支类型,其中有: 为了实现不同的功能,生物实体有着不同的分支类型,其中有:
   * ''HostileEntity'' 敌对实体,用于僵尸、苦力怕、骷髅等   * ''HostileEntity'' 敌对实体,用于僵尸、苦力怕、骷髅等
Line 44: Line 44:
 </code> </code>
  
-你可以在 ''ENTITY_TYPE'' 注册类别下注册这个实体。 +你可以在 ''ENTITY_TYPE'' 注册类别下注册这个实体。Fabric 提供一个 ''FabricEntityTypeBuilder'' 类,继承自原版 ''EntityType.Builder'' 类。Fabric 提供的这个提供了配置你的实体的追踪数值的额外方法。
-Fabric提供一个 ''FabricEntityTypeBuilder''继承自原版 ''EntityType.Builder''+
- Fabric提供的Builder内置用于配置实体的 追踪数值(tracking values) 的额外方法。+
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 52: Line 50:
          
     /*     /*
-        * 使用 "entitytesting:cube作为ID注册我们的实体+        * 使用entitytesting:cube作为ID注册我们的实体
         *         *
         * 这个实体注册在了 SpawnGroup#CREATURE 类别下,大多数的动物和友好或中立的生物都注册在这个类别下。         * 这个实体注册在了 SpawnGroup#CREATURE 类别下,大多数的动物和友好或中立的生物都注册在这个类别下。
-        * 它有一个 .75 .75 (或12个像素宽,即一个方块的3/4)大小的碰撞体积。+        * 它有一个 0.75 × 0.75或12个像素宽,即一个方块的3/4大小的碰撞体积。
         */         */
     public static final EntityType<CubeEntity> CUBE = Registry.register(     public static final EntityType<CubeEntity> CUBE = Registry.register(
Line 70: Line 68:
 </code> </code>
  
-实体需要 //属性(Attributes)// 和 //渲染器(Renderer)// 才能起作用。+实体需要//属性Attributes//和//渲染器Renderer//才能起作用。
  
 ===== 注册实体的属性 ===== ===== 注册实体的属性 =====
Line 105: 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 139: 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 150: 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 172: 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 179: Line 166:
 } }
 </code> </code>
- +在创建一个部位之后,我们需要添加一个形状shape)。为此,我们必须为根部添加一个子形状。新部分的纹理位置在 ''.uv'' 中,其偏移位于 ''.cuboid'' 的前三个数字中,尺寸则为 ''.cuboid'' 的后三个数字。注意,模型的原点从拐角处开始,所以你需要一些偏移让它居中:
-在创建一个部位之后,我们需要为他添加一个形状(shape) +
-注意,模型的原点从拐角处开始,所以你需要一些偏移让它居中:+
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 189: 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 215: 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 235: 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 247: 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.1673744825.txt.gz · Last modified: 2023/01/15 01:07 by solidblock