图像是垂直条带
一个拥有四帧动画的 16×16 材质是一个 16×64 的 PNG:每个帧都是正方形,从上到下堆叠,第一帧在顶部。游戏根据宽度推断帧大小,因此高度只需是它的整数倍即可。这正是原版为火灾、水和海晶石等内容制作动画的方式。
prismarine.png 16 wide × 64 tall = 4 frames of 16×16
┌────────┐ frame 0
├────────┤ frame 1
├────────┤ frame 2
├────────┤ frame 3
└────────┘The .mcmeta file
材质旁边放着一个文件,具有相同的名称加上 .mcmeta — 这样 prismarine.png 伴随着 prismarine.png.mcmeta. 请注意,它在中间保留了 .png;这经常让人踩坑。
{
"animation": {
"frametime": 2,
"interpolate": true
}
}如果没有此文件,高 PNG 不会被视为动画 —— 它会被视为被压扁、大小错误的材质。单纯的条带没有任何作用。
frametime
每一帧保持的游戏刻数。一秒钟有 20 个刻,因此 frametime: 2 是每秒十帧,而 frametime: 20 是每秒一帧。其默认值为 1 —— 每刻一帧,这非常快,通常不是你想要的。
interpolate
使用 interpolate: true,Minecraft 会在前后两帧之间平滑混合,而不是直接切换。这就是原版如何仅从少数几帧中产生缓慢微光效果的方法 —— 它会为你生成中间的一切。
将其用于渐变的事物:发光、水、柔和的色彩转变。对于任何应被视为明显步骤的事物(如闪烁的灯光或旋转的图案),请将其关闭,因为混合只会产生糊状效果。
控制帧顺序和计时
默认情况下,帧按文件顺序播放并循环。 frames 数组会覆盖这一点 —— 你可以重新排序帧、重复它们,并为各个帧指定它们自己的持续时间:
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
{ "index": 2, "time": 20 },
1
]
}
}这会播放帧 0、1、2、1 —— 采用往返而不是循环 —— 并在其他帧使用默认的 4 个刻时,将帧 2 保持整整一秒。以这种方式重用帧可以使 PNG 保持较小;弹跳不需要在图像中重复其帧。
保持简短
无需编写 JSON 即可实现
The 编辑器 将动画处理为帧而不是文件格式:你构建帧、设置速度,条带及其 .mcmeta 会在导出时以正确的命名生成。你还可以导入 GIF 并将其转换为帧,这通常比手绘循环更快。
如果某些东西的播放顺序错误或根本不播放,几乎总是 .mcmeta 名称的问题 —— 检查是否有 texture.png.mcmeta 而不是 texture.mcmeta. 其他失败原因涵盖在 为什么你的材质包不起作用.
