エンティティ追加の概要

ビヘイビアー パックとリソース パックを使用して、Minecraft: Bedrock Edition にエンティティを追加できます。 推奨チュートリアルで学んだように、エンティティの動作はビヘイビアー パックで変更でき、外観はリソース パックで変更できます。 実用的なエンティティをゲームに追加するには、両方が必要です。 このガイドは 2 部構成になっており、第 1 部では、Minecraft にカスタム エンティティを追加するために必要なファイルとフォルダの構造について説明します。 第 2 部では、動作コンポーネントやアニメーションを使用してエンティティに命を吹き込む方法を紹介します。

モデリング パッケージで作成された青いクジラの画像。

このチュートリアルでは、次の内容を学びます。

  • ビヘイビアー パックとリソース パックを使用して新しいカスタム エンティティを作成する方法。
  • コンポーネントやアニメーションを含むさまざまな機能をエンティティに適用する方法。
  • エンティティ名の翻訳の活用。

要件

本チュートリアルを開始する前に、以下を完了しておくことをお勧めします。

この記事をより深く理解できるように、以下も把握しておくことをお勧めします。

  • JSON 形式のしくみに関する知識。
  • VSCode などのコード エディター

ファイル構造

ビヘイビアー パックでは、エンティティ ファイルがサーバー側でエンティティを定義する役割を担います。 リソース パックでは、クライアント エンティティ ファイルがエンティティの外観をゲームに伝える役割を担います。 次の図は、カスタム エンティティを作成するうえで、さまざまなファイルがどのように連携するのかを表したものです。

リソース パックとビヘイビアー パックの関係

ロボット エンティティの例 - ミニマム版のロボット

このチュートリアル用の参照情報として、同じエンティティの 2 つのバージョンを用意しています。ランダムに世界にスポーンするほか、3 つのランダム テクスチャ、車輪のアニメーション、各種コンポーネント、水のカスタム メカニズムを備えたロボットのエンティティです。 ダウンロード リンクは上記の「要件」セクションにあります。

ロボットの動作を確認するため、ダウンロードしたいずれかのバージョンのリソース セットとビヘイビアー パックを選択します (ここではミニマム版を使用することをお勧めします)。リソース パックとビヘイビアー パックを、それぞれの com.mojang サブフォルダーに配置し、チートを有効にして世界を起動してから、/summon compass:robot を使用します。

最終的な "ミニマム版ロボット" のビヘイビアー パックとリソース パックの構造は、次のようになります。

最終的なミニマム版ロボットのエンティティのファイル構造

非常に似ていますが、重要なのは、名前に "robot" を含むファイルと、それが格納されている場所です。

ロボットがゲーム内でどのように動作するのかについて概要を掴んだら、完成済みのロボット リソースとビヘイビアー パックを削除して、このチュートリアルの手順に従って最初から作成し直し、すべてのファイルがどのように連携するのかを把握しましょう。

前のチュートリアルで作成したリソース パックやビヘイビアー パックが、よい出発点になります。 攻撃型のウシのエンティティに関しては、削除したいかもしれませんが、個人的な好みです。

名前付け

エンティティを作成する際に、最初に考慮すべきポイントの 1 つは、どの ID を割り当てるかということです。 リソース パックとビヘイビアー パックのファイルは、エンティティに割り当てるエンティティ ID を使用して同期させる必要があります。 この ID は、コロンで区切られた名前空間と名前で構成されます。 前にロボットを召喚するために使用した compass:robot の ID です。

独自の名前空間として、チーム名や製品名を短縮したものを使用できます。 ID は小文字、数字、下線のみで構成する必要があります。 カスタム コンテンツの名前空間として "minecraft" を使用しないでください。 "minecraft" 名前空間はバニラ リソース用に予約されているので、バニラ コンテンツを上書きする場合にのみ使用する必要があります。

エンティティを定義するファイルは概ね JSON ファイルになります。 取り違えることがないよう、各ファイルの作成時に拡張したファイル拡張子を使用することをお勧めします。 ゲームでは、ほとんどの場合ファイル名は無視されますが、アドオンを扱う際は複雑なファイル名は混乱の原因になります。 拡張子は以下のとおりです。

ファイルの種類 ファイル名
クライアント エンティティ ファイル entity_name.entity.json
モデル ファイル entity_name.geo.json
アニメーション ファイル entity_name.animation.json
アニメーション コントローラー entity_name.animation_controllers.json
レンダー コントローラー entity_name.render_controllers.json

