NPC ダイアログ コマンド

分岐ダイアログを使用すると、ゲーム内でのプレイヤーのアクションや応答に基づいてダイアログを更新できる、動的な NPC ダイアログ スクリプトを作成できます。 分岐ダイアログ システムは、NPC エンティティ、ダイアログ コマンド、リソース シーン ファイルという 3 つの部分から構成されます。

要件

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

シーン ファイル

シーン ファイルは、ビヘイビアー パック (%localappdata%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\<your behavior pack folder>) のルート ディレクトリ内のダイアログ フォルダーにある json ファイルで、ここには分岐ダイアログに必要なすべての情報が含まれています。 必要に応じた数のシーン ファイルを作成できます。 シーン ファイルは世界の NPC ごとに作成することも、物語の章ごとに作成することもできます。また、世界に対してシーン ファイルを 1 つだけ作成することもできます。ファイルがダイアログ フォルダー内でどのように整理されているかに関係なく、分岐ダイアログ機能によってすべてのファイルが読み取られるため、選択は完全に自由です。

プロパティ

最初のプロパティは、この json ファイルを有効なシーン ファイルとして定義するヘッダーです。

例:

{
    "format_version": "1.17",
    "minecraft:npc_dialogue": {}
}

これは json ファイルなので、ブラケットで囲みます。 次に追加するプロパティは、"scenes" プロパティで、これはすべての分岐ダイアログを配置する場所です。

    {
        "format_version": "1.17",
        "minecraft:npc_dialogue": {
            "scenes": []
        }
    }

ヘッダーおよびシーン ファイル プロパティを準備できたら、NPC 分岐ダイアログの個々のシーンを作成できます。 NPC ダイアログのすべての新しいインスタンスには、新しいシーンが必要です。 これは、シーン ファイルでシーン タグを作成することによって定義します。 ゲーム内でシーン タグを使用して、シーン ファイルに指定したテキストを呼び出します。 ゲーム内 NPC エディターを使用して設定した場合と同様に動作する NPC ボタンとコマンドを設定することもできます。

NPC のシーン構造を確認してみましょう。

    {
        "scene_tag": "ducky_intro",
        "npc_name": "Ducky",
        "text": "Hello. My name is Ducky. Take this gold!",
        "on_open_commands": [
            "/clear @p"
        ],
        "on_close_commands": [
            "/say Enjoy the gold! "
        ],
        "buttons": [
            {
                "name": "Take Gold",
                "commands": [
                    "/give @initiator gold_ingot"
                ]
            }
        ]
    }

シーン プロパティ

scene_tag: これは、ゲーム内でこのシーンを呼び出すために使用する名前です。 これは必須のプロパティです。

npc_name: ここで、NPC ダイアログ ボックスの名前を追加したり変更したりできます。 これは、NPC 名を動的に変更する際に便利な、省略可能なプロパティです。

text: ここには、ゲーム内のこのシーンで NPC に表示させるダイアログを入力します。 ここにダイアログのテキストを直接入力することもできますし、言語ファイルを使用している場合は未加工テキストを使用することもできます。 これは省略可能なプロパティですが、指定しないと NPC ダイアログ ボックスが空白になります。

on_open_commands: ここでは、NPC ダイアログ ボックスが開いたときに実行されるコマンドを定義できます。 省略可能なプロパティです。

on_close_command: ここでは、NPC ダイアログ ボックスが閉じたときに実行されるコマンドを定義できます。 省略可能なプロパティです。

buttons: ここでは、NPC のボタンを作成できます。 サブセットには、“name” および “commands” プロパティが含まれています。 “name” プロパティでは、NPC のボタン上に表示されるテキストを設定できます。 2 つ目の "commands" プロパティを使用すると、ボタンが押されたときにゲーム内で実行されるコマンドを追加できます。 省略可能なプロパティですが、NPC ボタンを使用する場合は必須です。

rawtext

上記のシーン プロパティはすべて rawtext をサポートします。

    {
        "scene_tag": "ducky_intro",
        "npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
        "text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
        "on_open_commands": ["/clear @p"],
        "on_close_commands": ["/say Enjoy the gold! "],
        "buttons": [
            {
                "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
                "commands": [
                    "/give @initiator gold_ingot"
                ]
            }
        ]
    }

ダイアログ コマンド

ダイアログ コマンドを使用すると、NPC がシーン ファイルを開いたり読み取ったりできます。 このコマンドには 2 つの異なるモードがあり、それぞれに独自の目的と構文があります。

dialogue open

dialogue open は、ターゲットのプレイヤーに対して強制的に NPC ダイアログ ボックスを開くときに使用されます。 この機能は NPC をクリックするという体験をシミュレートするため、以前はリモート ファイアと呼ばれていました。 このコマンドは任意の NPC で使用できます。NPC にダイアログでシーン ファイルを使用させるのではない限り、ビヘイビアー パックは不要です (ビヘイビアー パックは dialogue open を使用するための要件ではありません)。

dialogue open の構文は次のとおりです。

    /dialogue open <npc: target> <player: target> [sceneName:string]

/dialogue: 先頭のコマンドです。

open: コマンドのバリアントです。

<npc: target>: ターゲットとする NPC です。

<player: target>: ターゲットとするプレイヤーです。 これは、NPC のダイアログ ボックスの表示先になるプレイヤーです。

[sceneName:string]: これは、シーン ファイルに記載されているダイアログを使う際に使用される名前です。 string は有効なシーン タグ名である必要があります。そうでない場合は失敗します。 これは省略可能なパラメータです。

注意

sceneName が指定されていない場合、NPC が最後に行ったダイアログが表示されます。

