【Minecraft BE Addon講座#11】アニメーションコントローラーとは？/アニコンの追加と実行

本ページはアドオン講座#11、「アニコン編、アニコンとは？/アニコンの追加と実行」です。
目次や、この講座については[#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とアニメーション

#アニメーションコントローラー、アニコンとは？
名前の通り、アニメーションをコントロールするものです。
本来はリソースの中にあるものです。
例えば、プレイヤーは水の中で前進すると、体が傾き、泳ぎのアニメーションに切り替わります。
これは、**アニメーションコントローラーで水の中に入って泳ごうとしているかか、そうでないかを検知し、アニメーションを切り替える機能によって実現している**のです。

アドオン製作でアニコンがよく利用される理由は、**この「泳いでいるか」などの今までコマンドブロックだけではできなかったような判定/検知が使える**からなのです！

ポイントは、リソースのアニメーションコントローラーでは、条件を満たしたとき、アニメーションを切り替えることしかできないのですが、
アニメーションコントローラーを**ビヘイビアに置いておく**と、判定条件を満たしたときに、

* **①エンティティのイベント**[^1]
* **②コマンド**
* ③MoLangの計算(リソースでも可)

を実行できる[^2]というところです。

[^1]: エンティティのイベントについては[コンポネ編#7](https://qiita.com/pencilya/items/c63ac2a6e34be38530fb)で詳しく扱っています。
[^2]: 参考：https://bedrock.dev/docs/stable/Entity%20Events


そのため、ビヘイビアとリソースでは同じアニメーションコントローラーという名前でも意味合いが異なる(ビヘイビアでは実質的にアニメーションを切り替える目的では使用しない)ので、
この講座ではビヘイビアのアニメーションコントローラーをアニコン、リソースのアニメーションコントローラーをアニメーションコントローラーと呼んでいます。

※完全に使い分けているわけじゃないのでいくつかは見逃してください…

#アニコンの追加方法と実行方法
アニコンはエンティティごとに追加する(エンティティと結びつけられる)ので、実際に機能させるには**エンティティ側でアニコンを認識させなければ**なりません。
そのエンティティ側の処理はビヘイビア、entitiesの中に書いていきます。

```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",
        "通称": "完全な名前" ←例。日本語は使えません。
      },
      "scripts": {
        "animate": [
          "system", "通称"
        ]
      }
    },

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

このように`"description"`の中に`"animations"`と`"scripts"`を追加します。
`"animations"`の中で上記のように書くことでエンティティとアニコンを紐づけ、**以降は紐づけた名前(通称)で動作**するようになります。
さらに、`"scripts"`の中、`"animate"`で紐づけた名前を書くと、**このアニコンが常時実行される**ようになります。

:::note warn
＜注意＞
要素を追加する際、<code>"is_experimental"</code>の後ろのカンマ(<code>,</code>)を忘れがちなので注意！
:::

この時、この常時実行は、**ワールドにあるひとつひとつのエンティティがそれぞれ実行する**ものであることに注意してください。
エンティティの種類ごとではないので、**該当する種類で、ワールドに存在するすべてのエンティティが**このアニコンを**それぞれ独立して実行**します。互いに干渉することはありません。

:::note info
＜追加情報＞
<code>"animations"</code>でアニコンではなく、アニメーションを登録し、アニコンと同様に<code>"scripts"</code>、<code>"animate"</code>の中に書けば、そのアニメーションを常時実行してくれます。
:::

:::note warn
＜注意＞
<code>"animations"</code>で登録する作業をすっとばすことはできません。
<code>"animate"</code>の中に<code>"controller.animation.~~"</code>の完全な名前を書いても実行されません。
:::

#アニコン側の準備
###まずはサンプル(リソースのアニメーションコントローラーより)
登録は終わったので、今度はアニコンのファイルを作ります。
サンプルとして**リソースの**アニメーションコントローラーを見てみましょう。

```resource/animation_controllers/player.animation_controllers.json
{
	"format_version" : "1.10.0",
	"animation_controllers" : {
		"controller.animation.player.crossbow" : {
			"initial_state" : "default",
			"states" : {
				"charge" : {
					"animations" : [ "third_person_crossbow_equipped" ],
					"transitions" : [
						{
							"default" : "query.get_equipped_item_name != 'crossbow' || (query.item_remaining_use_duration <= 0.0 && !query.item_is_charged)"
						},
						{
							"hold" : "query.item_is_charged"
						}
					]
				},
				"default" : {
					"transitions" : [
						{
							"hold" : "query.item_is_charged"
						},
						{
							"charge" : "query.item_remaining_use_duration > 0.0"
						}
					]
				},
				"hold" : {
					"animations" : [ "crossbow_hold" ],
					"transitions" : [
						{
							"default" : "query.get_equipped_item_name != 'crossbow' || (query.item_remaining_use_duration <= 0.0 && !query.item_is_charged)"
						},
						{
							"charge" : "query.item_remaining_use_duration > 0.0"
						}
					]
				}
			}
		},
		"controller.animation.player.first_person_attack" : {
			"initial_state" : "default",
...
```
※「...」は略

こんな感じです。
お決まりのformat versionがあって、すぐにアニメーションコントローラーを入れるカッコが始まります。
このファイルでは、複数のアニメーションコントローラー(`"controller.animation.player.crossbow"`と`"controller.animation.player.first_person_attack"`、省略しましたが、さらに下にも複数続きます)が入っていますね。

これはあくまでリソースのアニメーションコントローラーの例なので、必要な部分だけ切り取って、ビヘイビアでアニコンとして使えるようにしましょう。

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

作成したら、先ほどの例として使ったリソースのアニメーションコントローラー(`resource/animation_controllers/player.animation_controllers.json`)の中身をコピーして貼り付けし、複数あるアニコンを削除して`"controller.animation.player.crossbow"`のみにします。
そしてアニコンの名前を、`player.json`でさっき登録した名前(`"controller.animation.system"`)に変更します。

つまり、下記のようになります。

```behavior/animation_controllers/system.animation_controllers.json
{
	"format_version" : "1.10.0",
	"animation_controllers" : {
		"controller.animation.system" : {    ←変更箇所
			"initial_state" : "default",
			"states" : {
				"charge" : {
					"animations" : [ "third_person_crossbow_equipped" ],
					"transitions" : [
						{
							"default" : "query.get_equipped_item_name != 'crossbow' || (query.item_remaining_use_duration <= 0.0 && !query.item_is_charged)"
						},
						{
							"hold" : "query.item_is_charged"
						}
					]
				},
				"default" : {
					"transitions" : [
						{
							"hold" : "query.item_is_charged"
						},
						{
							"charge" : "query.item_remaining_use_duration > 0.0"
						}
					]
				},
				"hold" : {
					"animations" : [ "crossbow_hold" ],
					"transitions" : [
						{
							"default" : "query.get_equipped_item_name != 'crossbow' || (query.item_remaining_use_duration <= 0.0 && !query.item_is_charged)"
						},
						{
							"charge" : "query.item_remaining_use_duration > 0.0"
						}
					]
				}
			}
		}
	}
}
```

よし！
ここまでできたら今回はおしまいです！

アニコンの内容がリソースの内容そのままということもあり、これをマイクラに導入しても何も起きませんが、とりあえずは新しい自作アニコンの追加をすることができました！

[次回#12](https://qiita.com/pencilya/items/52b9fd6eb19bb47d5f07)からは、今回作成したファイル`system.animation_controllers.json`の中身のどこが何をしているのかを解説していきます。

なかなかハードな内容が続きますが頑張っていきましょーーー

↓目次#1へ↓

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