既存エンティティを改造する

スポンサーリンク

はじめに

この記事は既存のエンティティを改造していく方法を実際の例と共に紹介する内容になります。アドオン作りにおいてエンティティを扱えられれば配布マップなどにも役に立ちますし、今回は既存のエンティティを改造しますが新規にオリジナルのエンティティを作る際にも役に立つので参考にしてみてください。

最低限JSONの知識が必要です。今回詳しくは説明できませんが、アドオンで用いるJSONに関しては「”キー”: 値」のように書くことが多いです。「Visual Studio Code」のように、色をつけて見やすくしたり間違いがあれば表示してくれる機能があるエディタを用いることをお勧めします。

{
  "文字列": "あいうえお",
  "数値": 123.45,
  "配列": [ "A", "B", "C" ],
  "オブジェクト": {
    "キー": "値",
    "name": "アドオンでは基本的にキーは半角英数字"
  }
}

実践

ビヘイビアーパックの準備

エンティティの動作(体力などのパラメーター、歩き回ったり攻撃行動などのAI)を改造する為にはビヘイビアーパックを使います。まずは以下の記事を参考に空のビヘイビアーパックを準備しましょう。

出来た空のビヘイビアーパックに、「entities」フォルダを作っておきましょう。
このフォルダの中にあるJSONファイルで、エンティティの動作が決まっています。

既存エンティティのファイルを手に入れる

まずは改造前のエンティティのファイルを用意します。

今回は「bedrock-samples」からダウンロードします。ここにあるのはMojangが正式に配布しているものなので、安心して利用できます。

リンク先で「Code」ボタンを押して出てくるメニューにある、「Download ZIP」はビヘイビアーパックやリソースパックを含む全てのファイルを一括でダウンロードするものです。

GitHubリポジトリ bedrock-samples

ファイル1つを選んでダウンロードする方法もあります。ビヘイビアーパックは「behavior_pack」、リソースパックなら「resource_pack」を選びます。
ダウンロードしたいファイルを開いたら、右上にあるメニューからダウンロードできます。

ファイルのダウンロード(デスクトップ表示)
デスクトップ表示
ファイルのダウンロード(モバイル表示)
モバイル表示

今回はスケルトンを改造していくのでビヘイビアーパックの「entities/skeleton.json」を選んでダウンロードします。ダウンロードが終わったら、準備しておいたビヘイビアーパックのentitiesフォルダの中に入れます。

ファイルの中身を書き換える

いよいよ実際に改造していきます。先ほど準備したskeleton.jsonを開き中身を書き換えていきます。
以下の内容で変更を加えていきます。

  • 体力を変更する
  • 移動速度を変更する
  • 日光で燃えないようにする
  • プレイヤーに敵対しないようにする

エンティティのパラメーターや行動は機能ごとに「コンポーネント」というもので決められており、付け外しすることで特徴を追加したり消すことができます。

JSONにある「components」の中には最初から持たせておきたいコンポーネントを記述します。

「component_groups」の方は特定の条件下で有効にしたり無効にする為のものです。スケルトンでは弓などを持っている時の遠距離攻撃と持っていない時の近距離攻撃を切り替えるためなどに使われており、複雑なAIを作る際に役立ちます。

今回は簡単にcomponentsの中に絞って改変していきます。

体力を変更する

「minecraft:health」というコンポーネントを探します。エディタに検索機能があれば便利です。

"minecraft:health": {
  "value": 20,
  "max": 20
},

「value」は初期値、「max」は最大値です。

20はプレイヤーの体力と同じ、ハート10個分です。今回はvalueとmaxをどちらも1に減らして、簡単に倒せるようにしてみましょう。

移動速度を変更する

次は移動速度を変えてみます。移動速度を決めているのは「minecraft:movement」です。

"minecraft:movement": {
  "value": 0.25
},

似た名前のコンポーネントに「minecraft:movement.basic」などがあるので、間違えないようにしてください。

今回はvalueの数値を1に増やしてとても速くしてみます。

日光で燃えないようにする

「minecraft:burns_in_daylight」というコンポーネントを探します。

"minecraft:burns_in_daylight": {
},

これが日光で燃えるようにするコンポーネントなので、これを削除します。コンマ「,」までしっかり消しましょう。

プレイヤーに敵対しないようにする

プレイヤーを見つけると敵対して襲ってきますが、その部分を決めているのが「minecraft:behavior.nearest_attackable_target」です。名前に「behavior」とついているものは基本的にエンティティの行動、つまりAIに関わるものとなっています。

