NPC 对话框
本页面镜像自 BedrockWiki
根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。
非玩家角色(NPC)是类似村民的实体,可通过对话框显示消息并提供多个交互按钮。最初设计用于冒险地图,随着 /dialogue
命令的引入,现在也能在常规附加包中使用。
对话框文件
NPC 对话数据存储于行为包根目录下 dialogue
文件夹内的 .diag.json
文件中。基础模板示例如下:
{
"format_version": "1.17",
"minecraft:npc_dialogue": {
"scenes": [
{
"scene_tag": "example",
"npc_name": "Steve",
"text": "你好"
}
]
}
}
每个场景包含以下可配置参数:
scene_tag
场景唯一标识符,用于指定具体场景。
npc_name
NPC 显示名称。若省略,则使用 NPC 实体名称(默认为§eNPC
)。
text
显示在对话框中的文本(可选)。
on_open_commands
打开对话框时执行的命令列表(可选)。
"on_open_commands": [
"/say 你好"
]
on_close_commands
关闭对话框时执行的命令列表(可选)。
"on_close_commands": [
"/say 再见"
]
buttons
对话框中显示的按钮配置(可选)。
"buttons": [
{
"name": "按钮一",
"commands": [
"/say 按钮一被点击了!"
]
},
{
"name": "按钮二",
"commands": [
"/say 按钮二被点击了!",
"/say 第二段命令示例"
]
}
]
玩家选择器
在 on_open_commands
、on_close_commands
和各按钮的 commands
中可使用本地选择器 @p
,但会以 NPC 实体为中心选择。特殊选择器 @initiator
可始终指向触发对话框的玩家。
"buttons": [
{
"name": "获得漂浮效果",
"commands": [
"/effect @initiator levitation"
]
}
]
注意:@initiator
专用于 NPC 对话框,不可在其他场景使用。
文本本地化
可通过翻译键实现多语言支持:
"npc_name": {
"rawtext": [
{
"translate": "entity.endermite.name"
}
]
}
需在资源包语言文件中定义对应翻译键,例如 entity.endermite.name
对应中文为"末影螨"。
打开对话框
使用 /dialogue
命令开启对话框:
/dialogue open <npc: 目标> <player: 目标> [场景名称:string]
<npc: 目标>
:需携带minecraft:npc
组件的实体(如原版 NPC)<player: 目标>
:目标玩家[场景名称:string]
:指定scene_tag
(若省略则显示上一个场景)
示例命令:
/dialogue open @e[type=npc,c=1] @p example
切换对话框
使用以下语法变更 NPC 默认对话框:
/dialogue change <npc: 目标> <场景名称:string> [player: 目标]
<场景名称:string>
:指定新场景的scene_tag
[player: 目标]
:指定生效玩家(若省略则影响所有人)
示例命令:
/dialogue change @e[type=npc,c=1] example @r
完整范例
本节演示创建具有传送功能的道具和对话系统(完整源码可参见GitHub)。
创建 NPC 实体
即使隐藏 NPC,也需要通过常加载区域保持存在:
tickingarea add 0 1 0 0 2 0
summon npc "§r" 0 1 0
TIP
可通过玩家实体触发对话框:
- 为玩家添加
minecraft:npc
组件 - 映射行为包对话框场景
- 执行以下命令:
/dialogue open @s @s <scene_tag>
优劣分析
+
无需维护隐藏 NPC+
无需管理常加载区域-
非正常使用可能导致稳定性问题-
其他玩家点击该玩家时会显示对话框
可通过添加交互组件避免问题:
"minecraft:interact": {
"interactions": [
{
"on_interact": {
"filters": {
"all_of": [
{
"test": "is_family",
"subject": "other",
"value": "player"
}
]
}
}
}
]
}
:::
对话文件配置
{
"format_version":"1.17",
"minecraft:npc_dialogue":{
"scenes":[
{
"scene_tag":"main_teleport_menu",
"npc_name":"传送菜单",
"text":"选择传送目的地",
"buttons":[
{
"name":"区域传送",
"commands":[
"/dialogue open @e[type=npc,c=1] @initiator districts_teleport_menu"
]
},
{
"name":"个人基地",
"commands":[
"/tp @initiator -20 4 -20"
]
},
{
"name":"世界出生点",
"commands":[
"/tp @initiator 0 4 0"
]
}
]
},
{
"scene_tag":"districts_teleport_menu",
"npc_name":"区域传送",
"text":"请选择目标区域",
"buttons":[
{
"name":"< 返回",
"commands":[
"/dialogue open @e[type=npc,c=1] @initiator main_teleport_menu"
]
},
{
"name":"商业区",
"commands":[
"/tp @initiator 20 4 20"
]
},
{
"name":"娱乐区",
"commands":[
"/tp @initiator 20 4 -20"
]
}
]
}
]
}
}
创建传送物品
{
"format_version": "1.16.100",
"minecraft:item": {
"description": {
"identifier": "dialog:teleport_menu",
"category": "物品"
},
"components": {
"minecraft:on_use": {
"on_use": {
"event": "open_menu",
"target": "self"
}
},
"minecraft:foil": true,
"minecraft:icon": {
"texture": "ender_pearl"
},
"minecraft:display_name": {
"value": "传送菜单"
}
},
"events": {
"open_menu": {
"run_command": {
"command": [
"dialogue open @e[type=npc,c=1] @s main_teleport_menu"
],
"target": "player"
}
}
}
}
}
测试步骤
- 在超平坦世界启用实验性玩法
- 执行
/function setup
创建 NPC - 获取道具:
/give @s dialog:teleport_menu
- 切换生存模式使用道具
版权声明
本教程改编自 Minecraft 创作者文档。