【Minecraft BE Addon講座#5】エンティティとコンポーネントとは？～entity.jsonの書き方とコンポネ～

本ページは**アドオン講座#5、「コンポネ編、エンティティとコンポーネントとは？～entity.jsonの書き方とコンポネ～」**です。
目次や、この講座については[#1の記事](https://qiita.com/pencilya/items/7b7e68265151f42a51ac)をご覧ください。

#コンポネ編で理解してほしいこと！
コンポネ編はこのアドオン講座の基礎編の次のページに位置し、**内容としては応用編の中でも基礎寄り**になります。
エンティティの追加には欠かせませんし、特に初回の#5の内容はアニコン編でもお世話になります。
基礎編を終えてとりあえず何かやってみようという方におすすめです！

コンポネ編は3ページからなり、**初回#5は基礎編の延長で、書き方(記法)と仕組みの理解**について、**#6では重要な条件分岐の役割を担う機能**について、**最後#7では実践としてタグによって体力(HP)が変わるアドオンを作って**みます。

このコンポネ編では、エンティティの持つコンポーネントを自由に追加消去編集することで、**エンティティに特殊な性質をもたせる、また特殊な動きをさせられるようになる**ことを目的としています。

* (前提#3~#4)基礎編
* (#5)エンティティとは？
* (#5)`entity.json`とは？
* (#5)エンティティのしくみとコンポーネント
* (#5)[実践]プレイヤーの名前を非表示にしてみよう
* (#6)フィルターとは？
* (#6)フィルターの記法
* (#7)コンポーネントを操るには？
* (#7)センサーとは？/コンポーネントグループとは？
* (#7)[実践]プレイヤーの体力をタグで変更してみよう

#エンティティとは？
まず、みなさん**「エンティティ(entity)」**と言われて、何のことか分かるでしょうか？
マイクラの**ワールド内で動いているもののほとんどがエンティティ**です。
例えば、牛、豚、羊、ゾンビなどMobと呼ばれるものから、
プレイヤー、アーマースタンド、トロッコ、エンドクリスタルなども含み、
「落ちているアイテム」「投げられているアイテム(雪玉、卵、火球、花火、矢など)」、「経験値オーブ」、
さらには「雷」「残留ポーションのもや」もエンティティです。

:::note warn
いくつかほかの要素と間違えやすいエンティティも存在します。
例えば、TNTはブロックですが、着火された瞬間ブロックではなく、エンティティになります。
他には、「残留ポーションのもや」はエンティティですが、「スプラッシュポーションが着弾したときに出る一瞬のもや」はエンティティではなく、パーティクルです。
:::

:::note warn
/summonコマンドで召喚できないからといって、それがエンティティでないとは限りません。
/summonコマンドで召喚できないエンティティも存在します(例えば、プレイヤー)。
behavior/entitiesフォルダに入っているファイルのものがすべてのエンティティとなるので、そこにあれば、それはエンティティです。
:::

このコンポネ編では、これらエンティティについての設定が書かれたファイル`entity.json`について扱い、それらのエンティティの性質を自由に追加したり、削除したり、変更したりするのが目的なのです！

#`entity.json`とは？
###呼び方について
この呼び方は実は正式名称ではありません！(おい)
個人的に、**`behavior/entities`フォルダに入っている`[entity名].json`のファイルたち**のことを**`entity.json`**と呼んでいます。
説明する度毎回「`behavior/entities`フォルダに入っている`[entity名].json`のファイル」と呼ぶのは逆に分かりにくいので、この講座ではこの略称を用いています。

実はリソースの方にも`resource/entity`というフォルダがあるのですが、こちらは使用しないのでご注意を。
アニコンのときと違い、「`behavior/entities`に入っている`[entity名].json`」と「`resource/entity`に入っている`[entity名].json`」は**だいぶ異なるもの**です。
エンティティ追加のときにまた詳しく説明すると思います。

###`entity.json`＝エンティティの設定ファイル
話がそれましたが、この`entity.json`、何が書かれているファイルなのかというと、**エンティティが何なのか、どういう行動をするのか/できるのか**が主になります。まさに`behavior`(直訳：行動)そのものが書かれているファイルです。


###まずはサンプル(`behavior/entities/player.json`)
とりあえず`entity.json`の一例の中身をのぞいてみましょう。
基本的に、例では`player.json`を使います[^1]。

[^1]: Mobとかをいじって遊ぶよりも、`player.json`いじって、プレイヤー自身がいろいろ不思議なことができるようにした方がおもしろいと思っているので、主にプレイヤーをいじっていきます。

```behavior(v1.17.30)/entities/player.json
{
  "format_version": "1.17.10",
  "minecraft:entity": {
    "description": {
      "identifier": "minecraft:player",
      "is_spawnable": false,
      "is_summonable": false,
      "is_experimental": false
    },

    "component_groups": {
      ...
    },

    "components": {
      ...
    },

    "events": {
      ...
    }
  }
}
```

※「...」は略

2行目はお決まりの`"format_version"`ですが、それ以降はすべて`"minecraft:entity"`というカッコの中に入っていることが分かります。
`"minecraft:entity"`内には、

* `"description"`
* `"component_groups"`
* `"components"`
* `"events"`

の4つが入ります。

###`entity.json/"minecraft:entity"`解説
####①`"description"`＝エンティティの概要、説明
`"description"`にはそのエンティティが何なのか、マイクラ内にエンティティが存在する上でのシステム面的な設定が書かれます。
具体的には、

||  | 説明 | 例 |
|:--|:--|:--|:--|
|必須| `"identifier"`  | エンティティidです。  | `"minecraft:player"`  |
|必須| `"is_spawnable"`  | スポーンエッグで召喚できるか  | `true`  |
|必須| `"is_summonable"`  | `/summon`コマンドで召喚できるか  | `true`  |
|必須| `"is_experimental"`  | 試験的要素か。`true`にすると、ワールドの試験的がオフのとき、エンティティは認識されません  | `false`  |
|| `animations`  | このエンティティにひもづけるアニメーションとアニコンの登録  | 詳しくは[#11](https://qiita.com/pencilya/items/0c7e5bdc285aca55ee4c)と[#13](https://qiita.com/pencilya/items/103bb885fa9e4876d25c)  |
|| `scripts`  | アニメーションとアニコンの常時実行  | 詳しくは[#11](https://qiita.com/pencilya/items/0c7e5bdc285aca55ee4c)と[#13](https://qiita.com/pencilya/items/103bb885fa9e4876d25c)  |

です。これ以外を使うことは基本的にありません。

####②`"components"`＝コンポーネント、エンティティの行動要素
この**`"components"`のカッコの中に入っているもの**が、さっきからずっとコンポネコンポネと言っている正体、**コンポーネント**です。
それぞれのコンポーネントという部品をたくさん連ねることで、マイクラのエンティティの動きを形作っています。

例えば簡単な例を出すと、`behavior/entities/player.json`64行目[^2]の`"minecraft:can_climb"`というコンポーネントは、「このコンポーネントを持っているエンティティは「はしご」を上ることができるようになる」という効果をもちます。

[^2]: バージョン違いによって正確な行数は変わっている可能性が高いです。v1.17.30のバニラでの行数です。

エンティティが多種多様な動きをするように、**コンポーネントにはたくさんの種類があります**。

https://bedrock.dev/docs/stable/Entities#minecraft%3Aaddrider

これがそのコンポーネントのリストです。ものすごい数で、解説するにはキリがないのでひとつひとつ解説することはしないと思います。
検索したら日本語で解説してくれている人がいそう。

####③`"component_groups"`＝コンポネの切り替え用セット
コンポーネントをいくつか集めてグループにしたものを**コンポーネントグループ**と言います。
必要に応じて、コンポーネントのセットであるコンポーネントグループを切り替えることで、エンティティを成り立たせています。
詳しい意味合い、使用方法は[次々回#7](https://qiita.com/pencilya/items/c63ac2a6e34be38530fb)で解説します。

####④`"events"`＝イベント、コンポネグループの切り替えスイッチ
エンティティのもつイベントです。
このイベントが起きたらこのコンポネグループをオンにして、このコンポネグループをオフにして、などを記述します。
このように、コンポネ切り替えスイッチの役割を担うのが`"events"`です。
詳しい内容は[次々回#7](https://qiita.com/pencilya/items/c63ac2a6e34be38530fb)で解説します。

また、イベントはアニコンでも起こすことができます。
詳しくはアニコン編[#11](https://qiita.com/pencilya/items/0c7e5bdc285aca55ee4c)、[#13](https://qiita.com/pencilya/items/103bb885fa9e4876d25c)をご覧ください。

さらに、最近のバージョンアップで、コマンドでもイベントが起こせるようになりました。
`/event`コマンドのほか、`/summon`コマンドの引数でも起こすことができます。

イベントとアニコンやコマンドなど、他の要素との連携ができる機能は、上級者になればなるほどありがたいものになってくると思います。
私自身が使った例だと、投擲物追加でお世話になりました。
最初のうちは複雑に感じる一方なのであまり気にしなくて大丈夫です。

#[実践]プレイヤーの名前を非表示にしてみよう
ゲーム内設定/ビデオに「ゲーム内プレイヤーの名前の表示」という設定があります。
よくマルチプレイをされる方なら、「敵の位置がバレてしまうからオフにして！」と言われたことがあるかもしれません。
しっかりした企画ワールドなら、目を合わせなければ名前が表示されないようになっていたかもしれません。

実はプレイヤー名を表示するかしないかの制御はこの`entity.json`が行っています。
そのコンポーネントはこちら！

```[抜粋]behavior(v1.17.30)/entities/player.json
      ...
      "minecraft:nameable": {
        "always_show": true,
        "allow_name_tag_renaming": false
      },
      ...
```

※「...」は略

102行目[^2]からの部分を抜粋しました。
そうです**`"minecraft:nameable"`**というコンポーネントです。
このコンポネは**「そのエンティティに名前が付けられる」**ようになる効果をもちます。
そもそもコンポネ自体がないとエンティティに名前が付かなくなります。

このコンポネには、**子要素`"always_show"`と`"allow_name_tag_renaming"`があります**。
`"always_show"`は**「そのエンティティの名前を常に表示するか」**で、
`"allow_name_tag_renaming"`は**「そのエンティティの名前をネームタグで変更できるようにするか」**を設定しています。

今回は`"always_show"`をいじってみます。
**`"always_show"`を`true`から`false`に変更**することで、他のMobと同じように、目を合わせたとき以外、名前が常に表示されなくなります。

```[抜粋・変更後]behavior(v1.17.30)/entities/player.json
      ...
      "minecraft:nameable": {
        "always_show": false,
        "allow_name_tag_renaming": false
      },
      ...
```

ちなみに、`"allow_name_tag_renaming"`を`false`から`true`にして、プレイヤーの名前をネームタグで変更できるようにしたものは、過去に配布したことがあります。

http://pencilya.blog.jp/articles/20190429.html

ダウンロードして中身を見てみると、実はこれしか変えてないんですね笑
コンポネを適当にいじってたら革新的なアドオンができたりするので、他の技術と違いコンポネには夢があります笑

名前非表示化アドオンができたところで、今回はおしまいです！
1ページ分だけで実践までできてしまうのがコンポネの恐ろしいところです。

[次回#6](https://qiita.com/pencilya/items/b45be36b12589f4dc7e3)からは深くまで踏み込んで、コンポネの制御に使われる条件設定である**フィルター**についてやっていきます。
アニコン編の方は[次回が#11](https://qiita.com/pencilya/items/0c7e5bdc285aca55ee4c)になります。
すぐにアニコンを習得したい！という方はそちらへどうぞ！

お疲れ様でした～