zh_cn:tutorial:custom_model
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
zh_cn:tutorial:custom_model [2021/08/17 12:14] – solidblock | zh_cn:tutorial:custom_model [2024/01/02 10:31] – [Sprites] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== 使用自定义模型动态渲染方块和物品 ====== | ====== 使用自定义模型动态渲染方块和物品 ====== | ||
- | 可以通过方块模型JSON文件将模型添加到游戏,但也可以通过Java代码来渲染。本教程中,我们将会将一个四面熔炉模型添加到游戏。 | + | 可以通过方块模型 JSON 文件将模型添加到游戏,但也可以通过 Java 代码来渲染。本教程中,我们将会将一个四面熔炉模型添加到游戏。 |
- | 注意模型会在区块被重建时渲染。如果需要更加动态的渲染,可以使用'' | + | 注意模型会在区块被重建时渲染。如果需要更加动态的渲染,可以使用 '' |
===== 创建模型 ===== | ===== 创建模型 ===== | ||
- | 模型第一次在Minecraft被注册时,其原始数据包含在'' | + | 模型第一次在 Minecraft 注册时,其原始数据被包含在 '' |
<code java> | <code java> | ||
+ | @Environment(EnvType.CLIENT) | ||
public class FourSidedFurnaceModel implements UnbakedModel, | public class FourSidedFurnaceModel implements UnbakedModel, | ||
</ | </ | ||
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; | ||
</ | </ | ||
==== Meshes ==== | ==== Meshes ==== | ||
- | '' | + | '' |
<code java> | <code java> | ||
private Mesh mesh; | private Mesh mesh; | ||
Line 70: | Line 75: | ||
</ | </ | ||
- | ==== BakedModel方法 ==== | + | ==== BakedModel 方法 ==== |
- | 注意这里不是所有的方法都会被Fabric Renderer使用,所以我们并不关心这个实现。 | + | 注意这里不是所有的方法都会被 Fabric Renderer 使用,所以我们并不关心这个实现。 |
<code java> | <code java> | ||
- | @Override | + | |
public List< | public List< | ||
- | return | + | return |
} | } | ||
Line 99: | Line 104: | ||
@Override | @Override | ||
- | public Sprite | + | public Sprite |
- | return SPRITES[1]; // 方块破坏纹理,使用furnace_top | + | return SPRITES[1]; // 方块被破坏时产生的颗粒,使用furnace_top |
} | } | ||
Line 114: | Line 119: | ||
</ | </ | ||
- | ==== 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: | ||
===== 注册模型 ===== | ===== 注册模型 ===== | ||
- | 我们先写一个'' | + | 我们先写一个 '' |
- | 我们在名称'' | + | 我们用 '' |
<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(" | public static final Identifier FOUR_SIDED_FURNACE_MODEL = new Identifier(" | ||
Line 154: | Line 160: | ||
</ | </ | ||
- | 现在我们要将这个类注册到客户端初始化器中,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 json> | <code json> | ||
/* ... */ | /* ... */ | ||
Line 196: | Line 203: | ||
==== 更新模型 ==== | ==== 更新模型 ==== | ||
我们复用相同的模型类,但是有一点点小改变: | 我们复用相同的模型类,但是有一点点小改变: | ||
- | * 我们会使用 '' | + | * 我们会使用 '' |
- | 我们会更新我们的 | + | 现在对 |
<code java> | <code java> | ||
- | // Minecraft默认方块模型 | + | // Minecraft 默认方块模型 |
private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier(" | private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier(" | ||
private ModelTransformation transformation; | private ModelTransformation transformation; | ||
| | ||
- | // 我们会将默认模型添加到其依赖中 | + | // 将默认模型添加到依赖中 |
public Collection< | public Collection< | ||
return Arrays.asList(DEFAULT_BLOCK_MODEL); | return Arrays.asList(DEFAULT_BLOCK_MODEL); | ||
} | } | ||
| | ||
- | // 我们会给bake函数添加一点逻辑 | + | // 我们给 bake 函数添加一点逻辑 |
@Override | @Override | ||
public BakedModel bake(ModelLoader loader, Function< | public BakedModel bake(ModelLoader loader, Function< | ||
// 加载默认方块模型 | // 加载默认方块模型 | ||
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: | ||
更新我们先前创建的 '' | 更新我们先前创建的 '' | ||
<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