entity_name は実際のエンティティ名に置き換え、名前空間は含めないでください。

形式のバージョン

各 JSON ファイルには format_version タグが必要です。 このタグは、ゲームでファイルを正しく読み取るために重要なものです。 古い形式で作られたファイルを新しいバージョンのゲームでも動作させるには、形式のバージョンが正しく設定されていなければならないという点を把握しておくことが大切です。 形式のバージョンが正しくないと、エラーが頻繁に発生します。

ビヘイビアー パックの定義

ロボットをゲームに追加する実際の手順は、ビヘイビアー パックから始まります。 ビヘイビアー パックの entities フォルダーに、robot.json という新しいファイルを作成します。 次のコードをコピーして貼り付けます。

{
    "format_version": "1.12.0",
    "minecraft:entity": {
        "description": {
            "identifier": "compass:robot",
            "is_spawnable": true,
            "is_summonable": true
        },
        "components": {}
    }
}

description タグ内では、エンティティの基本属性を定義します。 identifier によってエンティティの ID が設定されます。 is_spawnable によってゲームにスポーン エッグが追加され、プレーヤーがこのモブをスポーンさせることができるようになります。 is_summonable によってエンティティで /summon コマンドを使用できるようになります。

components 内には、エンティティの動作を変更するコンポーネントを追加します。 ここでは minecraft:physics コンポーネントのみを追加します。 これによってエンティティに重力と通常の衝突動作が備わります。

"components": {
    "minecraft:physics": {}
}

robot.json ファイルを保存し、次のステップに進みます。

クライアント エンティティの定義

次は、リソース パックにエンティティを追加して外観を付与する必要があります。 リソース パックの entity フォルダーに、robot.entity.json という新しい JSON ファイルを作成します。

{
    "format_version": "1.10.0",
    "minecraft:client_entity": {
        "description": {
            "identifier": "compass:robot",
            "spawn_egg": {
                "base_color": "#505152",
                "overlay_color": "#3b9dff"
            }
        }
    }
}

これがファイルの基本構造です。 この時点では、前のセクションで作成したビヘイビアー側のファイルに似ています。 今回はただの entity ではなく、client_entity を使用している点に注意してください。 本記事の執筆時点では、1.10.0 がこのファイルの形式の最新バージョンです。

spawn_egg タグでは、持ち物内でのスポーン エッグの外観を定義します。 この方法を使用すると、形状はバニラ スポーン エッグと同様ですが、その色をカスタマイズできます。

ビジュアル

エンティティをゲームに追加するには、モデルが必要です。 エンティティのモデリングとアニメーションに関する記事で、カスタムのモデルとテクスチャを作成する方法を説明していますが、モデルの作成は奥が深く、このチュートリアルもまだ終わっていません。 ここでは、ロボットのリソース パックからファイルをコピーして貼り付けることで、モデルを既に作成していると仮定してもかまいません。 以降も同じ方法で作成したモデルを追加します。

  • モデルを robot.geo.json として models/entity フォルダーに保存します。
  • テクスチャを robot.png として textures/entity に保存します。

モデル ファイルを用意できたら、エンティティに使用されるモデル、テクスチャ、材料をリンクするためのレンダー コントローラーが必要です。

リソース パックの entity フォルダーで、robot.entity.json ファイルを開きます。

ほとんどのエンティティ (ロボットなど) には、ゲームで提供されるデフォルトのレンダー コントローラーを使用できます。 レンダー コントローラーについては、より高度な内容を扱うこのチュートリアルの後半で説明します。 ここでは、モデルの場所を確認しておいてください。このファイルのコンテンツは次のようになります。

{
    "format_version": "1.10.0",
    "minecraft:client_entity": {
        "description": {
            "identifier": "compass:robot",
            "materials": {
                "default": "entity"
            },
            "textures": {
                "default": "textures/entity/robot"
            },
            "geometry": {
                "default": "geometry.robot"
            },
            "render_controllers": [
                "controller.render.default"
            ],
            "spawn_egg": {
                "base_color": "#505152",
                "overlay_color": "#3b9dff"
            }
        }
    }
}

モデルはジオメトリ名で参照します。 Blockbench でモデルを作成する場合は、プロジェクト設定内のジオメトリ名が実際のエンティティ名になっていることを確認してください。 この場合は、"robot" です。

