本篇教程由作者设定使用 CC BY-NC-SA 协议。

什么是变量?

变量是MC中的一些可读参数,它们记录了玩家的行为,例如抬头的视角、行走的速度、玩家的生命值等等。通过读取这些变量,可以在模型上实现一些自定义的行为。

 

例如:

当抬头时背后的头发也向后旋转来抵消抬头的旋转,避免整个头发因为抬头的旋转而出现头发穿胸而过。

例如:

检测玩家的垂直速度,让头发在下落时飘起来,让模型更加真实。

 

变量有哪些种类?

  1. 可读变量:query.xxx 可读不可写,只记录了实体或游戏中的实时行为。可缩写为q.xxx。

  2. 实体变量:variable.xxx 可读可写,存储于实体中,需要通过赋值来写入。可缩写为v.xxx。

  3. 临时变量:temp.xxx 可读可写,临时存储的变量,在一个动画循环之后就会销毁。不可缩写。

  4. 常驻变量: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

如果你觉得已经掌握了基础,可以挑战一些更高级的玩法。

也可以加入一些玩家社区,跟其他玩家/模型作者一起交流学习。