【マインクラフト（統合版）】エンティティプロパティの使い方まとめ

# はじめに

エンティティプロパティというのは、各エンティティが独自で保持できるビヘイビアパック上のデータ領域です。

オブジェクト指向型言語で言うところのクラスのプロパティと同じようなニュアンスだと考えて頂ければ分かり易いかと思いますが、アクセス方法が特殊なので注意が必要です。

ここではプロパティの定義方法とアクセス方法をご紹介します。


# 定義方法

まずは以下のファイルをご覧ください。
[&gt;&gt; ダミーエンティティの作り方](https://qiita.com/glasses_seven/items/abf1aecba67284e88e27/ "【マインクラフト（統合版）】ダミーエンティティの作り方まとめ")のページでご紹介したファイルに`properties`ブロックを追加したものです。

```json:<ビヘイビアパック>/entities/dummy_entity.json
{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "customize:dummy_entity",
            "is_spawnable": false,
            "is_summonable": true,
            "properties": {
                "customize:bool_dummy": {
                    "type": "bool",
                    "default": false
                }
            }
        },
        "components": {}
    }
}
```

プロパティは上記のように`description`ブロックの中で`properties`ブロックとして定義します。

```text:定義形式
"<ネームスペース>:<プロパティ名>": { 
    <データ型別のステートメント>
}
```
<br />

### データの種類

使えるデータ型はbool型も含めて以下の４種類です。
残念ながら文字列型は存在しないようです。
<br />

```json:int型
"customize:int_dummy": { 
    "type": "int", 
    "range": [0, 4], 
    "default": 0 
}
```

<dl>
    <dt>type</dt>
    <dd>固定で<code>int</code>を指定します。</dd>
    <dt>range</dt>
    <dd>配列形式で[最小値,最大値]を指定します。</dd>
    <dt>default</dt>
    <dd>デフォルト値を指定します。</dd>
</dl><br />

```json:float型
"customize:float_dummy": { 
    "type": "float", 
    "range": [0.0, 30.0], 
    "default": "math.random(20, 25)" 
}
```

<dl>
    <dt>type</dt>
    <dd>固定で<code>float</code>を指定します。</dd>
    <dt>range</dt>
    <dd>配列形式で[最小値,最大値]を指定します。</dd>
    <dt>default</dt>
    <dd>
        デフォルト値を指定します。<br />
        上記の例ではMolangの<code>math.random(20, 25)</code>を使って20～25のランダム値を指定しています。
    </dd>
</dl><br />

```json:bool型
"customize:bool_dummy": { 
    "type": "bool", 
    "default": false 
}
```

<dl>
    <dt>type</dt>
    <dd>固定で<code>bool</code>を指定します。</dd>
    <dt>default</dt>
    <dd>デフォルト値をtrue、またはfalseで指定します。</dd>
</dl><br />

```json:enum型
"customize:enum_dummy": { 
    "type": "enum", 
    "values": ["park", "reverse", "neutral", "drive"], 
    "default": "park", 
    "client_sync": true 
}
```

<dl>
    <dt>type</dt>
    <dd>固定で<code>enum</code>を指定します。</dd>
    <dt>values</dt>
    <dd>enum値を文字列の配列形式で指定します。</dd>
    <dt>default</dt>
    <dd>values内の中からデフォルト値にするものを指定します。</dd>
    <dt>client_sync（他のデータ型でも使用可）</dt>
    <dd>trueの場合、リソースパックの<code>minecraft:client_entity</code>ブロックで使用可能になります。</dd>
</dl>


# アクセス方法

エンティティ内部では以下の方法でアクセスできます。
<br />
<dl>
    <dt>Molangで参照</dt>
    <dd>
        query.property('&lt;プロパティ名&gt;')の形式で指定。<br />
        データ定義で<code>client_sync</code>をtrueにしておけばリソースパックでも使えます。<br /><br /><br />
    </dd>
    <dt>filterで参照</dt>
    <dd>
        <code>test</code>項目に型の種類、<code>domain</code>項目にプロパティ名を指定します。<br/>

```json:int型の場合
{"test":"int_property", "subject":"self", "domain":"customize:int_dummy", "value":4, "operator":">"}
```
```json:float型の場合
{"test":"float_property", "subject":"self", "domain":"customize:float_dummy", "value":4.5, "operator":">"}
```
```json:bool型の場合
{"test":"bool_property", "subject":"self", "domain":"customize:bool_dummy", "value":true, "operator":"=="}
```
```json:enum型の場合
{"test":"enum_property", "subject":"self", "domain":"customize:enum_dummy", "value":"park", "operator":"!="}
```
```json:プロパティの存在確認
{"test":"has_property", "subject":"self", "value":"customize:bool_dummy", "operator":"=="}
```
<br />
        ※上記のいずれの場合もsubjectは<code>self</code>をデフォルトとして、operatorは<code>==</code>または<code>equals</code>をデフォルトとして省略できます。<br /><br /><br />
    </dd>
    <dt>set_propertyで設定</dt>
    <dd>
<br />

```json:プロパティの設定ブロック例
"set_property": { 
    "customize:int_dummy": "query.property('customize:int_dummy') + 1" 
}
```
<br />
        外部から設定するには以下の<code>events</code>ブロックのようにイベントとして定義します。<br />

```json:&lt;ビヘイビアパック&gt;/entities/dummy_entity.json
{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "customize:dummy_entity",
            "is_spawnable": false,
            "is_summonable": true,
            "properties": {
                "customize:bool_dummy": {
                    "type": "bool",
                    "default": false
                }
            }
        },
        "components": {},
        "events": {
            "customize:bool_dummy_set": {
                "set_property": {
                    "customize:bool_dummy": true
                }
            },
            "customize:bool_dummy_reset": {
                "set_property": {
                    "customize:bool_dummy": false
                }
            }
        }
    }
}
```
<br />
    </dd>
</dl>


# 各種制限事項

### プロパティ数の制限

エンティティの各タイプごとに３２個までと決められているようです。

### int型

使える範囲は-16,777,216～16,777,215のようですが、-1,000,000～1,000,000の範囲で使う事が推奨されています。

### enum型

一つのenum型プロパティに対して１６エントリまで許容されます。
enum値の文字列の長さは１～３２文字です。
最初の文字はアルファベット、それ以降はアルファベット・数字・アンダースコアの構成である必要があります。


# おわりに

本環境では以下のページでご紹介させて頂いたコンテンツ内で、Websocketサーバーと連携する形でエンティティプロパティを利用しています。

https://qiita.com/glasses_seven/items/e58ec2ceaf2850461965/