请选择 进入手机版 | 继续访问电脑版
查看: 4131|回复: 7

[交流] 分享一些molang的知识,来源于自己日常的作业和与老外经验分享交流的结果

[复制链接]

3

主题

138

回帖

65

积分

Lv.3 矿物能手

UID
6472670
小麦
3
金锭
422
下界之星
0
发表于 2020-1-20 12:54:04 | 显示全部楼层 |阅读模式 IP:福建
本帖最后由 Minehero-境界 于 2020-3-22 20:59 编辑

如题,molang是mojang为基岩版Addon(数据驱动包)专门设计在游戏运行时使用的表达式语法。它的功能区别于微软JS API、Modsdk,开发者需要这些底层的脚本语法来帮助自身掌控游戏运行当中遇到的各种因素,如生物的渲染、自定义模型、材质、行为等。大家在做自定义生物中都要了解它的使用方法,但因为微软的wiki文档写的属实有丶难顶,无论是语言门槛还是错误引导,都会让我们学习得相当吃力。我希望能把自己学习的一部分经验和与老外交流的结果分享给大家,因此开了这贴,下面来看一下molang的一些tips。
variable即是变量,微软在原版生物的材质包定义文件中,常常声明很多变量并赋值query函数给它们,所以你可能会在动画控制器、渲染控制器当中看到各种各样的变量而不知道它的作用,这里我个人推荐追根溯源,我们可以从res/entity里的各个生物定义文件中找到它们,虽然我个人也觉得用变量作为动画控制器的切换条件实在是有点累赘,但有些硬编码的通用variable还是很好用的。我个人没有打草稿的习惯,所以现在我只能给出一个我常用的官方通用变量,variable.attack_time,它会在生物插入melee_attack行为后,随生物攻击而产生值变化,我们可以根据这个值的变动来进行一些额外的操作,如播放攻击动画,在entity event监听生物进攻的讯号而执行一个生物行为包事件等。
query等价于内建函数,有些query函数需要传入参数,有些不需要,具体情况请看wiki。每个query函数的功能不一,它们的功能也都有写在wiki上,但这边我只会特别挑出一些query来讲,因为这篇文章只是提供大家一些我个人觉得实用的技巧。
场景1:query.target_x_rotation、query.target_y_rotation,这两个函数被运用在官方的look_at_target动画,但它其实不在生物没有目标时也有用,我在自定义抛射物时,常常会苦恼怎么让自定义抛射物像原版弓箭一样始终朝着方向看,最后发现只要新增一个如下的动画并绑定到生物身上即可。
  1. "loop": true,
  2. "bones": [
  3. {"main": {"rotation": ["query.target_x_rotation", "query.target_y_rotation", 0]}}
  4. ]
复制代码
场景2:query.life_time,这个函数可以理解为生物创建后的生命周期时间戳,从0开始自增,类似python中的time.time。最近有些其他的开发者想要做延时的动画效果或者延时的entity event,比较常用的方法是开一个timer行为,但其实用query.life_time配合变量是更棒的。
  1. {
  2.         "format_version": "1.8.0",
  3.         "animation_controllers": {
  4.                 "controller.animation.brontosaurus.general": {
  5.                         "states": {
  6.                                 "default": {
  7.                                         "parameters": [ "query.ground_speed" ],
  8.                                         "animations": [
  9.                                                 {
  10.                                                         "look_at_target": []
  11.                                                 },
  12.                                                 {
  13.                                                           "idle": [
  14.                                                                 {
  15.                                                                   "0.0": 1.0,
  16.                                                                   "1.0": 0.0
  17.                                                                 }
  18.                                                         ]
  19.                                                 },
  20.                                                 {
  21.                                                           "move": [
  22.                                                                 {
  23.                                                                   "0.0": 0.0,
  24.                                                                   "1.0": 1.0
  25.                                                                 }
  26.                                                         ]
  27.                                                 }
  28.                                           ],
  29.                                         "transitions": [//随着游戏帧更新,当生物进攻时,赋值当前生物的生命时间戳给attack变量
  30.                                                 {"attack": "variable.attack=query.life_time;return query.is_delayed_attacking;"}
  31.                                         ]
  32.                                 },
  33.                                 "attack": {
  34.                                         "animations": [
  35.                                                 {"attack": []}
  36.                                         ],
  37.                                         "transitions": [//当当前生物的生命时间戳与attack变量相减大于攻击动画播放时间,切换回缺省状态
  38.                                                 {"default": "query.life_time - variable.attack > 2.9666"}
  39.                                         ]
  40.                                 }
  41.                                 }
  42.                         }
  43.                 }
  44.         }
  45. }
