このチュートリアルでは、次の内容を学びます。
- ビヘイビアー ファイルを作成および使用してエンティティの動作を変更する方法。
- コンポーネントを使用してエンティティの動作を拡張する方法。
- イベントを使用して、何らかの条件に基づいて有効なコンポーネントを変更する方法。
要件
本チュートリアルを開始する前に、以下を完了しておくことをお勧めします。
はじめに
Minecraft: Bedrock Edition のビヘイビアー ファイルを使用すると、エンティティがどのように動作し、世界とどのようにやり取りするかをカスタマイズできます。 これはビヘイビアー パックの一部ですが、ビヘイビアー パックには関数やルート テーブルなどの他の種類のファイルも含まれることがあります。
ビヘイビアー ファイルは当初、バニラ エンティティの動作をカスタマイズする手段として追加コンテンツと共に導入されました。 以前にハードコーディングされていた個々のモブのメカニズムを、クリエイターがエンティティをカスタマイズするために使用できる小さい部品に分割するために、コンポーネントが作成されました。 たとえば、ネコや犬に使用される飼い慣らしのメカニズムは、クリエイターが他のエンティティも飼い慣らすことができるように tameable
コンポーネントに移行されました。
目的は、何年もかけてエンティティのありとあらゆるメカニズムをカスタマイズ可能にすることでした。
エンティティ追加が導入されたときに、ビヘイビアー ファイルは、バニラ エンティティのすべてのコンポーネントを使用して新しいエンティティを一から作成するための手段となりました。
ビヘイビアー ファイルは次の 2 とおりの方法で使用されます。
- バニラ エンティティを変更する。 エンティティ追加の導入以降、これは追加コンテンツではなく、バニラ ゲームの微調整に対してのみ使用すべき方法です。
- カスタム エンティティを作成する。 ビヘイビアー ファイルはカスタム エンティティの土台として機能します。
形式の概要
エンティティのビヘイビアー ファイルは、ビヘイビアー パックの entities
フォルダーに保存されます。 そのフォルダー内のすべてのファイルがゲームによって読み込まれるので、サブフォルダーを使用してエンティティを管理できます。 ファイルには拡張子 .json
を使用します。 この拡張子は追加コンテンツ内の多数のファイルで使用されるので、混同を避けるために、拡張したファイル拡張子 .behavior.json
をビヘイビアー ファイル専用に使用することもできます。 他の拡張した拡張子については、こちらの表を参照してください。
ファイルは JSON で記述され、基本的な構造は次のようになります。
{
"format_version": "1.13.0",
"minecraft:entity": {
"description": {
"identifier":"compass:example",
"is_spawnable":true,
"is_summonable":true
},
"components": {},
"component_groups": {},
"events": {}
}
}
`description` タグ内では、いくつかの基本プロパティにより、ゲームでエンティティがどのように登録されるかが定義されます。
パラメーター名 | 型 | 説明 |
---|---|---|
identifier |
文字列 | エンティティの識別子。 これが追加コンテンツ内のカスタム エンティティである場合は、例に示したように一意のカスタム名前空間を使用する必要があります。 |
runtime_identifier |
文字列 | ゲームで内部的に使用される識別子。 これは、まだコンポーネントとして提供されていないバニラ エンティティのカスタム メカニズムを継承するために使用できます。 エンティティごとに 1 つのランタイム識別子のみを指定できます。これを使用するのは本当に必要な場合だけにしてください。 バニラ エンティティのメカニズムがコンポーネントになった場合、ランタイム識別子を使用してそのメカニズムを利用していると、機能が失われる可能性があります。 |
is_spawnable |
ブール | |
true の場合、エンティティのスポーン エッグがクリエイティブモードの持ち物画面に追加されます。 |
||
is_summonable |
ブール | |
true の場合、/summon コマンドを使用してエンティティを召喚できます。 |
||
is_experimental |
ブール | |
animations |
オブジェクト | 動作のアニメーションまたはアニメーション コントローラーのリスト。 これらはエンティティに対してコマンドまたはイベントを実行するために使用できます。 |
scripts |
オブジェクト | スクリプトはクライアント エンティティ ファイル内と同様に機能し、動作のアニメーションを再生するために使用できます。 |
コンポーネントとコンポーネント グループ
コンポーネントは、エンティティに追加することができるプロパティまたはメカニズムです。 コンポーネントを追加するには、コンポーネント タグに直接追加する方法と、コンポーネント グループを使用する方法の 2 つがあります。
- 基本のコンポーネント タグに追加されたコンポーネントは、イベント内でコンポーネント グループを使用して削除されない限り、常に有効となります。
-
**コンポーネント グループ**は、それぞれデフォルトでは有効になっていないが、イベントを使用することで有効または無効にできる、1 つまたは複数のコンポーネントのセットです。 たとえば、これを使用してエンティティの亜種 (赤ちゃんなど) を作成できます。
次の例では、コンポーネント グループを使用してエンティティの赤ちゃん亜種を作成しています。 メインのコンポーネントのセクションで定義されているコンポーネントは常に有効ですが、baby
コンポーネント グループ内のコンポーネントはそのグループが追加されたときにのみ有効になります。
{
"format_version": "1.13.0",
"minecraft:entity": {
"description": {
"identifier":"compass:example",
"is_spawnable":true,
"is_summonable":true
},
"components": {
"minecraft:physics":{}
},
"component_groups": {
"baby": {
"minecraft:behavior.follow_parent": {},
"minecraft:is_baby": {}
}
},
"events": {}
}
}
Minecraft のすべてのコンポーネントは minecraft:
名前空間を使用します。
ほぼすべてのコンポーネントが JSON オブジェクトとして定義されます。 大部分のコンポーネントにはこのオブジェクト内で指定できるオプションがありますが、一部のコンポーネントは前の例で示したようにオプションなしで機能します。
コンポーネントについて学ぶ方法
利用可能なコンポーネントの完全なリストはこちらにあります。
コンポーネントについて学び、実際にどのように使用されているかを知るための良い方法は、デフォルトの Minecraft エンティティのビヘイビアー ファイルを見てみることです。 最新のデフォルトのビヘイビアー パックは https://aka.ms/behaviorpacktemplate でいつでも確認できます。
注意
コンポーネントの動作方法はバージョン間で異なることがあります。 そのため、バニラ エンティティのコンポーネントが自分のエンティティで動作しない場合は、両方のファイルが同じ形式のバージョンを使用しているかどうかを確認してください。 常に最新バージョンのコンポーネントを使用することをお勧めします。最新バージョンは改善されており、修正を含んでいる可能性があるからです。
主要なコンポーネント
コンポーネント名 | オプション | 説明 |
---|---|---|
minecraft:physics |
has_collision has_gravity |
このコンポーネントは 99% のカスタム エンティティで必要になります。 これによってエンティティは宙に浮くことなく、クリエイターの思いどおりの方法で操作やパンチに反応できるようになります。 |
minecraft:scale |
value |
エンティティのサイズを設定します。 |
minecraft:collision_box |
width height |
エンティティの当たり判定を設定します。 |
width と height のみを変更できます。 当たり判定は常に、世界の軸に合わせて配置された正方形の底面を持ちます。 |
||
minecraft:type_family |
family |
エンティティが属する種族のリストを設定します。 種族は他のエンティティによってテストすることができます。 たとえば、どのモブと敵対するかをテストできます。 |
minecraft:movement |
value |
エンティティの移動速度を設定します。 0.25 が Minecraft における大部分の動物の通常の速度です。 |
minecraft:movement.basic |
ドキュメントを参照 | エンティティが地上を動き回れるようにします。 |
minecraft:navigation.walk |
ドキュメントを参照 | エンティティが世界中を歩いて移動できるようにします。 他の種類の移動方法 (ホバリングなど) もあります。 |
minecraft:is_baby minecraft:is_ignited minecraft:is_saddled minecraft:is_sheared minecraft:is_tamed minecraft:is_illager_captain |
:--- | これらのコンポーネントはそれ自体では何も行いませんが、アニメーション、アニメーション コントローラー、またはレンダー コントローラー内でクエリすることで、エンティティの動作からアニメーションやその他のビジュアルを制御できるようになります。 |
minecraft:variant minecraft:mark_variant minecraft:skin_id |
value |
これらのコンポーネントは上記のコンポーネントと同様に機能しますが、オン/オフ状態のみを格納するのではなく、整数値を格納できます。 |
優先度
`priority` オプションはすべての動作コンポーネントに対して使用できます (AI 目標)。 `0` は最も高い優先度であり、すべての動作コンポーネントのデフォルトの優先度です。 数値が大きくなるほど、優先度が低くなります。 エンティティが優先度の低い動作を実行中でビジー状態にあり、優先度の高い動作が発生した場合、エンティティは即座に優先度の高い動作に切り替えます。
次の例では、hurt_by_target
コンポーネントの方が高い優先度を持ちます。 エンティティが散歩しているときに攻撃された場合、攻撃してきた相手をただちに攻撃対象にします。
"minecraft:behavior.random_stroll": {
"priority": 4
},
"minecraft:behavior.hurt_by_target": {
"priority": 1
}
コンポーネントの削除
コンポーネント グループがエンティティから削除されると、コンポーネントの効果も削除されます。 ほとんどの場合、それによって問題が発生することはありません。 しかし一部のケースでは、コンポーネントが相互に上書きし合うことを考慮することが重要となります。 あるコンポーネントを削除した場合、そのコンポーネントが前の状態に戻されることはなく、別のコンポーネント グループや基本のコンポーネントから同じコンポーネントが使用されることもありません。 その代わりにコンポーネントは完全に削除され、そのデフォルト値にリセットされます。
例として、基本の components
タグ内でスケールが 2
と定義されているエンティティがあるとします。 そこに、スケールを 1.5
に設定するスケール コンポーネントを含んだ赤ちゃんコンポーネント グループを追加します。 これにより、スケールは 1.5
に正しく更新されます。 次に、そのコンポーネント グループを削除します。 スケールは 2
に戻るのではなく、1
にリセットされます。 このようなことが起こるのは、コンポーネント グループを削除するとスケール コンポーネント全体も削除されるためです。 スケールはデフォルト値である 1
にリセットされます。
この点を考慮することが重要なコンポーネントがいくつかあります。
- エンティティの
minecraft:scale
、minecraft:collision_box
、minecraft:variant
のような値を変更するコンポーネント。 - リスト コンポーネント。例:
minecraft:interact
、minecraft:environment_sensor
、minecraft:damage_sensor
- 異なる状態に設定したい他のすべてのコンポーネント。例:
minecraft:rideable
(異なる座席数や位置に設定)
この動作を回避するには、更新された状態のコンポーネントを含んでいる新しいコンポーネント グループを追加する必要があります。 スケールの例の場合、これは異なる状態を示す 2 つの異なるコンポーネント グループを作成して切り替え可能にするのと同じくらい簡単です。
"components": {
"minecraft:scale":{
"value": 2
}
},
"component_groups": {
"baby": {
"minecraft:scale": {
"value": 1.5
}
},
"adult": {
"minecraft:scale": {
"value": 2
}
}
},
"events": {
"set_baby":{
"remove": {"component_groups": ["adult"]},
"add": {"component_groups": ["baby"]}
},
"set_adult":{
"remove": {"component_groups": ["baby"]},
"add": {"component_groups": ["adult"]}
}
}
イベント
イベントは、エンティティに対してコンポーネント グループの追加と削除を行うために使用されます。 次の例では、1 つの古いコンポーネント グループを削除し、2 つの新しいコンポーネント グループを追加します。
"events": {
"compass:example_event": {
"remove": {
"component_groups": ["compass:group_a"]
},
"add": {
"component_groups": ["compass:group_b","compass:group_c"]
}
}
}
イベントは minecraft:interact
や minecraft:environment_sensor
などの多くのコンポーネント、動作のアニメーション、または召喚コマンドによってトリガーできます。 次のコマンドでは、上のイベントの実行中にエンティティをスポーンさせます。
/summon compass:example_entity ~ ~ ~ compass:example_event
組み込みのイベント
いくつかのイベントは Minecraft に組み込まれており、特定の条件下でエンティティがスポーンされた場合に実行されます。
イベント名 | 説明 |
---|---|
minecraft:entity_born |
このイベントは、エンティティが繁殖によってスポーンされたときに実行されます。 |
minecraft:entity_spawned |
このイベントは、エンティティがスポーンされるたびに実行されます。 ただしエンティティを手動で /summon した場合には実行されません。 |
minecraft:entity_transformed |
このイベントは、別のエンティティがこのエンティティに変身したときに実行されます。 |
minecraft:on_prime |
このイベントは、エンティティが起爆されて爆発する準備ができたときに実行されます。 |
乱数発生器
エンティティに追加されるコンポーネント グループをランダムに選択したい場合は、ランダム化関数を使用できます。 それぞれがコンポーネント グループを追加および削除できるオブジェクトの配列を指定します。 ゲームはそれらのオブジェクトから 1 つをランダムに選択し、実行します。
任意でオプションに重みオプションを追加して、各オプションの確率を変更することもできます。 すべての重みを合計すると 100% になります。 次の例では、エンティティは 20% (1 対 4) の確率で赤ちゃんとしてスポーンされ、それ以外の場合にはコンポーネント グループが追加されません。
"events": {
"minecraft:entity_spawned": {
"randomize": [
{
"weight": 40
},
{
"weight": 10,
"add": {
"component_groups": ["baby"]
}
}
]
}
}
シーケンス
同じイベント内で複数のイベントを続けて実行することが必要な場合があります。 たとえば、エンティティの 2 つの側面 (色とマーク パターンなど) をランダム化したい場合があります。 その場合は、シーケンスを使用します。 シーケンスは乱数発生器と似た構造を持ちますが、リスト内の各アイテムが順番に実行されます。 また、後のセクションで説明するように、これはフィルターと組み合わせると非常に便利です。
シーケンスと乱数発生器は無制限にネストできます。
次の例では、エンティティがスポーンされるとグループ initial
が追加されます。 その後、前のセクションで示したように赤ちゃんコンポーネントがランダム化されます。
"events": {
"minecraft:entity_spawned":{
"sequence": [
{
"add": {
"component_groups": ["initial"]
}
},
{
"randomize": [
{
"weight": 40
},
{
"weight": 10,
"add": {
"component_groups": ["baby"]
}
}
]
}
]
}
}
フィルター
フィルターは、現在のエンティティ (操作するエンティティまたは世界) に対して特定のプロパティのテストを行うことで、イベントまたはイベントの一部分に条件を付けます。 フィルターはすべてのイベント内で使用できますが、一部のコンポーネント内で直接使用することもできます。
イベントは最大 5 つのパラメーターで構成されます。 パラメーター test
と value
は必須で、それ以外は省略可能です。
テストの種類 | テストするプロパティ |
---|---|
value |
テストする値。 文字列 (文字列をテストするとき)、数値 (数値をテストするとき)、またはブール値を指定できます。 |
subject |
テストを実行する対象のエンティティ。 これはデフォルトでは self ですが、操作に含まれる他のエンティティも対象にできます。 |
operator |
値の比較方法。 これはデフォルトでは equals ですが、値がより小さい/より大きいか (数値の場合)、または等しくないかどうかをテストすることもできます。 |
domain |
これは、追加のコンテキストを提供するためにいくつかのテストでのみ使用されます。たとえば、has_equipment テストで持ち物スロットを調べる場合などです。 |
注意
フィルターの完全なリストと、これらのパラメーターとの連携方法については、エンティティのテクニカル ドキュメントを参照してください。
イベント内部のフィルターの最小限の例を次に示します。このコンポーネント グループは、エンティティにタグ event_allowed
がある場合にのみ追加できます。
"events": {
"compass:example_event": {
"filters": {
"test": "has_tag",
"value":"event_allowed"
},
"add": {
"component_groups": ["baby"]
}
}
}
複数のフィルターを使用したい場合は、リスト all_of
、any_of
、または none_of
を使用してグループ化できます。それぞれ、内部のすべてのフィルターが成功した場合、いずれかのフィルターが成功した場合、またはどのフィルターも成功しなかった場合にのみ成功となります。 これらのリストは無制限にネストできます。
次の例では、フィルターに 2 つ目の条件を追加します。 エンティティに前の例のタグがあり、かつ最も近いプレイヤーとの距離が 10 ブロック未満である場合にのみ、イベントが実行されます。
"events": {
"compass:example_event": {
"filters": {
"all_of":[
{"test": "has_tag", "value": "event_allowed"},
{"test": "distance_to_nearest_player", "operator": "<", "value": 10}
]
},
"add": {
"component_groups": ["baby"]
}
}
}
次のステップ
コンポーネントの動作について困ったときや詳しく知りたくなったときは、バニラのビヘイビアー ファイルを調べると実際の例を確認できます。 バニラ エンティティを分解して別のエンティティに適用することは、始めるのに最適な方法です。 エンダーマンから minecraft:teleport
コンポーネントを取り出してクリーパーに適用したり、 ゾンビにプレイヤーが乗れるようにしたり、 赤ちゃんクリーパーを作成したりしてみましょう。
コンポーネント システムを使用すると、エンティティがどのように動作し、世界とどのようにやり取りするかをカスタマイズできます。 エンティティの見た目と動きを設計する方法について詳しく学びたい場合は、エンティティのモデリングとアニメーションに関するチュートリアルを参照してください。