本文档原作者酒石酸菌。

    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 ⾥⾯看起来应该是这样的:

    自定义模型完整指南-第1张图片

    

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,以及理解它的机制,我们从基岩版动画的机制说起。 基岩版动画的机制⾮常简单,在不同的时间点新建关键帧,设定某个组件的位置/旋转/缩放。当开始播放动画时,程序就会⾃动计算出补间动画,使组件从某个地⽅移动/旋转/缩放到另⼀个地⽅,从⽽做出动画的效果。

自定义模型完整指南-第2张图片


我们给每个关键帧设置的是⼀个具体的数字,决定了播放到此关键帧时,组件所处的位置/旋转的⻆度/缩放的⼤⼩:

自定义模型完整指南-第3张图片

    但是⼀些特殊情况下,这个数字不⼀定是固定的。⽐如我们期望玩家⼿持物品时摆动⻆度为 30 度,但空⼿时摆动⻆度为 60 度,这时我们就可以使⽤ MoLang 表达式了。 

    ⼀个常⽤的动画设计是显⽰/隐藏模型,⽐如我们期望在玩家穿戴头盔时,显⽰头盔组件。我们可以使⽤缩放功能来隐藏组件,当 组件的 X Y Z 缩放均为 0 时,该组件就被隐藏了,所以我们可以在 BlockBench ⾥⾯这么写:

自定义模型完整指南-第4张图片

    这⾥的 ysm.has_helmet 就是⼀个 MoLang 参数,它会在玩家穿戴头盔时返回数字 1,⽽在没有穿戴头盔时返回数字 0, 正好做到了我们想要的隐藏/显⽰功能。

     ⼀直以来,⻓发模型是⼀个极为头疼的问题。当玩家抬头时,⻓⻓的头发就会随头转动,直戳戳的穿⼊玩家的⾝体内。我们也可 以⽤ MoLang 来巧妙的解决这个问题。思路如下: 

        1. 当玩家仰头时,头发不再随头转动,⽽是垂直向下(也就是头发旋转⻆度与头部正好相反,互相抵消)

         2. 当玩家俯看时,头发随头转动(也就是旋转⻆度为 0) 那么我们就可以这样书写 MoLang 参数:

自定义模型完整指南-第5张图片

    我们来逐条介绍这个参数的意思: 

        这是⼀个条件式的写法,它的格式是这样写的  判断条件 ? 如果符合时返回的结果 : 如果不符时返回的结果 

        (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