ジオメトリとは異なり、テクスチャは例に示されているようにリソース パック内のファイル拡張子を除くパスでリンクします。

ほとんどの場合、カスタム材料は必要ありません。 代わりにデフォルトの材料を使用できます。 この例では、entity を使用します。 テクスチャに透明な部分がある場合は entity_alphatest、テクスチャが半透明 (ステンドグラスなど) の場合は entity_alphablend を使用できます。

翻訳文字列

この時点では、エンティティ自体にもスポーン エッグにもゲーム内での適切な名前がありません。 名前を定義するには、言語ファイルが必要です。 リソース パック内に texts という新しいフォルダーを作成し、en_US.lang という新しいファイルを作成します。 カスタム エンティティの場合、他のすべての言語は既定でアメリカ英語になるので、変更が必要なのはこの言語ファイルのみです。 このファイル内に、次の 2 行を追加します。

entity.compass:robot.name=Robot
item.spawn_egg.entity.compass:robot.name=Spawn Robot

最初の行では、エンティティの名前を定義します。 この名前は死亡時メッセージと、一部のコマンドの出力で表示されます。 キーと値は常に等号で区切られます。 1 行目は次のように説明できます。

entity.<identifier>.name=<Name>

2 行目では、スポーン エッグのアイテム名を定義します。

item.spawn_egg.entity.<identifier>.name=<Name>

テスト

テストは早期かつ頻繁に行うようにしてください。 早期に問題が発生すれば簡単に原因を突き止めることができるので、解決も容易になります。 テストを頻繁に行うと、変更を加えた後すぐに問題が明らかになるので、そうした最近の変更点に原因を絞り込むことができます。

スポーン エッグや召喚コマンドを使用してゲーム内にエンティティをスポーンさせることができなければなりません。 必要なのが静的エンティティのみの場合は準備万端です。 しかしエンティティをさらにカスタマイズしたい場合は、このまま読み進めてください。

ロボット エンティティの例 - 完全版のロボット

続いて、完全版のロボットのリソース パックとビヘイビアー パックを使用します。 フォルダーとファイルのコレクションを比較します。 その後、ミニマム版のロボットに戻り、機能の追加を続けます。

コンポーネント

コンポーネントは、エンティティにゲーム内でどのように動作すべきかを伝えます。 コンポーネントをいくつか追加し、その動作を詳しく説明していきます。

behavior pack/entities/ フォルダーで、robot.json を開き、"minecraft:physics": {} の 1 つのエントリを以下に置き換えます。

   "components": {
        "minecraft:physics": {},
        "minecraft:nameable": {},
        "minecraft:movement": {
            "value": 0.25
        },
        "minecraft:movement.basic": {},
        "minecraft:jump.static": {},
        "minecraft:navigation.walk": {
            "avoid_water": true
        },
        "minecraft:behavior.tempt": {
            "priority": 1,
            "speed_multiplier": 1.4,
            "items": ["diamond"],
            "within_radius": 7.0
        },
        "minecraft:behavior.random_stroll":
        {
            "priority": 3,
            "speed_multiplier": 0.8
        },
        "minecraft:experience_reward": {
            "on_death": 8
        }
   }
コンポーネント名 説明
minecraft:nameable プレーヤーが名前タグでエンティティに名前を付けることができます。
minecraft:movement エンティティに移動する速度を伝えます。 0.25 が Minecraft における大部分の動物の通常の速度です。
minecraft:movement.basic エンティティに地面を移動する能力を与えます。
minecraft:jump.static エンティティがジャンプしてブロックを上れるようにします。
minecraft:navigation.walk エンティティが世界中を移動できるようにします。 このコンポーネントのオプションの 1 つに、水を避けるというものがあります。
minecraft:behavior.tempt エンティティがダイヤモンドを手に持っているプレーヤーについて行くようにします。 ここではこの動作に高い優先度を設定して、この行動が優先されるようにします (小さい数値 = 高い優先度)。
minecraft:behavior.random_stroll エンティティが周辺をランダムに歩き回るようにします。 ここでは優先度に大きな数値を設定して、他にすることがない場合にのみ、エンティティがこの動作を行うようにします。 この歩き動作を使用している間は、速度乗算によって速度を低下させます。
minecraft:experience_reward プレーヤーに殺された場合にエンティティが経験値を落とすようにします。

アニメーション

