我的世界模组制作教程:资源包

§3 资源包
参考资源包,教程/制作资源包。资源包 (resourcepacks) 可以极大地提升原版模组的美观程度,因此现在大部分原版模组都需要使用配套的资源包。资源包文件层次为
其中 assets
的文件结构和 §1.3.1 游戏文件结构中 versions/版本号/版本号.jar/assets
的结构是一样的。
assets
下所有文件和文件夹需使用小写英文、数字或-(折线),_(下划线),.(点)来命名,不可使用大写字母,所有文本文件为使用 UTF-8
编码的JSON文件,图片为 png
格式。资源包可以为文件夹格式或 zip 格式,发布时可将所有内容压缩为一个 zip 文件。压缩和解压的时候,注意文件层次,应当打开 zip 文件就可以看到资源包的 pack.mcmeta、pack.png 和 assets 文件夹。稳妥的做法是打开文件夹->全选->右键->发送到->压缩文件夹
。文件夹格式的资源包若有错误文件仍可以加载,但 zip
格式的会无法加载。
游戏内选择选项->资源包
可以列出所有的资源包。在资源包菜单中,加载次序由下至上,因此上方的资源包内容会覆盖下方的资源包同名内容。由于原版模组往往会修改原版物品自定义模型,因此同时安装多个原版模组的资源包时,很容易出现文件冲突,此时需要玩家手动合并资源包方可使用。具体而言,对比两个资源包的同名文件,将相同的模型文件的 overrides
合并,其它内容选择需要的留下即可。
若资源包位于 saves/世界名称/resources.zip
,则资源包会在进入存档时自动加载(最顶层)。
本节中我们仅对资源包做简单介绍,更详细的文件说明请参阅资源包 - Minecraft Wiki,最详细的官方我的世界百科或论坛纹理资源版相关内容。
纹理包和资源包是不同的东西,目前 Minecraft Java 只有资源包,请不要使用错误的名称。
§3.1 元信息和图标
Minecraft 通过文件 pack.mcmeta
来识别资源包,因此该文件是不可或缺的。例如:
其中资源包描述为单个字符串或一个原始JSON文本。在资源包菜单页面,它会显示在资源包名称下方。
原版资源包里的 pack.mcmeta
文件为
资源包可以包含一个 pack.png
,它是正方形的图片,用于在资源包菜单中显示。
§3.2 命名空间
命名空间 (Namespace) 为玩家自定义的、可操作的空间。使用独立的命名空间也有利于解决和他人的冲突。资源包下可以有多个命名空间,如果不同资源包中有相同的命名空间,则其中相同的文件名内容会根据加载先后顺序被覆盖。特别地,原版内容被保存在 minecraft
命名空间,想要修改和替换原版的模型纹理只需在你的资源包内建立 minecraft
命名空间和相应的同名文件并修改即可。

若命名空间为 minecraft
,则可直接省略 minecraft:
。
建议和数据包使用相同的命名空间名。
§3.3 语言文件

语言
Language
语言文件 (Lang) 可以放在任一命名空间下的 lang
文件夹下。原版的语言文件除了 en_us.json
位于原版资源包外,其它的语言文件位于资源文件夹下。
语言文件中可以使用样式代码来实现彩色文字,但我们更建议使用原始JSON文本来实现,以避免在铁砧上重命名时出现多余的字符。建议至少支持简体中文(zh_cn
)、繁体中文(zh_tw
)和英文(en_us
)三种语言,建议所有物品、进度、游戏提示等文本均采用 translate
文本。
也可以用此方法修改物品的默认名称等内容。例如:
则未知的药水的名称不再是不可合成的药水
,而是神秘药水
。
translate
还有个有趣但不一定实用的用法。
则在数据包中输出相应文本时,若无资源包或资源包错误,则会显示 The resourcepack does not Installl correctly or Launch
以提示玩家资源包未加载。
§3.4 自定义物品模型
由于1.14添加了 CustomModelData
,我们可以拥有几乎无穷多的物品模型。为了便于他人整合和解决冲突,建议将 CustomModelData
的前四位固定以确定模组的独有区段,后四位作为模组不同模型的值,例如 12340000-12349999
之间。此外,建议 CustomModelData
不要超过 16777216
,原因见 custom_model_data 的使用限制。
我们会给出一个例子来说明实现流程。首先在 minecraft
下的胡萝卜钓竿物品模型中添加额外的模型 (overrides
),并引用我们自定义的模型。
注意 custom_model_data
需要按照从小往大的次序,否则会导致后面的覆盖前面的。然后创建自定义的模型
最后绘制纹理,并将其保存为 assets/craftingpp/textures/element/red_force_of_fire.png
。这样我们就设计好了这个物品模型,在 §5 物品设计我们将会说明如何使用该模型。
§3.5 模型

