本篇教程由作者设定使用 CC BY-NC-SA 协议。
什么是变量?
变量是MC中的一些可读参数,它们记录了玩家的行为,例如抬头的视角、行走的速度、玩家的生命值等等。通过读取这些变量,可以在模型上实现一些自定义的行为。
例如:
当抬头时背后的头发也向后旋转来抵消抬头的旋转,避免整个头发因为抬头的旋转而出现头发穿胸而过。
例如:
检测玩家的垂直速度,让头发在下落时飘起来,让模型更加真实。
变量有哪些种类?
可读变量:query.xxx 可读不可写,只记录了实体或游戏中的实时行为。可缩写为q.xxx。
实体变量:variable.xxx 可读可写,存储于实体中,需要通过赋值来写入。可缩写为v.xxx。
临时变量:temp.xxx 可读可写,临时存储的变量,在一个动画循环之后就会销毁。不可缩写。
常驻变量:variable.roaming.xxx 等同于实体变量,但是在退出游戏或者切换维度时不会重置,可缩写为v.roaming.xxx。
怎么修改实体变量?
实体变量需要通过赋值来更改其数值,否则其初始数值为null。
赋值符号是=
(注)=是赋值,==才是等于
例:variable.jump=query.is_jumping。
query.is_jumping可以读取玩家是否处于跳跃状态,并且是实时的,假设我需要做一个跳劈(MC的原版机制,在跳跃下落过程中攻击会造成暴击),那我就可以使用query.is_jumping来读取玩家是否处于跳跃状态,但是query.is_jumping有个缺点,它是实时变化的,当玩家落地时query.is_jumping的数值马上会变成0,如果想只在动画的开头检测到跳跃,之后的落地都不会改变,那就需要用到实体变量了。
在动画的开头variable.jump=query.is_jumping,当玩家在动画播放的开头时处于跳跃状态,variable.jump的数值就是1,并且之后不对variable.jump做任何修改时,variable.jump的数值会一直保持为1,直到下次对其赋值。
实体变量在YSM模型设计里如何使用?
除了刚才提到的跳劈检测,还有例如变身。ysm默认模型之一的酒狐就是一个例子。
在酒狐的parallel动画里,给人形态和狐狸形态的缩放分别给了1-v.roaming.a和v.roaming.a
同时在变身动画里,第一帧是v.roaming.a=1-v.roaming.b;第二帧是v.roaming.b=v.roaming.a
来分析一下上面的变身是怎么实现的。
在变身动画里,第一帧是v.roaming.a=1-v.roaming.b,v.roaming.a和v.roaming.b初始的数值是null,在ysm里,null值等同于0。
所以第一帧为v.roaming.a=1-0;此时v.roaming.a的数值为1。
第二帧是v.roaming.b=v.roaming.a,此时v.roaming.a的数值为1。
那么第二帧为v.roaming.b=1,此时v.roaming.b的数值为1。
Parallel作为并行动画会持续播放,此时人形态的缩放为1-v.roaming.a,也就是1-1=0,那么人形态隐藏,而狐狸的缩放为v.roaming.a,也就是1,此时狐狸形态显示。
那么第二轮变身,依旧是上述流程,但是此时v.roaming.a和v.roaming.b的数值都为1。
那么第一帧为v.roaming.a=1-1;此时v.roaming.a的数值为0。
第二帧是v.roaming.b=v.roaming.a,此时v.roaming.a的数值为0。
那么第二帧为v.roaming.b=0,此时v.roaming.b的数值为0。
此时人形态的缩放为1-v.roaming.a,也就是1-0=1,那么人形态显示,而狐狸的缩放为v.roaming.a,也就是0,此时狐狸形态隐藏。
还有许多例子,比如多段攻击,也是做一个计数器,通过检测实体变量来进行动画切换。
这里我就不再详细描述了,放一段我常用的计数器:
第一帧v.a=v.b+(v.b>=2?-v.b:1)
第二帧v.b=v.a
这个molang会让v.a初始为1,每播放一次动画都会+1,直到累计到3时归零,也就是播放顺序是1 2 0 1 2 0以此类推,可以把2改成你需要的段数,例如你做了八段攻击,那就是v.a=v.b+(v.b>=7?-v.b:1),播放顺序是1 2 3 4 5 6 7 0……
甚至你也可以使用math.random函数来随机播放,例如v.a=math.random_integer(0,7)
而基于实体变量这个可读可写可存储的特性,甜粽子大佬也写了一系列物理模拟相关的动画,这些等下期再讲。
怎么调试和优化实体变量?
如果实体变量出了问题,可以用指令去找出并解决。
例如我想知道为什么这个实体变量执行的时候出错了,我怎么看到它在执行过程中的数值变化?
这就需要用到/ysmclient指令
用法:
/ysmclient molang watch add post 命名 变量名
例:
/ysmclient molang watch add post v.a v.a
/ysmclient molang watch add post tiaoyue q.is_jumping
输入完之后打开ysm的调试界面,也就是alt+b连按两下,就可以看到你添加的变量的实时数值了,这样方便你进行debug。
还想学更多?
网上有很多教程和资源,可以学更多关于实体变量的知识。
例如基岩版开发wiki:
https://bedrock.dev/zh/docs/stable/Molang
如果你觉得已经掌握了基础,可以挑战一些更高级的玩法。
也可以加入一些玩家社区,跟其他玩家/模型作者一起交流学习。