このセクションでは、シンプルな車輪のアニメーションをロボットに追加します。 アニメーション、アニメーション コントローラーの使い方、Blockbench でのアニメーションの作成方法について詳しく学びたい場合は、こちらのガイドをお読みください。

アニメーションはアニメーション ファイルに保存します。 そのため、まずはリソース パック内に animations というフォルダーを作成し、その中に robot.animation.json というファイルを作成する必要があります。 そのファイルで、animation.robot.drive という新しいアニメーションを作成します。 また、アニメーションが継続的に再生されるように looptrue に設定することも必要です。 ファイルは次のようになります。

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.drive": {
            "loop": true
        }
    }
}

アニメーションでは、各ボーンの位置、回転、拡大縮小のアニメーションを行えます (まだ "ボーン" の意味がわからないかもしれませんが、問題ありません。ボーンについては、Blockbench について学ぶときに知ることができます。 ここでは、ひとまず脚や車輪などのモデルのチャンクという意味に捉えてください。) アニメーション化するには、キーフレーム、Molang 式、またはその両方を組み合わせて使用します。 この例では、Molang 式のみを使用します。

Molang はリソース パックとビヘイビアー パック専用の言語です。 クエリを使用してエンティティからさまざまな数値を取得し、数式を使用してそれらの数値から結果を算出することができます。 たとえば、query.modified_distance_moved というクエリではエンティティの移動した距離が返されます。 それを使用してロボットの車輪の X 軸での回転を計算することにより、ロボットが走行しているように見えるアニメーションができます。 数値を調整する必要はありますが、このモデルは 60 でうまくいきました。

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.drive": {
            "loop": true,
            "bones": {
                "wheel": {
                    "rotation":["query.modified_distance_moved*60", 0, 0]
                }
            }
        }
    }
}

アニメーションを作成したので、それをクライアント エンティティ ファイル内でリンクする必要があります (リソース パックがクライアントになるため、次の手順用に <resource pack>/entity/robot.entity.json を開いておいてください) animations タグによって、このエンティティで使用されるすべてのアニメーションとアニメーション コントローラーがリンクされます。 各アニメーションに短い名前が付与されるので、それを使用してアニメーションをアニメーション コントローラーで再生することや、ファイル (この場合は drive) 内で直接再生することができます。

次の scripts セクションおよび animate セクションを使用してアニメーションを直接再生できます。

        "animations": {
            "drive": "animation.robot.drive"
        },
        "scripts": {
            "animate": ["drive"]
        }

クライアント エンティティ ファイルの description タグ内にこれら 2 つのタグを追加することで、エンティティの移動中に走行のアニメーションが常に有効になり、車輪が回転します。

レンダー コントローラー

レンダー コントローラーでは、Molang を使用してエンティティのジオメトリ、テクスチャ、材料を変更できます。 次の例は、クライアント エンティティ ファイル内で default としてリンクされているジオメトリ、材料、テクスチャを使用する方法を示したものです。

{
    "format_version": "1.8.0",
    "render_controllers": {
        "controller.render.robot": {
            "geometry": "Geometry.default",
            "materials": [ { "*": "Material.default" }],
            "textures": [ "Texture.default" ]
        }
    }
}

1 つのデフォルト ジオメトリ、材料、テクスチャのみを使用したい場合は、前に行ったようにデフォルトのレンダー コントローラーを指したままにします。 ただし、ランダム テクスチャの追加方法を学ぶ良い機会ですので、まずはレンダー コントローラーのしくみを詳しく見ていきましょう。

レンダー コントローラーの説明

ご覧のように、ベース タグの名前は render_controllers です。 つまり、1 つのファイル内に複数のレンダー コントローラーを指定できます。

レンダー コントローラーの名前付けには、controller.render.<entity_name> というスキーム使用しています。 多目的のレンダー コントローラーには、エンティティ名ではなく別のキーワードを使用することもできます。

レンダー コントローラー タグ内に異なるリソースが指定されていますが、ご覧のとおりそれぞれに別の JSON 形式が使用されています。

ジオメトリ

1 つのレンダー コントローラーでは、一度に 1 つのジオメトリのみを表示できます。 1 つの文字列として直接リンクされているのはそのためです。 この文字列は Molang 式にでき、常にジオメトリを返す必要があります。 この場合は Geometry.default を呼び出しているので、レンダー コントローラーを使用しているエンティティによって default としてリンクされているジオメトリが返されます。