Models
模型 (Model) 是一个描述形状和指定纹理的JSON文件。模型可以理解成一些可以旋转的长方体的拼接,每个长方体的若干个面贴上了纹理图案。长方体的厚度可以为0,也可以只有若干个面。
只有 minecraft
命名空间下特定名称的文件才对应特定的物品/方块模型,例如 minecraft/models/item/carrot_on_a_stick.json
表示胡萝卜钓竿的物品模型,minecraft/models/block/stone.json
表示石头的方块模型。
我们通过几个例子来理解下模型文件的语法。



更详细的语法参考模型 - Minecraft Wiki,最详细的官方我的世界百科。
如果我们循着模型 minecraft:item/handheld
往上,最终会得到模型 builtin/generated
。这种模型是内建的,不能通过资源包来修改。
由于 scale
至多为4,而 from to
至多为-16
到32
,因此模型最多可以放大至12
倍。想要更大的模型可以通过分段来旋转拼接而成,参阅
因为不知道发到哪里只好发过来了 也不知道火没火星 毕竟我没有画纹理的朋友。。。
模型在不同位置仅有放缩旋转平移的差别,想要实现视觉上的明显不同,可参阅【1.14】物品头部/背包/手持显示不同纹理/模型。
方块状态我们一般不会用到,而且语法比较简单,可直接参阅 wiki,这里不做赘述。
§3.6 纹理

纹理
Textures
纹理 (Texture) 的绘制需要用到诸如 Photoshop 之类的画图软件,具体请参考纹理版或网络上的相关教程。
当模型调用的纹理不存在时,会显示紫黑色的纹理。如果模型是正确的,你仍然可以看出正确的模型形状。
纹理可以是动态的。动态纹理需要高为宽的整数倍,除非指定了 width
和 height
。当纹理的高度为宽度的 x
倍时,可以有 x
帧,分别对应纹理自上而下均匀划分的 x
个块,从 0
开始。还需要一个 mcmeta
文件确定动画,例如 foo.png
对应
§3.7 音效

音效
Sounds
sounds.json
音效 (Sound) 文件为 assets/命名空间/sounds
文件夹下的 ogg
文件,它需要JSON文件 assets/命名空间/sounds.json
来调用。音效文件会覆盖之前资源包的同名文件,但 sounds.json
默认会追加到上一个资源包中的相应内容。原版的音效文件和 sounds.json
并不位于游戏本体资源包,而是位于资源文件夹下。
例:
§3.8 字体

字体
Fonts
【1.13】如何添加图片?
字体 (Font) 提供了每个字符对应的资源位置和额外信息,其中 minecraft:default
给出了默认字体的样式,而 minecraft:alt
给出了附魔台所用的默认字体。在原始JSON文本中,若未指定字体则为 minecraft:default
的字体样式。
如果 type
为 space
,则表示该字符表示空格,此时格式为
我们来看一个例子。
我们可以用 \u
开头来表示不容易打出的字符,参考Unicode® Character Table,这与直接使用相应字符是等价的。
对于单纯的空格,我们需要使用 space
字形提供器。
利用这种方式,我们可以做到在成书、玩家快捷栏上方、聊天区域、物品名称等地方显示图片。利用负长度空格和垂直偏移,我们可以将图片显示在屏幕的任一位置。
例:我们在自定义字体中将0~9和:的纹理放大了一倍,并将其移动到左上角,使得其显示比通常位置高。然后利用负宽度空格将字符位置重新定位到快捷栏左侧,显示第二行文字。
§3.9 着色器
着色器
Shaders
原版着色器指导
几个原版着色器示例
原版资源包着色器与动画研究心得
不会有人看的深度缓冲着色器分析&用途
核心着色器浅析
着色器 (Shader) 用于描绘如何渲染游戏,包含后处理着色器和核心着色器。
§3.9.1 后处理着色器

