User Tools

Site Tools


zh_cn:tutorial:custom_model

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:custom_model [2021/08/30 09:42] – [创建模型] solidblockzh_cn:tutorial:custom_model [2024/01/02 10:31] (current) – [UnbakedModel方法] solidblock
Line 2: Line 2:
 可以通过方块模型 JSON 文件将模型添加到游戏,但也可以通过 Java 代码来渲染。本教程中,我们将会将一个四面熔炉模型添加到游戏。 可以通过方块模型 JSON 文件将模型添加到游戏,但也可以通过 Java 代码来渲染。本教程中,我们将会将一个四面熔炉模型添加到游戏。
  
-注意模型会在区块被重建时渲染。如果需要更加动态的渲染,可以使用 ''BlockEntityRenderer''[[zh_cn:tutorial:blockentityrenderers|方块实体渲染器]]。+注意模型会在区块被重建时渲染。如果需要更加动态的渲染,可以使用 ''BlockEntityRenderer''[[zh_cn:tutorial:blockentityrenderers|方块实体渲染器]]。
  
 ===== 创建模型 ===== ===== 创建模型 =====
Line 8: Line 8:
  
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class FourSidedFurnaceModel implements UnbakedModel, BakedModel, FabricBakedModel { public class FourSidedFurnaceModel implements UnbakedModel, BakedModel, FabricBakedModel {
 </code> </code>
Line 20: Line 21:
     };     };
     private Sprite[] SPRITES = new Sprite[2];     private Sprite[] SPRITES = new Sprite[2];
 +
 +    // Some constants to avoid magic numbers, these need to match the SPRITE_IDS
 +    private static final int SPRITE_SIDE = 0;
 +    private static final int SPRITE_TOP = 1;
 </code> </code>
  
Line 53: Line 58:
  
         for(Direction direction : Direction.values()) {         for(Direction direction : Direction.values()) {
-            int spriteIdx = direction == Direction.UP || direction == Direction.DOWN ? 0;+            int spriteIdx = direction == Direction.UP || direction == Direction.DOWN ? SPRITE_TOP SPRITE_SIDE;
             // 将新的面(face)添加到mesh             // 将新的面(face)添加到mesh
             emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);             emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
Line 70: Line 75:
 </code> </code>
  
-==== BakedModel方法 ==== +==== BakedModel 方法 ==== 
-注意这里不是所有的方法都会被Fabric Renderer使用,所以我们并不关心这个实现。+注意这里不是所有的方法都会被 Fabric Renderer 使用,所以我们并不关心这个实现。
 <code java> <code java>
-@Override+    @Override
     public List<BakedQuad> getQuads(BlockState state, Direction face, Random random) {     public List<BakedQuad> getQuads(BlockState state, Direction face, Random random) {
-        return null; // 不需要,因为我们使用的是FabricBakedModel+        return Collections.emptyList(); // 不需要,因为我们使用的是 FabricBakedModel
     }     }
  
Line 99: Line 104:
  
     @Override     @Override
-    public Sprite getSprite() { +    public Sprite getParticleSprite() { 
-        return SPRITES[1]; // 方块破坏纹理,使用furnace_top+        return SPRITES[1]; // 方块破坏时产生的颗粒,使用furnace_top
     }     }
  
Line 114: Line 119:
 </code> </code>
  
-==== FabricBakedModel方法 ====+==== FabricBakedModel 方法 ====
 <code java> <code java>
     @Override     @Override
     public boolean isVanillaAdapter() {     public boolean isVanillaAdapter() {
-        return false; // false以触发FabricBakedModel渲染+        return false; // false 以触发 FabricBakedModel 渲染
     }     }
  
Line 125: Line 130:
         // 渲染函数         // 渲染函数
                  
-        // 我们仅渲染mesh+        // 我们仅渲染 mesh
         renderContext.meshConsumer().accept(mesh);         renderContext.meshConsumer().accept(mesh);
     }     }
Line 137: Line 142:
  
 ===== 注册模型 ===== ===== 注册模型 =====
