跳到主要内容

🌌 添加自定义模型

在开始之前,请确保您的资源包托管已完全设置好。记住——每次模型编辑都需要更新资源包才能生效。否则,运行 /ce reload all 时,您不会立即看到变化。

准备工作

什么是命名空间ID

命名空间ID 是 Minecraft 中用于声明和指定游戏对象的一种方式,可以无歧义或冲突地识别内置和用户定义的对象。

在设置物品命名空间ID、模型路径或纹理路径时,您需要遵循以下命名规则:https://zh.minecraft.wiki/w/命名空间ID#合法字符

提示

让我们来做一个快问快答!以下这五个命名空间ID中,哪些是实际有效的呢?

  1. MyFirst:golden_sword
  2. minecraft:steel furnace
  3. abcd-efgh:1122.3344
  4. craftengine:happy$crafting
  5. test:tutorial_book
答案
  1. ❌️ 不允许使用大写字母
  2. ❌️ 不允许使用空格
  3. ✔️
  4. ❌️ $ 不是有效字符
  5. ✔️

什么是模型?

模型是 Minecraft 中用于显示游戏中遇到的物体的几何结构。

无论是方块还是物品,它们都需要一个模型。即使某些东西看起来只是简单的纹理,它仍然需要一个基本模型。这些模型文件都以 .json 结尾,您可以在 BlockBench 中打开/编辑大多数模型文件。

以下是一个快速展示模型存放位置的文件结构:

信息

在制作资源包时,我强烈建议遵循 Minecraft 的结构:

  • 将物品模型放在 /models/item/
  • 将方块模型放在 /models/block/

保持这种组织结构能让你的资源包更加标准化且更容易管理!

为了避免与 Minecraft 的默认资源发生冲突,你有两个很好的选择:

  • 创建子文件夹,如 /models/item/custom/
  • 或者更好的是,使用你自己的命名空间(例如 mypack:item/sword)

什么是纹理/纹理图集?

模型定义形状,而纹理赋予色彩!纹理指的是图像文件,它们必须是 PNG 格式(文件扩展名为 .png)。不允许使用其他图像格式,如 JPG/JPEG 或 GIF。

以下是它们的存放位置:

警告

纹理路径比模型路径更严格!

即使模型的 JSON 文件放错了目录(例如,放在 /item/ 或 /block/ 之外)也可能正常工作,但纹理必须放置在正确的文件夹中,这是因为 Minecraft 的纹理图集系统。

让我简化一下 Minecraft 中纹理的运作方式:

Minecraft 将多个纹理合并成一张巨大的图像(称为纹理图集)以提升性能。然而,并非所有纹理都是模型纹理(例如,雕刻南瓜面具、雨/雪环境纹理等)。因此,必须使用纹理图集文件来定义哪些纹理可以被加载。

默认情况下,Minecraft 使用以下纹理图集(minecraft/atlases/blocks.json):

{
"sources": [
{ "type": "directory", "source": "block", "prefix": "block/" },
{ "type": "directory", "source": "item", "prefix": "item/" },
...更多内容
]
}

这就是为什么 Minecraft 默认只能加载位于 blockitem 目录下的纹理文件。 如果你尝试引用来自不受支持路径的纹理(例如 textures/custom),游戏引擎将无法加载它们,从而导致出现显示为紫黑相间的方格。

自定义纹理图集教程

要创建纹理图集路径,您只需在资源包的以下路径添加一个文件:resourcepack/assets/minecraft/atlases/blocks.json。以下是一个将自定义路径添加到纹理图集的简单示例:

{
"sources": [
{ "type": "directory", "source": "custom", "prefix": "custom/" }
]
}
注意

Minecraft 模型纹理尺寸要求

对于模型纹理,宽度和高度必须是 2 的幂(例如,16、32、64、128),以确保正确渲染。此限制不适用于字体纹理(例如,rank.png、GUI 元素、HUD 图标等),这些纹理可以使用任意尺寸。

有效示例:
✅ 16×16(原版默认)
✅ 32×32(高清纹理常用)
✅ 64×64、64×128(更高分辨率的资源包)

无效示例:
❌ 7×7、13×13、19×19(非 2 的幂尺寸)
❌ 17×32(混合有效/无效尺寸)

切勿将字体/GUI 纹理(例如,rank.png、HUD 元素)放置在与模型纹理(例如,block/、item/)相同的目录中。 即使这些纹理未直接用于模型,Minecraft 的纹理图集系统在生成组合精灵表时会自动包含它们。这可能导致意外的视觉降级(mipmap级别):

Mipmap级别4和级别0的差异对比

Mipmap级别4

Mipmap级别0

创建模型文件

现在让我们创建第一个模型文件!您可以通过 BlockBench 或在 CraftEngine 中配置来创建模型。我将本节分为两个独立教程。强烈建议你都尝试一遍,以更深入地了解模型系统的工作原理。

点击下载教程用的剑纹理

将下载的 PNG 图像放入下面显示的文件夹结构中。然后,我们将开始创建模型。

使用 BlockBench 创建模型

作为服务器开发者,你并不需要掌握复杂的建模技巧。你只需要掌握基础的模型编辑和导入方法即可!把下面的教程当成一个练习场,自由尝试和探索。

提示

首先,在进行任何编辑之前,使用 Ctrl+S 将模型保存到您的资源包文件夹中。在本教程中,我将 JSON 文件保存到: /resources/tutorial/resourcepack/assets/tutorial/models/item/