複数のレンダー コントローラーを使用すれば、1 つのエンティティで複数のジオメトリをレンダリングできます。 ただし、この方法は使いこなすのが難しく、予期しない動作につながる可能性もあります。 そのため、経験豊富なクリエイターにのみお勧めできる方法です。

材料

ジオメトリとは異なり、材料はオブジェクトの配列として記述します。 そうするのは、ボーンごとに別の材料を割り当てられるようにするためです。 配列内の各オブジェクトに 1 つのキーと値のペアを指定できます。 そのキーによって一連のボーンを選択します。 アスタリスクを使用すると、ワイルドカードとして機能します。 つまり、名前に関係なくすべてのボーンにデフォルトの材料が割り当てられます。 材料は順番に割り当てられるので、リストの後の方にある材料によって前の材料が上書きされる可能性があるという点に注意してください。

        "materials": [
            { "*": "Material.default" },
            { "*_arm": "Material.transparent" }
        ],

この例では、まずデフォルトの材料をすべてのボーンに適用します。 その後、_arm で終わるすべてのボーンの材料を透明な材料で上書きします。 そうすることで、すべての腕のボーンに透明度が備わります。

テクスチャ

テクスチャは配列で指定します。 エンティティは複数に分かれたテクスチャに対応できないので、ほとんどの場合は 1 つのテクスチャのみをリンクすることになります。 ただし 1 つだけ例外があり、entity_multitexture などの材料は重なり合う複数のテクスチャに対応できます。 たとえば、ラマの装飾を重ね合わせるために使用されています。

配列

1 種類のリソースを複数扱う場合は、配列を使用すると便利です。 配列はレンダー コントローラーで定義されたリソース リンクのリストであり、Molang を使用してそこから 1 つのリソースを選択できます。