-我们先写一个''ModelResourceProvider'',允许你在游戏尝试从JSON加载时提供一个''UnbakedModel''的界面。参看[[https://github.com/FabricMC/fabric/blob/1.16/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java|本文档]]以了解详情。要的部分是,对于每个模型都会调用一次''loadModelResource()''+我们先写一个 ''ModelResourceProvider''这个接口允许你在游戏尝试从 JSON 加载时提供一个''UnbakedModel''。参看[[https://github.com/FabricMC/fabric/blob/1.16/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java|本文档]]以了解详情。注意的是,对于每个模型''loadModelResource()'' 都会调用一次
  
-我们在名称''tutorial:block/four_sided_furnace''之下注册模型。+我们用 ''tutorial:block/four_sided_furnace'' 这个名称注册模型。
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class TutorialModelProvider implements ModelResourceProvider { public class TutorialModelProvider implements ModelResourceProvider {
     public static final Identifier FOUR_SIDED_FURNACE_MODEL = new Identifier("tutorial:block/four_sided_furnace");     public static final Identifier FOUR_SIDED_FURNACE_MODEL = new Identifier("tutorial:block/four_sided_furnace");
Line 154: Line 160:
 </code> </code>
  
-现在我们要将这个类注册到客户端初始化器中,the entry point for client-specific code.+现在我们要将这个类注册到客户端初始化器(仅适用于客户端的代码的入口点)
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class ExampleModClient implements ClientModInitializer { public class ExampleModClient implements ClientModInitializer {
     @Override     @Override
Line 166: Line 173:
 </code> </code>
  
-不要忘记在''fabric.mod.json''中注册这个entrypoint,如果还没有完成的话:+不要忘记在 ''fabric.mod.json'' 中注册这个入口点,如果还没有完成的话:
 <code json> <code json>
 /* ... */ /* ... */
Line 196: Line 203:
 ==== 更新模型 ==== ==== 更新模型 ====
 我们复用相同的模型类,但是有一点点小改变: 我们复用相同的模型类,但是有一点点小改变:
-  * 我们会使用 ''ModelTransformation'',根据其位置(在右手、在左手、在GUI中、在物品展示框中,等等)将其旋转/平移/缩放。就像为平常的方块创建模型一样,我们使用会在bake模型时加载的“minecraft:block/block”的格式。+  * 我们会使用 ''ModelTransformation'',根据其位置(在右手、在左手、在 GUI 中、在物品展示框中,等等)将其旋转/平移/缩放。就像为平常的方块创建模型一样,我们使用会在 bake 模型时加载的“minecraft:block/block”的格式。
  
-我们会更新我们的 ''FourSidedFurnaceModel''如下:+现在对 ''FourSidedFurnaceModel''进行如下修改
 <code java> <code java>
-    // Minecraft默认方块模型+    // Minecraft 默认方块模型
     private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier("minecraft:block/block");     private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier("minecraft:block/block");
  
     private ModelTransformation transformation;     private ModelTransformation transformation;
          
-    // 我们会将默认模型添加到依赖中+    // 将默认模型添加到依赖中
     public Collection<Identifier> getModelDependencies() {     public Collection<Identifier> getModelDependencies() {
         return Arrays.asList(DEFAULT_BLOCK_MODEL);         return Arrays.asList(DEFAULT_BLOCK_MODEL);
     }     }
          
-    // 我们给bake函数添加一点逻辑+    // 我们给 bake 函数添加一点逻辑
     @Override     @Override
     public BakedModel bake(ModelLoader loader, Function<SpriteIdentifier, Sprite> textureGetter, ModelBakeSettings rotationContainer, Identifier modelId) {     public BakedModel bake(ModelLoader loader, Function<SpriteIdentifier, Sprite> textureGetter, ModelBakeSettings rotationContainer, Identifier modelId) {
         // 加载默认方块模型         // 加载默认方块模型
         JsonUnbakedModel defaultBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL);         JsonUnbakedModel defaultBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL);
-        // 获取ModelTransformation+        // 获取 ModelTransformation
         transformation = defaultBlockModel.getTransformations();         transformation = defaultBlockModel.getTransformations();
                  
Line 221: Line 228:
     }     }
          
-    // 我们实现 getTransformation() 和 getOverrides()+    // 我们需要实现 getTransformation() 和 getOverrides()
     @Override     @Override
     public ModelTransformation getTransformation() {     public ModelTransformation getTransformation() {
Line 232: Line 239:
     }     }
          
-    // 我们也会使用此方法以使得物品渲染时有正确的光照。尝试将其设为false,你就会看到不同。+    // 我们也会使用此方法以使得物品渲染时有正确的光照。尝试将其设为 false,你就会看到不同。
     @Override     @Override
     public boolean isSideLit() {     public boolean isSideLit() {
Line 248: Line 255:
 更新我们先前创建的 ''ModelResourceProvider'' 更新我们先前创建的 ''ModelResourceProvider''
 <code java> <code java>
 +@Environment(EnvType.CLIENT)
 public class TutorialModelProvider implements ModelResourceProvider { public class TutorialModelProvider implements ModelResourceProvider {
     public static final FourSidedFurnaceModel FOUR_SIDED_FURNACE_MODEL = new FourSidedFurnaceModel();     public static final FourSidedFurnaceModel FOUR_SIDED_FURNACE_MODEL = new FourSidedFurnaceModel();
zh_cn/tutorial/custom_model.1630316541.txt.gz · Last modified: 2021/08/30 09:42 by solidblock