【Minecraft BE Addon講座#13】3発動の設定とアニメーションの活用

本ページはアドオン講座#13、「アニコン編、3発動の設定とアニメーションの活用」です。
目次や、この講座については[#1の記事](https://qiita.com/pencilya/items/7b7e68265151f42a51ac)をご覧ください。

#アニコン編で理解してほしいこと！
**マイクラBEのゲーム、企画制作に必須**ともいえる**アニメーションコントローラー**。ここではアニコンとは何なのかから、アニコンを活用した**コマンドブロックにないコマンド実行条件の設定**まで、**何かしらのゲームを作れるレベルへの到達を目標**に解説していきます。

* (前提#3~#4)基礎編
* (前提#5)コンポネ編、entity.jsonの書き方
* (前提#8)ファンクション編復習、コマンドの実行主の理解
* (#11)アニコンとは？
* (#11)アニコンの追加方法
* (#11)アニコンの常時実行
* (#12)状態(state)とは？
* (#12)状態の切り替え(トランジション)方法
* (#12)条件の設定とMoLang
* (#12)[実践]空中ジャンプを作ってみよう
* (#13)3発動、on_entryとon_exitとアニメーション

#3発動って何？？？？？？？
先に断っておきますが、今思いついた言葉なので、正式な用語ではありません。(笑)

アニコンでは**発動タイミング、方法が実は3種類存在する**ため、その3種類のことを**3発動**と勝手に呼んでいます。

一つ目は[前回#12](https://qiita.com/pencilya/items/52b9fd6eb19bb47d5f07)で使用した、`"on_entry"`です。

`"on_entry"`は**「その状態になったときに1度だけ実行」**です。

二つ目は`"animations"`で、これは**「その状態である間、常時実行」**です。

三つ目は`"on_exit"`で、これは**「その状態から離れるときに1度だけ実行」**です。

流れとしては、その状態(state)になってから、別の状態にトランジションするまで、
`"on_entry"`→`"animations"`→`"animations"`→......→`"animations"`→`"on_exit"`
というイメージでしょうか。

`"on_entry"`と`"on_exit"`は単純で、[前回#12](https://qiita.com/pencilya/items/52b9fd6eb19bb47d5f07)でもやったように、カッコの中にスラッシュコマンドなり、イベントなりを書くだけです。
[前回#12](https://qiita.com/pencilya/items/52b9fd6eb19bb47d5f07)で作ったファイルに少し書き足してみました。

```behavior/animation_controllers/system.animation_controllers.json
{
	"format_version" : "1.10.0",
	"animation_controllers" : {
		"controller.animation.system" : {
			"initial_state" : "default",
			"states" : {
				"default" : {
					"transitions" : [
						{ "jump" : "(query.get_equipped_item_name == 'apple') && (query.is_using_item)"}
					]
				},
				"jump" : {
	                "on_entry": [
                        "/effect @s levitation 1 38 true",
                        "@s minecraft:entity_event"
                     ],
	                "on_exit": [
                        "/say state_end",
                        "@s minecraft:entity_event"
                     ],
					"transitions" : [
						{ "default" : "!query.is_using_item" }
					]
				}
			}
		}
	}
}
```

しかし、`"animations"`だけちょっと使い方が異なります。

#アニメーションの活用
元々アニコンはアニメーションをコントロールするものですから、そりゃアニメーションは使えるでしょうけど、使ってどうするのと思うかもしれません。
実は**ビヘイビアなら、アニメーションでもスラッシュコマンドやイベントを実行できる**のです！
これを利用して、その状態のときの常時実行として使おう！ということです。

しかし少し面倒なのが、直接アニコンに書き込むことはできず、

* ①アニメーションをビヘイビアの`entity.json`に登録
* ②アニメーション用のフォルダ、ファイルの作成
* ③アニコンにアニメーション名を記載

と複数のステップを踏まなければなりません。

とはいえ、やること自体はアニコンを追加したときと、さほど変わらないので、ささっと解説していきます。

まずは`entity.json`への登録から。
今回は`animation.jump_repeat`という名前で作っていきます。

```behavior/entities/player.json
{
  "format_version": "1.13.0",
  "minecraft:entity": {
    "description": {
      "identifier": "minecraft:player",
      "is_spawnable": false,
      "is_summonable": false,
      "is_experimental": false,
      "animations": {
        "system": "controller.animation.system",
        "jump_repeat": "animation.jump_repeat"
      },
      "scripts": {
        "animate": [
          "system"
        ]
      }
    },

    "component_groups": {
      ...
```
※「...」は略

:::note warn
＜注意＞
アニコンのときは「登録」と「常時実行」の両方を行いましたが、アニコンで切り替えをしたいアニメーションの場合、「登録」のみを行うので、"scripts"/"animate"の中には書きません。
アニコンとentity.jsonの"animate"の両方に書いてしまうと二重に実行されてしまうので注意が必要です(昔これに気付くのに1か月くらいかかった)。
entity.jsonの"animate"のみに書くと、アニコンに関係なく常時実行できます。
:::

次はフォルダ、ファイル作成です。
behaviorフォルダの直下([#3でアドオンの構造を説明したとき](https://qiita.com/pencilya/items/a2b6debdf3e0a860688c)と同じ位置)に新規フォルダで`animations`を作成します。
その中にファイル`jump_repeat.animation.json`を作成します。
作成方法はリソースのアニメーションのコピー→名前変更でもいいし、テキストドキュメントの作成→拡張子の変更でもいいです。

アニコンの作成のときは、リソースに書いてある内容を参考に解説しましたが、アニメーションの場合、今回の用途で必要になる`"timeline"`が、さらっと見た感じ見当たらないので、最初から自分で作っていきます。

```behavior/animations/jump_repeat.animation.json
{
  "format_version": "1.8.0",
  "animations": {
    "animation.jump_repeat": {
      "animation_length": 0.05,
      "loop": true,
      "timeline": {
        "0.0": [
          "/say jumping now!",
          "@s minecraft:entity_event"
        ]
      }
    }
  }
}
```

こんな感じです。
1行ずつ解説していくと

2行目、いつもの`"format_version"`
3行目、この中にアニメーションを入れますよのカッコ始まり
4行目、アニメーションの名前
5行目、このアニメーションの(時間的な意味の)長さ(単位は秒)
6行目、このアニメーションを繰り返すか
7行目～、タイムライン(`"timeline"`)です。
8行目に`"0.0"`とあるのは、アニメーション全体の長さが0.05秒であるうちの0.0秒目にカッコ内を実行するという意味です。

これが繰り返される(`"loop": true`)ので、0.05秒おきに`"0.0"`のカッコ内が実行されるというアニメーションになります。

:::note info
＜追加情報＞
マイクラ内ではtickという時間単位がよく使われます。20tick=1秒になります。ここではマイクラ内のtickにそろえるため、0.05秒(=1/20秒)に1度実行されるようにしています。
:::

最後にアニコンの実行したい状態(state)のところにアニメーションの名前を書いて終了です。

```behavior/animation_controllers/system.animation_controllers.json
{
	"format_version" : "1.10.0",
	"animation_controllers" : {
		"controller.animation.system" : {
			"initial_state" : "default",
			"states" : {
				"default" : {
					"transitions" : [
						{ "jump" : "(query.get_equipped_item_name == 'apple') && (query.is_using_item)"}
					]
				},
				"jump" : {
	                "animations" : [ "jump_repeat" ],
	                "on_entry": [
                        "/effect @s levitation 1 38 true",
                        "@s minecraft:entity_event"
                     ],
	                "on_exit": [
                        "/say state_end",
                        "@s minecraft:entity_event"
                     ],
					"transitions" : [
						{ "default" : "!query.is_using_item" }
					]
				}
			}
		}
	}
}
```

おそらく、`"on_entry"`、`"on_exit"`と同様に、カンマ(`,`)で区切ればアニメーションも複数追加できると思います。

これで3発動すべての解説が終わりました！

#アニコン編終了！
今回#13でアニコン編が終了になります！
使用頻度が高く、かつ難易度が高いアニコンでしたが、いかがだったでしょうか。
**アニコンを身に付ければ**、間違いなくシステムの**できることの幅が何倍にも広がる**ので、ぜひ何回も見返しながら身に付けてみてください！

このアニコン編では、

https://bedrock.dev/docs/stable/Entity%20Events

をメインに解説しました。
また、この講座で使われなかった条件に興味がある場合は、

https://bedrock.dev/docs/stable/MoLang

から探してみてください。
また、検索すれば先人たちが残した質問や記事もいくつか出てくるので、それを参考にするのもよいと思います。

最後まで読んでくれたみなさんが、作りたいものが作れますように！
お疲れ様でした！！

↓目次#1へ↓

https://qiita.com/pencilya/items/7b7e68265151f42a51ac