将Molang变量转换为计分板数值
以下提供了一种将任意Molang(变量、查询等)数值即时读取到计分板的方法。请确保控制器中convert状态调用的动画名称与实体定义的动画名称(animation.namespace.molang_to_score)相匹配。
注意: 这两条命令必须作为初始化步骤在游戏世界中运行: /scoreboard objectives add MoLang dummy/scoreboard players set "#10" MoLang 10
BP/animation_controllers/molang_to_score.animation_controllers.json
json
"controller.animation.namespace.molang_to_score": {
"initial_state": "idle",
"states": {
"idle": {
"transitions": [ { "convert": "<开始转换的条件>" } ],
"on_exit": [ "/scoreboard players set @s MoLang 0", "/scoreboard players set \"#var\" MoLang 0", "v.convert = <待转换的变量>;", "v.digit = 1000000000;" ]
},
"convert": {
"animations": [
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score",
"molang_to_score"
],
"transitions": [ { "idle": "1" } ]
}
}
}BP/animations/molang_to_score.animation.json
json
"animation.namespace.molang_to_score": {
"animation_length": 10.0,
"anim_time_update": "t.digit = Math.mod(Math.floor(v.convert / v.digit), 10) + 0.1; v.digit = v.digit / 10; return t.digit;",
"timeline": {
"0.0": [ "/scoreboard players operation @s MoLang *= \"#10\" MoLang", "/scoreboard players operation @s MoLang += \"#var\" MoLang", "/scoreboard players set \"#var\" MoLang 0" ],
"1.0": [ "/scoreboard players set \"#var\" MoLang 1" ],
"2.0": [ "/scoreboard players set \"#var\" MoLang 2" ],
"3.0": [ "/scoreboard players set \"#var\" MoLang 3" ],
"4.0": [ "/scoreboard players set \"#var\" MoLang 4" ],
"5.0": [ "/scoreboard players set \"#var\" MoLang 5" ],
"6.0": [ "/scoreboard players set \"#var\" MoLang 6" ],
"7.0": [ "/scoreboard players set \"#var\" MoLang 7" ],
"8.0": [ "/scoreboard players set \"#var\" MoLang 8" ],
"9.0": [ "/scoreboard players set \"#var\" MoLang 9" ]
}
}工作原理: 当转换开始时,控制器会重置玩家的Molang分数和#var(虚拟玩家)的Molang分数。初始化转换变量v.convert并将数字变量v.digit设置为获取第10位数字(10^10)。第一个动画运行后,将动画时间设置为第10位数字的值,并将数字变量设置为获取下一位数字(第9位,10^9)。由于时间轴会运行到设置时间之前的所有条目,"0.0"时间点条目总是会执行。这会将玩家的Molang分数乘以10以设置正确的位数,然后加上最后获取的数字(第一次运行时始终为0,因为控制器已重置#var)。该过程会重复执行11次以获取转换变量的全部10位数字。注意每个动画获取的是前一个动画设置的数字,因此需要运行11次动画。
要在游戏中进行转换测试,请将<开始转换的条件>设置为q.is_using_item,将<待转换的变量>设置为Math.random_integer(0, 9999)。拿起一个苹果开始食用,即可观察数值变化。





