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
Last revisionBoth sides next revision
zh_cn:tutorial:custom_model [2021/08/30 09:45] – [FabricBakedModel方法] solidblockzh_cn:tutorial:custom_model [2024/01/02 10:31] – [Sprites] 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 73: Line 78:
 注意这里不是所有的方法都会被 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 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.txt · Last modified: 2024/01/02 10:31 by solidblock