我的世界自定义模型完整指南
本文档原作者酒石酸菌。
Yes Steve Model 模组主模型⽂件命名必须为 main.json 。其使⽤的动画⽂件进⾏了标准化设计,只需要按照特定的布局 ⽅式来制作,即可⾃动兼容。在运⾏游戏后,游戏主⽬录下的 config\\yes_steve_model\\custom\\default ⽂件夹下会⾃动⽣成模型标准模型和动画文件,你可以在其基础上进⾏⼆次修改和分发。
如何制作自定义模型
因为社群中模型命名标准不一,故统⼀对模型命名进⾏规范。
当然,你可以不遵守这些标准,模型依旧可以安全加载,但是将会无法正常使用默认动作,当然你可以自己制作适配自己模型的动画。
1.格式规范
①.书写格式
组名应该全部采⽤⼤写驼峰式,并采⽤规范英⽂单词描述,按照 形容词 + 名称 形式进⾏组合,⽰例如下:
左⼿臂: LeftArm
整个头部: AllHead
②.简洁原则
命名应该尽可能使⽤简洁易懂的英⽂单词,⽰例如下:
表⽰ 整个 使⽤ All ⽽不是 Whole ,因为前者更加简洁 表⽰ 眼睛 使⽤ Eyes ⽽不是 HeadEyes ,因为 眼睛 肯定处于 Head 分组中,⽆需强调
③.⽆意义分组
部分模型中为了⽅便旋转,位移。对部分模型进⾏了分组,但并不附加动画和其他操作,可使⽤ ⽗类 + 数字编号 的⽅式命 名,⽰例如下:
某 Mouth 分组为了模型制作⽅便,设置了多个分组,但并没有特定的意义,也没有动画。可将其命名为 Mouth1 , Mouth2 , Mouth3 等
④.特定组名
某些特定组名不允许更改,否则会导致游戏部分内容⽆法正常显⽰:
组名 | 说明 |
---|---|
Head | 游戏会默认添加头部随视⻆摆动的动画 |
LeftHand LeftHandLocator | 左⼿⼿持物品的定位组 LeftHandLocator 必须位于 LeftHand ⾥⾯ 由 LeftHandLocator 的旋转点定位⼿持物品 |
RightHand RightHandLocator | 右⼿⼿持物品的定位组 RightHandLocator 必须位于 RightHand ⾥⾯ 由 RightHandLocator 的旋转点定位⼿持物品 |
2.第⼀⼈称视⻆⼿部模型的制作
第⼀⼈称视⻆的⼿部模型必须命名为 arm.json ,可通过主模型⼆次修改获得该⽂件,它与主模型共⽤⼀套贴图。其制作⽅法 可参考如下步骤:
1. 将主模型⽂件复制⼀份;
2. 找到 LeftArm 和 RightArm 分组,将其复制到根⽬录下;
3. 删除整个 Root 分组;
4. 粘贴刚刚复制的 LeftArm 和 RightArm 分组;
5. 将 LeftArm 和 RightArm 分组的 X Y Z 旋转⻆度均修改为 0(内部分组不需要修改,修改后⼿臂应为垂直向下)。
我们还为⼿部模型添加了背景显⽰功能,在根⽬录下创建名为 Background 名字的分组,游戏将会在第⼀⼈称视⻆时将这个分 组渲染为背景。不受玩家⼿持物品、使⽤状态的影响。
最后,你做好的模型在 Blockbench ⾥⾯看起来应该是这样的:
3.贴图⽂件的制作
-
材质使⽤ png 格式材质,不建议使⽤半透明贴图,这会造成各种渲染错误;
-
材质⽂件名只能使⽤ ⼩写英⽂字符、数字、下划线 等字符,其他没有限制;
-
模型⽀持多个贴图,你可以放置若⼲份贴图⽂件,游戏均会智能识别
4.动画⽂件的制作
动画⽂件是可选选项。没有动画⽂件,或者缺失部分动画时,游戏均会智能调⽤默认的动画⽂件。如果你的模型是按照默认模型 ⼆次修改的,那么即可完美兼容。
游戏内只有⼀个动画是代码添加的,不可修改: 头部随⿏标摆动的动画:智能识别 Head 分组添加的动画
如果你不喜欢这个代码控制的动画,只需要将头部分组起个其他的名字即可
如下动画是⾃定义的主动画,放置于 main.animation.json ⽂件中,可进⾏⼆次修改:
名称 | 作用 | 备注 |
---|---|---|
walk |
在玩家普通行走时的动画 |
循环播放 |
run |
在玩家疾跑时的动画 |
循环播放 |
climbing |
玩家在活板门下的动画 |
循环播放 |
sneaking |
玩家潜行 ,但不移动时的动画 |
循环播放 |
sneak |
玩家潜行 ,并且行走时的动画 |
循环播放 |
swim |
玩家游泳时的动画 |
循环播放 |
swim_stand |
玩家在水中站立式游泳的动画 |
循环播放 |
attacked |
玩家被攻击时的动画 |
单次播放 |
jump |
玩家离开地面时的动画 |
飞行和跳跃都调用此动画 ,循环播放 |
fly |
玩家在鞘翅飞行时播放的动画 |
循环播放 |
boat |
玩家坐在船上时的动画 |
循环播放 |
use_righthand |
玩家使用右手时播放的动画 |
单次播放 |
use_lefthand |
玩家使用左手时播放的动画 |
单次播放 |
sleep |
玩家睡觉时的动画 |
循环播放 |
ride |
玩家骑马 (驴) 时的动画 |
循环播放 |
ride_pig |
玩家骑猪时的动画 |
循环播放 |
sit |
玩家坐下时的动画 |
循环播放 |
idle |
无任何操作时的动画 |
循环播放 |
以下是八个并行动画 ,并行动画与主动画互相独立 ,也放置于main .animation .json文件中。用于制作那些无论在什么情况下均会播放的内容:尾巴、耳朵的摆动 ,眨眼动画等等。
名称 | 作用 | 备注 | |
---|---|---|---|
parallel0 parallel2 parallel4 parallel6 |
parallel1 parallel3 parallel5 parallel7 |
与主动画互相独立 ,同时播放 |
循环播放 |
以下动画是八个额外动画 ,额外动画需单独放置于 放:extra .animation .json 文件中 ,这些动画会在使用动画轮盘时进行播
名称 | 作用 | 备注 | |
---|---|---|---|
extra0 extra2 extra4 extra6 |
extra1 extra3 extra5 extra7 |
使用动画轮盘播放对应额外动画 |
依据动画文件设定的循环类型进行播放 |
注意:并行动画优先级高于主动画 ,如果主动画和并行动画同时操作了同⼀个骨骼 ,那么并行动画将会覆盖主动画。
MoLang 语法拓展和介绍
MoLang 是 mojang 官⽅为基岩版动画设计的⼀种极其简单的语⾔,我们可以通过 MoLang 实现各种复杂的动画。
为了更加清晰的说明什么是 MoLang,以及理解它的机制,我们从基岩版动画的机制说起。 基岩版动画的机制⾮常简单,在不同的时间点新建关键帧,设定某个组件的位置/旋转/缩放。当开始播放动画时,程序就会⾃动计算出补间动画,使组件从某个地⽅移动/旋转/缩放到另⼀个地⽅,从⽽做出动画的效果。
我们给每个关键帧设置的是⼀个具体的数字,决定了播放到此关键帧时,组件所处的位置/旋转的⻆度/缩放的⼤⼩:
但是⼀些特殊情况下,这个数字不⼀定是固定的。⽐如我们期望玩家⼿持物品时摆动⻆度为 30 度,但空⼿时摆动⻆度为 60 度,这时我们就可以使⽤ MoLang 表达式了。
⼀个常⽤的动画设计是显⽰/隐藏模型,⽐如我们期望在玩家穿戴头盔时,显⽰头盔组件。我们可以使⽤缩放功能来隐藏组件,当 组件的 X Y Z 缩放均为 0 时,该组件就被隐藏了,所以我们可以在 BlockBench ⾥⾯这么写:
这⾥的 ysm.has_helmet 就是⼀个 MoLang 参数,它会在玩家穿戴头盔时返回数字 1,⽽在没有穿戴头盔时返回数字 0, 正好做到了我们想要的隐藏/显⽰功能。
⼀直以来,⻓发模型是⼀个极为头疼的问题。当玩家抬头时,⻓⻓的头发就会随头转动,直戳戳的穿⼊玩家的⾝体内。我们也可 以⽤ MoLang 来巧妙的解决这个问题。思路如下:
1. 当玩家仰头时,头发不再随头转动,⽽是垂直向下(也就是头发旋转⻆度与头部正好相反,互相抵消)
2. 当玩家俯看时,头发随头转动(也就是旋转⻆度为 0) 那么我们就可以这样书写 MoLang 参数:
我们来逐条介绍这个参数的意思:
这是⼀个条件式的写法,它的格式是这样写的 判断条件 ? 如果符合时返回的结果 : 如果不符时返回的结果
(ysm.head_pitch > 0) :判断条件。玩家俯仰的⻆度是 -90 度到 90 度,这⾥判断玩家俯仰的⻆度是否⼤于 0 度,⽤ 括号括更加直观。
-ysm.head_pitch :当玩家俯仰⻆度⼤于 0 时(也就是抬头时),我们特意取反,把头发旋转⻆度抵消回去。
0 :当玩家俯仰⻆度⼩于 0 时(也就是俯视时),我们将其变成 0,这样头发就会随头旋转。 当然,MoLang 本⾝还有更为复杂的⽤法,这⾥我们暂时不再赘述。 我们在下⽅列举出本模组添加的各种变量,你可以⽅便的制作出各种动画:
参数名 | 作用 | 数值 |
---|---|---|
ysm.head_yaw | 玩家头部面向的角度(左右) | -80到80 |
ysm.head_pitch | 玩家头部俯仰的角度(上下) | -90到90 |
ysm.has_helmet | 玩家是否穿戴头盔 | 穿戴时为1,否则为0 |
ysm.has_chest_plate | 玩家是否穿戴胸甲 | 穿戴时为1,否则为0 |
ysm.has_leggings | 玩家是否穿戴护腿 | 穿戴时为1,否则为0 |
ysm.has_boots | 玩家是否穿戴靴子 | 穿戴时为1,否则为0 |
ysm.has_mainhand | 玩家主手是否持有物品 | 有物品时为1,否则为0 |
ysm.has_offhand | 玩家副手是否持有物品 | 有物品时为1,否则为0 |
ysm.is_close_eyes | 玩家是否应当闭眼(用于眨眼和睡觉) | 当闭眼时为1,不闭眼时为0 |
ysm.is_passenger | 玩家是否骑乘某个实体 | 骑乘时为1,否则为0 |
ysm.is_sleep | 玩家是否处于睡觉状态 | 睡觉时为1,否则为0 |
ysm.is_sneak | 玩家是否处于潜行状态 | 潜行时为1,否则为0 |
ysm.armor_value | 玩家护甲值 | 0到20 |
ysm.hurt_time | 玩家受伤值 | 当玩家受伤时此值为正数,否者为0 |