NPC 对话命令

分支对话 (Branching Dialogue) 允许您创建动态 NPC 对话脚本,该脚本可以根据玩家在游戏中的动作或响应提供更新的对话。 分支对话系统由三部分组成:NPC 实体、对话命令和资源场景文件。

要求

在开始本教程之前,建议完成以下内容。

场景文件

场景文件是一个 json 文件,位于您的行为包根目录下的 dialogue 文件夹内 (%localappdata%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\<your behavior pack folder>),其中包含分支对话所需的所有信息。 您可以根据需要创建任意数量的场景文件。 您可以为您的世界中的每个 NPC 创建一个场景文件,或者为叙事的每一章创建一个场景文件,也可以简单地为世界创建一个场景文件 - 如何选择完全取决于您,因为分支对话功能将读取 dialogue 文件夹中的所有文件,无论您如何组织这些文件。

属性

第一个属性是 header,将该 json 文件定义为一个有效的场景文件。

示例:

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

由于这是一个 json 文件,我们需要包含括号。 我们要添加的下一个属性是“scenes”属性,这是放置所有分支对话的位置。

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

设置好 header 和场景文件属性后,我们现在可以为 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 按钮上的文本。 第二个属性 - “commands” - 用于添加在按下按钮时将在游戏中运行的命令。 可选属性;对于 NPC 按钮是必需的。

原始文本

上面列出的所有场景属性都支持原始文本。

    {
        "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 能够打开或读取场景文件。 该命令有两种不同的模式,每种模式都有自己独特的用途和语法。

Dialogue Open

Dialogue Open 用于强制向目标玩家打开 NPC 对话框。 此功能以前被称为 Remote Fire,因为它模拟了点击 NPC 的体验。 此命令可用于任何 NPC,并且不需要行为包,除非您希望 NPC 使用场景文件用于对话(这在使用 dialogue open 时不是必需的)。

Dialogue Open 的语法如下:

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

/dialogue/dialogue:初始命令。

openopen: 命令变体。

<npc: target><npc: target>:作为目标的 NPC。

<player: target><player: target>:作为目标的玩家。 这是将看到 NPC 对话框的玩家。

[sceneName:string][sceneName:string]:如果要使用场景文件中包含的对话,则使用此名称。 该字符串必须是有效的场景标签名称,否则失败。 这是一个可选参数。

备注

如果未指定 sceneName,则将显示 NPC 的最后对话。

实际使用

Dialogue Open 主要以两种方式使用。

第一种是在玩家不直接与 NPC 交互的情况下启动 NPC 对话框,本质上将 NPC 用作不需要玩家单击 NPC 的“弹出”窗口。 在这个场景中的 NPC 甚至不必对世界中的玩家可见(尽管它们必须在一个加载的区块中并且位于接收对话的玩家的节拍距离内)并且可以藏在地下或其他一些无法访问的位置。

Dialogue Open 的第二种使用方式是使用场景文件创建分支对话树。 通过在 NPC 场景文件中使用 Dialogue Open 命令,NPC 可以使用 On Close 命令或 Button 命令自动为玩家打开下一个对话框。 这是所有对话树分支路径的基础。

Dialogue Change

Dialogue Change 用于指示 NPC 使用专门指定的场景文件中提供的对话。 此命令需要使用包含 dialogue 文件夹和场景文件的行为包才能正常运行。 该命令将指示目标 NPC 从场景标签名称指定的位置拉取其对话。 该命令应该在玩家开始与 NPC 联系之前运行。

Dialogue Change 的语法如下:

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

/dialogue/dialogue:初始命令。

changechange:命令变体。

<npc: target><npc: target>:作为目标的 NPC。

<sceneName:string>[sceneName:string]:如果要使用场景文件中包含的对话,则使用此名称。 该字符串必须是有效的场景标签名称,否则失败。

[player: target][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 收到一件物品,而不允许同一玩家返回 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