実際の使用法

dialogue open には主に 2 つの用途があります。

1 つは、プレイヤーが NPC と直接やり取りしていない状態で NPC ダイアログ ボックスを開始させることです。この場合、基本的に NPC はプレイヤーがクリックする必要のない "ポップアップ" ウィンドウとして使用されます。 このシナリオの NPC は、世界内でプレイヤーに見えていなくてもかまいません (ただし、読み込まれたチャンク内に存在し、ダイアログを受け取るプレイヤーのすぐ近くにいる必要があります)。地下やその他のアクセスできない場所に隠しておくこともできます。

dialogue open の 2 つ目の用途は、シーン ファイルを使用して分岐ダイアログ ツリーを作成することです。 NPC シーン ファイル内で dialogue open コマンドを使用することで、NPC は on_close_commands または buttons コマンドを使用して、プレイヤーに対して自動的に次のダイアログ ボックスを開くことができます。 これは、すべてのダイアログ ツリー分岐パスの基礎となります。

dialogue change

dialogue change は、明示的に指定されたシーン ファイルで提供されるダイアログを使用するよう NPC に指示するために使われます。 このコマンドが正しく機能するためには、ダイアログ フォルダーとシーン ファイルが含まれたビヘイビアー パックを使用する必要があります。 このコマンドは、ターゲットの NPC に対して、シーン タグ名によって指定された場所からダイアログをプルするように指示します。 プレイヤーが NPC とのやり取りを開始する前に、コマンドを実行する必要があります。

dialogue change の構文は次のとおりです。

    /dialogue change <npc: target> <sceneName:string> [player: target]

/dialogue: 先頭のコマンドです。

change: コマンドのバリアントです。

<npc: target>: ターゲットとする NPC です。

<sceneName:string>: これは、シーン ファイルに記載されているダイアログを使う際に使用される名前です。 string は有効なシーン タグ名である必要があります。そうでない場合は失敗します。

[player: target]: ターゲットとするプレイヤーです (これは、ダイアログ ボックスの表示先になるプレイヤーです)。 "/dialogue change" コマンドでこれを省略した場合、NPC ダイアログはすべてのプレイヤーに対して更新されます。

実際の使用法

dialogue change は主に、コマンドを使って NPC のダイアログを変更する目的で使用されます。 このコマンドは、世界内でプレイヤーがトリガーしたコマンドブロックから実行することも、別の NPC から実行することも、ターゲットの NPC 自体から実行することもできます。

世界でのプレイヤーのアクション (特定の領域に入る、別の NPC と話をする、特定のタスクを実行するなど) に基づいて、NPC のダイアログを変更する必要が生じることがあります。 アクションを評価できる場合は、それを使用してダイアログ コマンドを実行し、NPC のダイアログを変更することができます。

dialogue change では、dialogue open の場合のように NPC ダイアログ ボックスが表示されるわけではなく、その NPC との次のやり取りの間にプレイヤーに表示するシーン ファイル ダイアログを NPC に指示するだけです。

ターゲット

ターゲットは NPC ダイアログ分岐システムに不可欠な部分です。 これによって、どの NPC がコマンドを受け取り、どのプレイヤーにダイアログが表示されるかが決まります。 また、マルチプレイヤー シナリオにおいて、各プレイヤーに表示されるべきダイアログが確実に表示され、ダイアログが見逃されないようにするためにも使用されます。

NPC をターゲットにする

/dialogue コマンドを使用するには、NPC をターゲットにする必要があります。 これはダイアログの表示元となる NPC として動作し、ダイアログのポートレート内にはその NPC の画像が使用されます。

ダイアログのトリガー元にする NPC は世界の中に存在する必要があります。

プレイヤーをターゲットにする

/dialogue コマンドを使用するときに、プレイヤーをターゲットにする必要が生じる場合もあります。 プレイヤーをターゲットにするには、@a (すべてのプレイヤー) や @p (一番近いプレイヤー) などのプレイヤー セレクターを使用します。 通常、これらはシングルプレイヤー体験ではうまく機能しますが、プレイヤーごとのシーン変更を行う場合は @initiator (NPC とやり取りしているプレイヤー) という特別なターゲットの種類を使用する必要があります。

例:

    "buttons": [
        {
            "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
            "commands": [
                "/give @initiator gold_ingot"
            ]
        }
    ]

NPC でこのターゲット セレクターを使用すると、プレイヤーごとにダイアログを更新できます。つまり、マルチプレイヤー環境で NPC が各プレイヤーのダイアログ状態を記憶し、それに応じて個別のダイアログをプレイヤーに送れるようになります。 これは、プレイヤーが NPC ダイアログを変更した結果、他のプレイヤーが完全なダイアログ分岐を見損なうおそれがある場合に便利です。また、各プレイヤーが NPC から確実にアイテムを 1 つのみ受け取るように、同じプレイヤーが複数のアイテムを受け取るために NPC に戻ることを禁じたり、他のプレイヤーがアイテムを集めることができないようにロックアウトする場合にも有用です。

完全な例:

    {
        "format_version": "1.17",
        "minecraft:npc_dialogue": {
            "scenes": [
                {
                    "scene_tag": "ducky_intro",
                    "npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
                    "text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
                    "on_open_commands": ["/clear @p"],
                    "on_close_commands": ["/say Enjoy the gold! "],
                    "buttons": [
                        {
                            "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
                            "commands": [
                                "/give @initiator gold_ingot"
                            ]
                        }
                    ]
                }
            ]
        }
    }

シーンをトリガーするコマンド:

    /dialogue open @e[tag=ducky] @p ducky_intro