基岩版皮肤包由四个文件组成,其中两种故障模式是静默的
两个必须不同的 UUID,一个不可选的语言文件,以及会去除标点符号的皮肤键——因此“我的皮肤!”和“我的皮肤?”会变成同一个皮肤,且不报错。
一个 .mcpack 是一个扩展名不同的压缩包,而其中的皮肤包需要正好四种文件:
manifest.json a header and a skin_pack module, each with its own UUID
skins.json one entry per skin: texture, geometry, and a KEY
texts/en_US.lang the display names — skins.json holds only keys
*.png the textures themselves
这四种文件中有三种很容易正确处理。所有有趣的故障都源于它们之间的关系。
两个 UUID 必须不同
manifest.json 在其 header 中带有一个 UUID,并在其 skin_pack 模块中带有一个:
{
"format_version": 1,
"header": { "name": "…", "uuid": "…", "version": [1, 0, 0] },
"modules": [ { "type": "skin_pack", "uuid": "…", "version": [1, 0, 0] } ]
}
它们是两个独立的身份——包本身,以及包内的内容——为两者重复使用同一个值是一个真正的错误,即使在构建时没有任何抱怨。
还有一个更微妙的后果:使用相同的 UUID 重新导入会被视为同一个包,Minecraft 会静默保留它已有的副本。编辑一个包,使用相同的标识符重新构建并重新导入,看起来就像什么都没做。本页面上的每个构建都因此获得了新的 UUID,这也是为什么重新导入一个编辑过的包需要重新下载而不是重新压缩旧包。
语言文件不是可选的
skins.json 从不包含显示名称。它包含一个键,而 texts/en_US.lang 将该键映射到文本:
skinpack.<PackKey>=My Pack
skin.<PackKey>.<SkinKey>=My First Skin
如果发布时没有语言文件,则不会报错——每个皮肤都会以其原始键在游戏中显示。这是手动组装的包看起来损坏但验证正常的最常见原因。
键会去除标点符号,重复的会合并
键必须是字母数字。其他所有内容都会被移除:
| 你的名称 | 键 |
|---|---|
My Skin! | MySkin |
My Skin? | MySkin |
Skin #2 | Skin2 |
!!! | Skin1 (按位置回退) |
前两行是陷阱。两个人类明确命名的皮肤会变成一个键,而重复的键不会报错——它会在游戏中静默合并成一个皮肤。你上传了十二个皮肤,得到了十一个,却没有任何提示告诉你哪个不见了。
这里的构建器通过在任何已使用的键后面附加一个计数器来防止这种情况,因此第二个 MySkin 变成了 MySkin1。如果你手动组装一个包,这一点值得注意:你需要检查的是去除标点符号后的名称,而不是你输入的名称。
一个完全由标点符号组成的名称会什么都不留下,因此它会回退到 Skin 加上它在列表中的位置。
纤细模型需要正确的几何体字符串
每个条目都命名一个模型,有两种:
geometry.humanoid.custom— 经典,4像素手臂geometry.humanoid.customSlim— 纤细,3像素手臂
弄错这一点通常会导致Alex比例的皮肤出现Steve的方块手臂。纹理是正确的;模型是请求的那个。皮肤包构建器通过采样第四个手臂列来推断它,但手写的 skins.json 必须明确说明,并且这两个字符串在末尾有四个字符的差异。
条目还带有 "type": "free",披风是一个可选的额外 PNG,从同一个条目中引用——披风随皮肤包一起传输,而不是作为单独的下载。