提示

创建一个基础立方体,并应用 toxic_sword 纹理 resourcepack/assets/tutorial/textures/item/toxic_sword.png。尝试做一些简单的调整——将其视为一次轻松的练习。在下面的示例中,我创建了一个不寻常的剑形方块。尽管造型奇特,但关键点在于这是一个完全自定义的模型。

现在让我们使用专业的文本编辑器打开刚刚创建的模型 JSON 文件。你的 JSON 结构应该与我的基本一致。

警告

始终将模型 JSON 文件保存在完整的资源包目录结构中。否则,BlockBench 将无法推断出正确的资源包层级结构,导致生成的纹理路径在 Minecraft 中无法解析。如果你的 textures 字段与我的差异很大,这很可能就是原因。

{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"textures": {
"0": "tutorial:item/toxic_sword",
"particle": "tutorial:item/toxic_sword" // 指的是方块破坏、进食等的粒子效果。译者注:json不支持注释记得删掉这个注释
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "texture": "#0"},
"south": {"uv": [0, 0, 16, 16], "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
}
]
}
信息

使用第三方资源包时,修改模型纹理路径可能会导致纹理缺失错误。在这种情况下,打开 BlockBench 重新配置纹理路径。否则,模型将显示为紫黑色的错误方块。

或者,您可以直接使用文本编辑器修改 JSON 文件中的 textures 条目。请注意,命名空间ID会自动忽略像 modelstextures 这样的前缀。在此,tutorial:item/toxic_sword 对应实际纹理路径是 assets/tutorial/textures/item/toxic_sword.png

现在让我们回到 CraftEngine 的配置,将新创建的模型分配给剑物品。为了确保与预期结果一致,我已将我的配置文件上传至此处供您参考。如果你发现实际效果与教程不同,请参考该文件进行比对排查。

items:
tutorial:toxic_sword:
material: diamond_sword
data:
item-name: "<#3CB371>剧毒之剑"
model:
type: minecraft:model # 不要过于关注这里的类型,我们稍后会详细解释。
path: tutorial:item/toxic_sword
# 如果您需要兼容的客户端版本低于 1.21.2,请在此添加 custom-model-data 以确保向后兼容
custom-model-data: 1000

提示

别忘了运行 /ce reload all 以应用资源包更改。

什么是自定义模型数据?

自定义模型数据是一种数据组件,用于为共享相同基础物品的自定义物品启用独特的模型变体。对于具有相同基础物品的自定义物品,您必须分配不同的自定义模型数据值来区分它们的模型。例如:

items:
tutorial:toxic_sword:
material: diamond_sword
custom-model-data: 1000
tutorial:flame_sword:
material: diamond_sword
custom-model-data: 1001

然而,这一限制不适用于具有不同基础物品的自定义物品。例如:

items:
tutorial:toxic_sword:
material: diamond_sword
custom-model-data: 1000
tutorial:flame_sword:
material: wooden_sword
custom-model-data: 1000
什么是物品模型?

物品模型是 1.21.2 中引入的数据组件,相较于自定义模型数据具有更高的渲染效率,可减少客户端性能开销。通常,您无需手动指定模型路径(item-model),因为插件会自动生成。

然而,如果您的服务器需要广泛的版本兼容性(例如 1.20–1.21.8)并为较新客户端提供最佳渲染效果,请同时配置两者:

items:
tutorial:toxic_sword:
material: diamond_sword
item-model: tutorial:toxic_sword
custom-model-data: 1000

使用 CraftEngine 生成模型

现在我们来尝试 CraftEngine 提供的模型生成功能。注意:如果你已经完成了前面的 BlockBench 教程,请删除之前创建的模型 JSON 文件。正如标题所说,“生成”意味着这一节中我们不会使用 BlockBench 创建的模型。

items:
tutorial:toxic_sword:
material: diamond_sword
data:
item-name: "<#3CB371>剧毒之剑"
model:
path: tutorial:item/toxic_sword
+ generation:
+ parent: minecraft:item/handheld
+ textures:
+ layer0: tutorial:item/toxic_sword
提示

在路径定义的配置部分中使用生成配置时,插件会从读取模式切换到写入模式。这将在指定路径生成相应的 JSON 模型文件。

让我为你解释每个参数的用途以及如何获取它们:

从给定路径加载另一个模型,格式为命名空间ID

parent 字段不仅可以引用 Minecraft 原版提供的默认模型,还可以指向你自定义的模型。你可以在这个网站查看所有可用的 Minecraft 模型。 在 Minecraft 中,大多数模型(物品、工具,甚至方块)都使用基于父模型的生成方式,而不是独立建模。你在至少 80% 的配置中都会用到这种方式。

可以把父模型看作是一个预构建的 3D 模板 —— 你只需要提供纹理参数就能让它工作。

generation:
parent: minecraft:item/handheld
textures:
layer0: tutorial:item/toxic_sword

generation:
parent: minecraft:item/generated
textures:
layer0: tutorial:item/toxic_sword

generation:
parent: minecraft:block/cube_all
textures:
all: tutorial:item/toxic_sword

你可能会好奇,为什么前两个模型使用 layer0,而第三个用的是 all

想进一步了解,请点击 🖼️ textures 标签继续教程。

调试

如果你的模型显示为紫黑色方块或无法正确渲染,首先请检查你的服务器控制台——CraftEngine 会在那里记录大多数潜在错误。另外,也可以检查客户端日志来诊断资源包加载问题。