0
Help us understand the problem. What are the problem?

posted at

updated at

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

本ページはアドオン講座#11、「アニコン編、アニコンとは?/アニコンの追加と実行」です。
目次や、この講座については#1の記事をご覧ください。

アニコン編で理解してほしいこと!

マイクラ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というところです。

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

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

アニコンの追加方法と実行方法

アニコンはエンティティごとに追加する(エンティティと結びつけられる)ので、実際に機能させるにはエンティティ側でアニコンを認識させなければなりません。
そのエンティティ側の処理はビヘイビア、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"で紐づけた名前を書くと、このアニコンが常時実行されるようになります。

<注意> 要素を追加する際、"is_experimental"の後ろのカンマ(,)を忘れがちなので注意!

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

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

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

アニコン側の準備

まずはサンプル(リソースのアニメーションコントローラーより)

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

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でアドオンの構造を説明したときと同じ位置)に新規フォルダで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からは、今回作成したファイルsystem.animation_controllers.jsonの中身のどこが何をしているのかを解説していきます。

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

↓目次#1へ↓


  1. エンティティのイベントについてはコンポネ編#7で詳しく扱っています。 

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?