Skip to main content

1.2 物品的模型与材质

Part A. 实战

一个物品被注册后,还应该指定它的模型和材质。这种指定方式也是固定的,记忆即可。下面以上面的 ObsidianIngot 为例。

第一步,在 src/main/resources 创建 assets 目录,表示这个 mod 存储资源的位置。并将目录补充为:

resources/
├── META-INF/
│   └── mods.toml
├── assets/
│   └── mymod/ # 你的 modid
│   ├── models/
│   │   └── item/ # 表示 item(物品)类型,在 ResourceLocation 中域后的第一项
│   └── textures/
│   └── item/
└── pack.mcmeta

一定要创建 pack.mcmeta,这相当于为 mod 规定了资源包。只有这么做,MC 才能发现 assets 中的资源。格式也是 JSON,模板(version 6 支持 1.16.2 至 1.16.5 的游戏版本。更多版本对应信息请参见 Pack Format):

{
"pack": {
"description": "demo resources support 1.16.2 ~ 1.16.5",
"pack_format": 6
}
}

第二步,在 models/item 的目录中创建 obsidian_ingot.json,文件名需要和之前物品注册名相同。

item(物品类)模型的 JSON 文件的模板如下:

{
// 父模型,即由什么模型加载而来
"parent": "item/generated",
"textures": {
// 指定了最底层的材质(格式在 0.4 中已经叙述)
"layer0": "mymod:item/obsidian_ingot"
}
}

textures/item 的目录中放入自己设计的材质 obsidian_ingot.png(游戏中 1:1,仅贴图最好不要大于 32×32 像素),文件名也是物品注册名。

最后启动游戏就会发现游戏自动读取了模型和材质。

注:自己制作模型的网站戳 这里

Part B. 理论:资源包 & 数据包

你可能会比较好奇,为什么设置物品模型、材质的目录一定长这个样子?

实际上,我们在 mod 里写的这个目录结构,是 Mojang 的**资源管理规范**,确保所有资源能使用统一接口、正确载入游戏,而这个载入的工具类就是 ResourceLocation,感兴趣可以在 Forge 包内自行查看源码:

Mojang 定义,所有为游戏提供材质、模型、音乐音效、语言、字体文字等资源的,全部放在约定好的目录下,对资源增删改就几乎无需改动代码,实现资源解耦。我们上面定义的材质、模型就是游戏资源的一部分,应该以资源包的形式定义,才能被正确载入。

对 Java 版本而言,资源包可以有一下几种存在方式:

  • 与游戏程序配套存在。一般在 .minecraft/resourcepack/ 目录下,可以是一个 *.zip 或者是独立的目录;
  • 存在于 mod 的根目录中,在 .minecraft/mod/ 目录下引入 mod 后,mod 中的资源会被动态载入;

这两种存在都有一个共同的要求,就是从资源根目录开始,满足这种目录结构:

resources/
├── META-INF/
│ └── mods.toml
├── assets/
| ├── icons/
| | ├── minecraft.icns
| | └── ...
│ └── <namespace>
│ ├── models/
│ │ └── item/
│ ├── textures/
│ | └── item/
| └── ...
└── pack.mcmeta

完整的目录相当长,以后添加其他类型的资源时遇到了再作介绍。感兴趣可以参阅 Resource Pack Folder Structure

除了上述的资源包,还有一种包的结构,是 Java 版本 Minecraft 所独有的:数据包(data pack)。

和资源包互为补充,数据包主要定位是,维护游戏的成就、维度、战利品表、物品修饰、配方、群系结构、标签等等。

可能的存在方式如下:

  • 与游戏程序配套存在。一般在 .minecraft/save/(world)/datapacks/ 目录下,可以是一个 *.zip 或者是独立的目录;
  • 存在于 mod 的根目录中,在 .minecraft/mod/ 目录下引入 mod 后,mod 中的数据包会被动态载入;

其目录结构如下:

resources/
├── META-INF/
│   └── mods.toml
|
├── assets/ # 上面所说的资源包目录
|
├── pack.png # 显示在 “数据包选择” 的选项卡中的图片
|
├── data/
│   └── <namespace>
| ├── advancements/
| ├── functions/
| ├── item_modifiers/
| ├── loot_tables/
| ├── predicates/
| ├── recipes/
| ├── structures/
│   ├── tags/
| ├── worldgen/
| └── ...
└── pack.mcmeta

更全的目录结构,感兴趣参考:Data Pack Folder Structure

Part C. 补充:BlockBench 笔记

  • 绑骨:按照父级模型生长方向移动、旋转等操作,可以用作设计动画;
  • 顶点识别;
  • 隐藏的菜单:x/y/z 轴翻转;
  • 缩放参数:可以在不改变材质的情况下改变模型大小,允许小数;
  • 大纲视图的锁定:可以防止误操作;
  • 背景图的作用大部分是用来拾色的;
  • 后期添加模型过大,放不下空白材质时,可以为材质调整大小;