复制代码
  1. {
  2.         "format_version": "1.8.0",
  3.         "animation_controllers": {
  4.                 "controller.animation.prophet.charged": {
  5.                         "states": {
  6.                                 "default": {
  7.                                         "on_entry": [
  8.                                                 "@s minecraft:on_start_shoot"
  9.                                         ],
  10.                                         "transitions": [
  11.                                                 { "prepare_shoot": "variable.cooldown=query.life_time;return query.is_charged;" }//当生物发射抛射物时,贮存当前生命时间戳
  12.                                         ]
  13.                                 },
  14.                                 "prepare_shoot": {
  15.                                         "transitions": [
  16.                                                 { "shoot": "return query.life_time - variable.cooldown > 0.9667;" }//当发射动画结束,进入冷却时间4秒的状态
  17.                                         ]
  18.                                 },
  19.                                 "shoot": {
  20.                                         "on_entry": [
  21.                                                 "@s minecraft:on_stop_shoot"
  22.                                         ],
  23.                                         "transitions": [
  24.                                                 { "default": "return query.life_time - variable.cooldown > 4.9667;" }//当冷却时间结束,回到缺省状态,重新给予生物发射抛射物的行为,实现控制生物远程攻击cd的效果。这样相对麻烦了一点,但因为原版的远程攻击行为一旦要配合动画,就无法设置攻击间隔,也是相对遗憾的地方吧。
  25.                                         ]
  26.                                 }
  27.                         }
  28.                 }
  29.         }
  30. }
复制代码
2020/3/22 更新
  1. {
  2.   "minecraft:movement": {
  3.     "value": 0.25 //每tick移动0.25m
  4.   }
  5. }
复制代码
今天给大家一个计算速度的小公式,在基岩版Add-on中设置生物的速度时,你可能会有根据速度大小切换行走和跑步的动画的需求。那么我推荐使用query.ground_speed来判断生物的移动速度以切换移动和跑步的动画。公式为 实际移动速度 = movement * 20 tick * speed_mutiple,如果方块有friction的话还得再* frction,例如灵魂沙等等有奇怪摩擦力的方块。
所以假设我的生物移动速度为0.25,则实际移动速度为0.25 * 20 * 1 (移速加成我假设是1.0) = 5m/s。
所以假设播放跑步的动画,切换的依据则是query.ground_speed > 5.0。

4

主题

1093

回帖

345

积分

Lv.2 石器学徒

UID
3409745
小麦
4
金锭
1241
下界之星
0
发表于 2020-1-20 17:43:39 | 显示全部楼层 IP:广东

22

主题

317

回帖

174

积分

Lv.4 怪物猎人

UID
373726
小麦
3
金锭
609
下界之星
0

开发者认证勋章

发表于 2020-1-27 12:37:50 | 显示全部楼层 IP:山西

13

主题

26

回帖

23

积分

Lv.2 石器学徒

UID
6761702
小麦
0
金锭
91
下界之星
0
发表于 2020-3-21 11:11:56 来自手机 | 显示全部楼层 IP:浙江
谢谢楼主,我终于知道了让自定义抛射物像原版弓箭一样始终朝着方向看的方法,以及其他的知识。此帖我会一直收藏并关注的!

3

主题

138

回帖

65

积分

Lv.3 矿物能手

UID
6472670
小麦
3
金锭
422
下界之星
0
 楼主| 发表于 2020-3-21 23:01:09 | 显示全部楼层 IP:福建
永远的XBB 发表于 2020-3-21 11:11
谢谢楼主,我终于知道了让自定义抛射物像原版弓箭一样始终朝着方向看的方法,以及其他的知识。此帖我会一直 ...

1.15其实有一套query可以用了,叫做query.camera_rotation,可以让2d抛射物贴图一直朝向照相机,不过也谢谢你的支持

13

主题

26

回帖

23

积分

Lv.2 石器学徒

UID
6761702
小麦
0
金锭
91
下界之星
0
发表于 2020-3-23 16:32:03 来自手机 | 显示全部楼层 IP:浙江
嗯,2d抛射物我是用空白模型空白贴图,然后给它粒子效果,粒子就只是一个普通的贴图,因为粒子总会面向玩家

1

主题

8

回帖

3

积分

Lv.1 新手木匠

UID
6603243
小麦
0
金锭
84
下界之星
0
发表于 2020-3-26 18:22:31 来自手机 | 显示全部楼层 IP:浙江
支持

8

主题

31

回帖

18

积分

Lv.1 新手木匠

UID
8662990
小麦
0
金锭
58
下界之星
0
发表于 2023-4-5 19:02:43 | 显示全部楼层 IP:陕西
支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部