后处理着色器会在游戏已经渲染好画面以后再起效,它们能够接受整个屏幕的像素作为输入,然后逐像素地输出。除了一些有限的特例以外,着色器所能接受到的唯一数据就是正显示在屏幕上的内容。我们只能通过在资源包替换 minecraft/shaders/post/文件名.json
下的下述文件来修改:
creeper.json
将在以苦力怕视角旁观时启用;invert.json
将在以末影人视角旁观时启用;spider.json
将在以蜘蛛视角旁观时启用;entity_outline.json
将在屏幕中有具有发光状态效果的实体时启用;transparency.json
将在玩家启用了“极佳”图像品质时启用。
在后处理着色器渲染管线中,除了玩家自定义的缓冲层,系统还预设了
为发光着色器准备的、预先填充好的特殊缓冲层:
minecraft:main
(没有水、方块实体和其他一些东西) 和final
(纯色的实体,颜色是该实体所在队伍的颜色);为实体视角着色器准备的、预先填充好的特殊缓冲层:
minecraft:main
(所有内容都已渲染完成)。
当屏幕渲染完成时,若玩家处于上述5种情形,则会对调用相应的后处理着色器渲染管线文件来依次对缓冲层进行着色器程序操作,并最终返回到缓冲层 minecraft:main
。
我们可以在 minecraft/shaders/program
文件夹下创建自定义名称的着色器程序文件。其中顶点着色器会对每个顶点起效,将顶点的位置作为输入,并产生一个经过变换的位置作为输出。片段着色器会对每个像素起效,并逐像素产生输出层。
这里全局变量的 count
为 values
数组的长度,当为浮点数 (float
) 时,实际为 count
长度的浮点数数组 float, vec2, vec3, vec4
;int
类似,为 int, ivec3, ivec3, ivec4
;矩阵为 matrix4x4, matrix3x3, matrix2x2
。
顶点着色器和片段着色器程序可参考原版着色器的 vsh, fsh
文件。着色器中的数据类型包括标量 bool, int, uint, float, double
,向量 bven, iven, uven, ven, dven
,n=2,3,4
为向量长度;矩阵 matn, matnxm
为列优先的矩阵,n,m=2,3,4
。构建变量时,可以使用其它变量作为其部分。全局变量可以被声明为
in
,只能被顶点着色器读取,它自动包含了当前顶点的 Position(位置)属性;uniform
,可以被顶点着色器与片段着色器读取,对所有的顶点或像素都会保持恒定不变,它们的值可以通过后处理 JSON 文件传入,否则将会使用在着色器程序 JSON 文件中定义的默认值;out
,由顶点着色器声明并赋值,然后可在片段着色器中被读取,这些值会在顶点间插值计算出来。
着色器程序中的 main
函数会在该着色器程序被调用时执行。更多关于着色器程序的内容请点击上方链接来阅读。
例:这个片段着色器会放大图像中心圆形区域图案。屏幕上左下角像素坐标为 (0,0)
,右上角为 (1,1)
。
§3.9.2 核心着色器
所有能在屏幕上看到的东西都是由核心着色器渲染的,核心着色器文件位于 assets/minecraft/shaders/core
文件夹下。游戏的每个部分会调用相应的核心着色器来渲染。如果我们不希望对着色器进行全局修改,我们可以通过纹理坐标检测在渲染什么,然后进行相应的着色器程序。然而,纹理的 atlas 依赖于加载的所有资源包,因此一旦添加了纹理,纹理坐标将会发生改变。更详细的内容请点击上方链接来阅读。
§3.10 文本

文本
Texts
玩家首次进入末地的主世界返回传送门时,会播放终末之诗和制作人员名单。文本PLAYERNAME将会被玩家名称代替。我们可以修改之以显示模组的一些内容。文件 splashes.txt
中每一行表示一个单独的闪烁标语,可以使用样式代码。
1.16以及更早版本可使用样式代码,以及使用 [C]
来表示居中,且这些版本制作人员名单是txt格式。