次のようにロボット用の配列を定義できます。

        "controller.render.robot": {
            "arrays": {
                "textures": {
                    "Array.variant":[
                        "Texture.default",
                        "Texture.variant_b",
                        "Texture.variant_c"
                    ]
                }
            },

この arrays セクションでは、texturesmaterialsgeometries という 3 つのカテゴリのそれぞれに対して配列を定義できます。 カテゴリ内では、Array.<array name> という名前を使用して配列を定義できます。 配列内の各行では、クライアント エンティティ ファイルで定義されている 1 つのテクスチャをリンクします。

配列には Molang を使用してアクセスできます。 配列は 0 から始まるので、この配列の最初のテクスチャには Array.variant[0] でアクセスできます。

この例では、配列からテクスチャを選択するためにバリアント クエリを使用しています。 モブのバリアントはビヘイビアー ファイルの minecraft:variant コンポーネントを通じて変更できます。

"textures": [ "Array.variant[ query.variant ]" ]

次は、クライアント エンティティ ファイル内で追加のテクスチャをリンクする必要があります。 通常の青いロボットのテクスチャは既に default としてリンクされているので、ここではロボットのテクスチャ ファイルのコピーを 2 つ作成し、色を編集して、variant_b および variant_c としてリンクします。

            "textures": {
                "default": "textures/entity/robot",
                "variant_b": "textures/entity/robot_b",
                "variant_c": "textures/entity/robot_c"
            },

これでテクスチャがリンクされました。 最後の手順では、ビヘイビアー ファイル内のバリアントをランダム化します。 これにはコンポーネント グループを使用します。 そうすると、エンティティに対して一連のコンポーネントの追加や削除をいつでも行えます。 また、追加するコンポーネント グループをランダムに選ぶイベントも使用します。

        "description": {
            ...
        },
        "components": {
            ...
        },
        "component_groups": {
            "compass:color_0": {
                "minecraft:variant": {"value": 0}
            },
            "compass:color_1": {
                "minecraft:variant": {"value": 1}
            },
            "compass:color_2": {
                "minecraft:variant": {"value": 2}
            }
        },
        "events": {
            "minecraft:entity_spawned": {
                "randomize": [
                    {
                        "add": {
                            "component_groups": ["compass:color_0"]
                        }
                    }, {
                        "add": {
                            "component_groups": ["compass:color_1"]
                        }
                    }, {
                        "add": {
                            "component_groups": ["compass:color_2"]
                        }
                    }
                ]
            }
        }

これで最初にエンティティがスポーンしたときに、コンポーネント グループとバリアントがランダムに選ばれるようになります。 これが、エンティティの外観をランダム化する際に非常によく使われるテクニックです。

スポーン

エンティティがどのようにランダムな方法で世界にスポーンするかは、スポーン ルールによって決まります。 ここではロボット用のスポーン ルール ファイルを作成します。 まずは、ビヘイビアー パック内に spawn_rules というフォルダーを作成します。 そのフォルダー内に、robot.json という新しいテキスト ファイルを作成します。 ファイルの内容は次のようになります。

{
    "format_version": "1.8.0",
    "minecraft:spawn_rules": {
        "description": {
            "identifier": "compass:robot",
            "population_control": "animal"
        },
        "conditions": []
    }
}

minecraft:spawn_rules 内に、検討すべき 2 つのタグがあります。個体数の制御条件です。

description では、ファイルの基本的な特性を定義します。 identifier は、エンティティの識別子と一致させる必要があります。 population_control はもう少し複雑で、スポーンするモブの数をどのようにゲームで把握するかを定義します。

個体数の制御

エンティティには異なる種類のプールがあります。 ここで定義したプールがいっぱいになっていると見なされると、そのプールのモブはスポーンしなくなります。 以下の 3 種類のオプションがあります。

  • "animal": ウシやブタなどの攻撃的でないモブ
  • "water_animal": 熱帯魚やイルカなどの水中にいるモブ
  • "monster": スケルトンやゾンビなどの敵対的なモブ

ロボットには animal プールを使用します。

条件

conditions は、世界にモブをスポーンさせる条件として考えられるものの配列です。 それぞれの条件で、別々にモブを世界にスポーンさせることを試みます。 各条件は、どのような場合にモブをスポーンさせ、スポーンさせないかを定義するコンポーネント グループで構成されます。

基本的なスポーン ルールは、1 つの条件で十分です。 ロボットには次の構成を使用します。

{
    "format_version": "1.8.0",
    "minecraft:spawn_rules": {
        "description": {
            "identifier": "compass:robot",
            "population_control": "animal"
        },
        "conditions": [
            {
                "minecraft:spawns_on_surface": {},
                "minecraft:brightness_filter": {
                    "min": 12,
                    "max": 15,
                    "adjust_for_weather": false
                },
                "minecraft:weight": {
                    "default": 40
                },
                "minecraft:biome_filter": {
                    "test": "has_biome_tag",
                    "value": "animal"
                }
            }
        ]
    }
}
コンポーネント名 説明
minecraft:spawns_on_surface モブが地表でスポーンします。
minecraft:brightness_filter 特定の明るさでのみエンティティをスポーンさせます。 minmaxadjust_for_weather という 3 つのオプションを使用できます。 明るさレベルの範囲は 0 ~ 15 です。 adjust_for_weathertrue に設定されている場合は、雨と雷雨が考慮されるため、明るさレベルが低下します。
minecraft:weight スポーン時のエンティティの重み。 数値が大きくなるほど、そのモブのスポーン頻度が増えます。
minecraft:biome_filter モブがスポーンできるバイオームをフィルターで絞り込みます。 バイオーム フィルターは動作のフィルターと同じように機能するので、all_ofany_of のような演算子を使用できます。 バイオームには、バイオームの種類、バリアント、ディメンション、およびモンスターや動物などの特徴を示すさまざまなタグがあります。

これでロボットは、動物がスポーンでき、十分な明るさがある地表のどこにでもスポーンするようになります。 重みが 40 なので、スポーン頻度も非常に高くなります。

動作のアニメーション

動作のアニメーションは、通常のアニメーションと同じように機能しますが、ビヘイビアー パック内で実行します。 通常のアニメーションではモデルの動き、音、パーティクルをアニメーション化しますが、動作のアニメーションでは通常のコマンドの実行、エンティティ イベントのトリガー、Molang 式の実行を行えます。 動作のアニメーションは、よくエンティティ イベントとも呼ばれます (少し混乱しやすい名前ですが)。

ロボットは水を好まないので、水や雨の中ではロボットがダメージを受けるしくみを追加します。 まずは Molang クエリを使用してエンティティが水中にいるかどうかをテストするアニメーション コントローラーを作成します。 ビヘイビアー パック内に animation_controllers という新しいフォルダーを作成し、その中に robot.animation_controllers.json というファイルを作成します。

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.in_water": {
            "states": {
                "default": {
                    "transitions": [
                        {"in_water": "query.is_in_water_or_rain"}
                    ]
                },
                "in_water": {
                    "transitions": [
                       {"default": "query.is_in_water_or_rain == 0"}
                    ]
                }
            }
        }
    }
}