"minecraft:behavior.nearest_attackable_target": {
  "priority": 2,
  "must_see": true,
  "reselect_targets": true,
  "entity_types": [
    {
      "filters": {
        "test": "is_family",
        "subject": "other",
        "value": "player"
      },
      "max_dist": 16
    },
    {
      "filters": {
        "test": "is_family",
        "subject": "other",
        "value": "irongolem"
      },
      "max_dist": 16
    },
    {
      "filters": {
        "all_of": [
          {
            "test": "is_family",
            "subject": "other",
            "value": "baby_turtle"
          },
          {
            "test": "in_water",
            "subject": "other",
            "operator": "!=",
            "value": true
          }
        ]
      },
      "max_dist": 16
    }
  ]
},

見つかったコンポーネントの中身を読んでいくと「entity_types」の中に「is_family」「player」という文字列があると思います。

entity_typesが敵対する条件のリストであり、その中の1つにプレイヤーが指定されています。

is_familyは条件の種類の1つです。ビヘイビアーでは「フィルター」といい、is_familyはファミリーに属するかを条件にします。ファミリーはコマンドで扱うセレクターのfamily引数で指定するものと同様です。例えば「zombie」というファミリーは通常のゾンビだけでなく、村人ゾンビやハスクなどのゾンビ系のエンティティを含みます。

これを消せば敵対しなくなりますが、せっかくなので代わりに別のエンティティに敵対するように書き換えましょう。

今回はplayerをzombieにします。これでプレイヤーの代わりにゾンビ系のエンティティに敵対するようになります。ちなみに「max_dist」は敵対する最大距離を指定できます。

    {
      "filters": {
        "test": "is_family",
        "subject": "other",
        "value": "zombie"
      },
      "max_dist": 16
    },

以上でビヘイビアーの改造は終わりです。以下に改造箇所周辺を抜粋したので、上手くいかなかった場合は間違い探しの参考にしてください。

skeleton.json
{
  "format_version": "1.21.0",
  "minecraft:entity": {
    "description": {
      "identifier": "minecraft:skeleton",
      "spawn_category": "monster",
      "is_spawnable": true,
      "is_summonable": true
    },
    "component_groups": {
      // 省略
    },
    "components": {
      // 省略

      // 削除
      // "minecraft:burns_in_daylight": {
      // },

      "minecraft:health": {
        "value": 1,
        "max": 1
      },
      // 省略
      "minecraft:movement": {
        "value": 1
      },
      // 省略
      "minecraft:behavior.nearest_attackable_target": {
        "priority": 2,
        "must_see": true,
        "reselect_targets": true,
        "entity_types": [
          {
            "filters": {
              "test": "is_family",
              "subject": "other",
              "value": "zombie"
            },
            "max_dist": 16
          },
          {
            "filters": {
              "test": "is_family",
              "subject": "other",
              "value": "irongolem"
            },
            "max_dist": 16
          },
          {
            "filters": {
              "all_of": [
                {
                  "test": "is_family",
                  "subject": "other",
                  "value": "baby_turtle"
                },
                {
                  "test": "in_water",
                  "subject": "other",
                  "operator": "!=",
                  "value": true
                }
              ]
            },
            "max_dist": 16
          }
        ]
      },
      // 省略
    },
    "events": {
      // 省略
    }
  }
}

動作チェック

ここまで出来ましたら、実際にビヘイビアーパックをワールドに適用して試してみましょう。

スケルトンは日光で燃えず、体力が少なくなっているはずです。プレイヤーを見ても敵対せず、代わりにゾンビがいれば高速で近づいて攻撃を始めます。

上手くいかないときはコンマが抜けていたり、括弧の数がおかしいなどJSONの書き方にエラーが間違いがないか、誤字脱字がないかよくよく確認してみてください。

最後に

ここまで実際の改造例をお見せしてきましたが、だいたいの流れは理解できましたでしょうか?今回使用したコンポーネントは数多くあるうちのごく一部ですが、このコンポーネントの使い方を知るためには既存のエンティティがとても良い教科書になります。是非参考にしながらアドオン作りに活かしてみてください。

英語ですがMicrosoft公式が用意しているエンティティのビヘイビアーで使うコンポーネント一覧があるのでこちらも参考にどうぞ。

Entity Documentation - Component List
A reference document listing all available entity components

コメント

コメント通報