不道 发表于 2022-6-4 16:31:36

【基岩版附加包进阶教程】行为包的动画及动画控制器

本帖最后由 不道 于 2023-1-31 09:00 编辑

前排提醒:本教程默认读者已了解基本生物/物品/函数命令/指令等等的情况下进行
以上可以参考站内教程,如@782 的附加包教程系列


让我们开始吧!


行为包里的动画(animations)和动画控制器(animation_controllers),有些人可能会顾名思义,诶,这不就是一个保存动画,一个控制动画吗
其实吧,并不准确,因为在行为包里的这些,都是执行指令的(在神器addon里很常见)


动画控制器部分
首先我们得了解一个常识:在基岩版json里,是允许molang代码的存在的,但是在这个帖子里,大家只需了解molang代码中query是读取的意思就行了


接下来看一个典型的一个动画控制器代码

{
"format_version": "1.10.0",
"animation_controllers": {
    "controller.animation.kar98": {
      "initial_state": "setup",
      "states": {
      "setup": {
          "transitions": [
            {
            "kar98.5": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2"
            }
          ]
      },
      "kar98.5": {
          "animations": [
            "kar98shoot"
          ],
          "transitions": [
            {
            "kar98.4": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2 && query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/title @s actionbar 4/5",
            "/playsound addon.kar98",
            "/summon addon:shell ^-0.45^1.59^0.44",
            "/camerashake add @s 1 0.1 rotational"
          ]
      },
      "kar98.4": {
          "animations": [
            "kar98shoot"
          ],
          "transitions": [
            {
            "kar98.3": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2 && query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/title @s actionbar 3/5",
            "/playsound addon.kar98",
            "/summon addon:shell ^-0.45^1.59^0.44",
            "/camerashake add @s 1 0.1 rotational"
          ]
      },
      "kar98.3": {
          "animations": [
            "kar98shoot"
          ],
          "transitions": [
            {
            "kar98.2": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2 && query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/title @s actionbar 2/5",
            "/playsound addon.kar98",
            "/summon addon:shell ^-0.45^1.59^0.44",
            "/camerashake add @s 1 0.1 rotational"
          ]
      },
      "kar98.2": {
          "animations": [
            "kar98shoot"
          ],
          "transitions": [
            {
            "kar98.1": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2 && query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/title @s actionbar 1/5",
            "/playsound addon.kar98",
            "/summon addon:shell ^-0.45^1.59^0.44",
            "/camerashake add @s 1 0.1 rotational"
          ]
      },
      "kar98.1": {
          "animations": [
            "kar98shoot"
          ],
          "transitions": [
            {
            "kar98.0": "query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2 && query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/title @s actionbar 0/5",
            "/playsound addon.kar98",
            "/replaceitem entity @p slot.weapon.mainhand 0 addon:kar98_empty 1 0",
            "/summon addon:shell ^-0.45^1.59^0.44",
            "/camerashake add @s 1 0.1 rotational"
          ]
      },
      "kar98.0": {
          "transitions": [
            {
            "setup": "query.all_animations_finished"
            }
          ],
          "on_entry": [
            "/playsound addon.pull",
            "/title @s actionbar 弹药上膛"
          ]
      }
      }
    }
}
}

怎么样,是不是感觉晕晕的?别急,我们逐步分析

首先是formate_version,是定义mc引擎版本的
animation_controllers则是定义这个文件是一个动画控制器文件
下一行是定义这个控制器的id,格式是:animation.controllers.你的id
下面的initial_state,是定义这个控制器初始执行的级别,写你的状态自定义扩展名


接下来是重点了,transitions下面是定义当触发某一条件时,转到指定的级别(state)
冒号前面的字符串里填一个自定义的id(注意,在这个段落里下面的也要是这个id)
冒号后面则是一行molang代码,格式为query.生物特性
这里的生物特性是指生物的某一状态,比如上面例子代码中的query.get_equipped_item_name=='kar98' && query.item_remaining_use_duration > 2就是当生物持有‘kar98’这个物品(注意,这里不是填物品id,是填物品id冒号后的词)并且使用这个物品的时间大于2的时候转到state(下面的on_entry),类似的常用状态还有is_baby(是幼年状态),is_adult(是成年状态),is_using_item(正在使用物品),is_sneaking(正在潜行),all_animations_finished(所有动画播放完毕),具体可以去文档找找(当需要多个molang代码时,可以用&&或者||,这两个一个是并且的意思,也就是要满足两边所有条件才行,一个是或者的意思,也就是两边满足一个条件就行)

下面就是on_entry了
这里的字符串里填的是事件,一般可以是mc指令,实体事件(event)和molang代码

还有on_exist
这里是这个级别转到其他级别时执行的指令/事件/molang

还有animations
可以在这个级别被执行时执行动画

另外还有sounds,particles这些子组件,可以去文档看(


动画部分
老规矩,看代码
{
"format_version": "1.8.0",
"animations": {
    "animation.kar98.reload": {
      "loop": false,
      "animation_length": 4.8,
      "timeline": {
      "0.0": "/title @s actionbar 装填中",
      "0.1": "/playsound reload.kar98",
      "0.2": "/clear @s addon:kar98 0 1",
      "0.5": "/title @s actionbar 装填中",
      "1.0": "/clear @s addon:kar98_empty 0 1",
      "1.5": "/clear @s addon:792mag5 0 1",
      "2.0": "/title @s actionbar 装填中",
      "2.4": "/title @s actionbar 装填中",
      "2.5": "/title @s actionbar 装填完成",
      "3.3": "/give @s addon:kar98"
      }
    }
}
}

前面三行就不必多说了
loop是定义这个动画是否循环,后面填布尔值
animation_length是动画的时长
timeline是时间线
下面就是在这个时间线里每秒执行的指令(注意,时间点数不能大于动画时长)


如果你想让你这个动画能被动画控制器调用的话,需要在实体文件里添加调用名及调用文件id,然后再动画控制器里调用这个调用名,这里就不多说(肝不下去了)

没了

好氵啊啊啊啊啊啊啊啊

MC_ZC 发表于 2022-6-12 23:44:12

没人吗,我来占个沙发,感谢作者大大,让我一个萌新学习如何做addon,希望作者大大更新快点

无hu 发表于 2023-1-31 00:52:49

e,为毛线我的都加好了但是进游戏没动画
页: [1]
查看完整版本: 【基岩版附加包进阶教程】行为包的动画及动画控制器