このアニメーション コントローラーはクライアント側の通常のアニメーション コントローラーによく似ています。 これには 2 つの状態があり、ロボットが水中にいるかどうかに応じて切り替わります。

次は、ロボットに毒の効果を与えるアニメーションを追加しましょう。 ビヘイビアー パック内に animations というフォルダーを作成し、robot.animation.json というファイルを作成します。

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.poison": {
            "loop": true,
            "animation_length": 1,
            "timeline": {
                "0.0": [
                    "/effect @s poison 2 0 true"
                ]
            }
        }
    }
}

bone タグを使用してボーンをアニメーション化する代わりに、ここでは timeline タグを使用します。 リソース パック内では、Molang コードの実行にのみ timeline を使用できます。 動作のアニメーションでは、これを使用して Molang コード、コマンド、またはエンティティ イベントのトリガーを実行できます。 なお、これらはすべて文字列として指定します。 ゲームでは文字列の内容からその種類が判別されます。 文字列がスラッシュで始まる場合は、コマンドとして実行されます。 @s namespace:event というスキームに一致する場合は、エンティティ イベントとして実行されます。 Molang のように見える場合は、Molang として実行されます。

そうした理由から、動作のアニメーションではコマンドの先頭にスラッシュを付けることが重要です。 また、1 秒では実際にダメージを与えるには不十分なので、2 秒間にわたって毒を適用する点にも注意してください。 コマンドの最後にある true によってステータス効果が環境効果になるので、パーティクルは発生しません。

リソース パック内のアニメーションと同様に、エンティティの description タグですべてのアニメーションとアニメーション コントローラーをリンクする必要があります。例は次のとおりです。

        "description": {
            "identifier": "compass:robot",
            "is_spawnable": true,
            "is_summonable": true,
            "animations": {
                "poison": "animation.robot.poison",
                "in_water": "controller.animation.robot.in_water"
            },
            "scripts": {
                "animate": [
                    "in_water"
                ]
            }
        },

animations セクションでは、エンティティで使用するすべてのアニメーションとアニメーション コントローラーを列挙し、短い名前を付与しています。 scripts/animate セクションには、常に実行する必要のあるアニメーションを記述しています。 毒の効果以外の常に実行すべき状態をコントローラーで検出する必要があります。

次は、アニメーション コントローラーに戻って毒の効果を追加する必要があります。 また、効果音と共に簡単な再生のしくみも追加して、ロボットが簡単に死なないようにします。

            "states": {
                "default": {
                    "transitions": [
                        {"in_water": "query.is_in_water_or_rain"}
                    ]
                },
                "in_water": {
                    "animations": [
                        "poison"
                    ],
                    "on_exit": [
                        "/effect @s regeneration 2 4 true",
                        "/playsound random.fizz @a[r=16]"
                    ],
                    "transitions": [
                        {"default": "query.is_in_water_or_rain == 0"}
                    ]
                }
            }

animations 配列には、この状態、つまり poison の状態で実行する必要のあるすべてのアニメーションを記述しています。

on_exit タグには、ロボットが水中から出たときに実行する 2 つのコマンドを追加しています。 最初のコマンドでは、ロボットにレベル 4 の再生効果を 2 秒間にわたって付与します。 2 つ目のコマンドでは、シューという効果音を再生します。

なお、default 状態の on_entry 配列でコマンドを実行することもできますが、ゲームは最初に必ず default 状態に遷移するので、ロボットのスポーン時や世界の再読み込み時にも効果音が再生されることになります。

コントローラーとアニメーションの関係を要約すると、アニメーション コントローラーはアニメーションがいつ再生されるかを制御するために使用するものであり、一方でアニメーション自体はコントローラーの判断で行われるアニメーションへの遷移の結果として発生するものです。 アニメーションとアニメーション コントローラーは、エンティティのビヘイビアー ファイルで指定します。

次のステップ

このガイドでは、カスタム エンティティ全体をゲームに追加しました。 カスタムのファイルを作成するのではなく、既存のモデル ファイルを使用した場合は、ここで Blockbench について学ぶことをお勧めします。 または、サーバー用のエンティティの動作についての記事をご確認ください。