手册:编辑JSON-UI/Lesson 1

来自Minecraft基岩版开发Wiki

经过前面的练习,我们已经能够熟练使用搜索技能找到一个可交互控件在命名空间下的节点路径了,那么,接下来让我们来试试通过枚举关键词来修改某个特定对话框窗体。

首先,尽管涉及到对话框(不含表单)的控件都写在了命名空间为popup_dialog内名为“popup_dialog.json”的文件里,但在该文件检索根节点的特征词(@common\..{0,50}_screen)无结果,通过对被引用节点的向上追溯来到“ui_common.json”,它与界面根控件组root_screen_panel并列,且位于popup_dialog_factory控件的属性包里。

在这里有两种选择,回到“popup_dialog.json”文件对这个属性包里的控件做修改,或把整个screen组件挪到我们想要修改的界面中去,替换界面的特征词。这里以世界编辑界面为例。

世界编辑界面隶属于命名空间为settings_screen的文件,它是一个独立的界面,对它做的全部修改不会影响到其他该命名空间下的界面。不过在这里不存在“$screen_content”这个控制节点内容的变量,此时如果你忽视这个问题直接运行了一次 Minecraft 实例,该界面不会有任何变化,因为 Mojang 的自动错误修正机制阻止了你对该界面修改后文件的加载。

“$screen_content”变量的缺失,相当于你在一个普通的控件中写上了<control_name>[@],引用对象直接缺失,这当然会出问题。好吧,如果你觉得这个问题已经够棘手了,但事实是,这不是唯一的问题。我是说,如果你使用了开发版本并且开启了断言失败提示框的话,你会发现还有一个翻译过来意思是$dropdown_area引用了一个不存在的控件的断言报错信息(请注意,这是当你把前一个问题解决了之后会出现的问题,意思是如果你没有解决前一个问题,你可能没有机会看到这条报错)

也许你到了这一步就该知难而退了。是的,想要解决这个问题会很麻烦。这里会提及第二个问题出现的原因及解决策略,这与往后的内容相关联。

在settings_common.json 中搜索 $dropdown_area ,会发现它是一个下拉框的变量。再去随便一个与设置项相关的命名空间内,去找下拉框组件,比如 perspective_dropdown吧,准确的说是 video_section节点下的一个子节点,它有一个名为$dropdown_content的全局变量,这是下拉框被开启后显示的可交互开关,在这里就是“第一人称视角”、“第三人称正面”和“第三人称背面”。这个其实不重要,我们会注意到这些开关组件都没有<control_name>,它们却不会报错,这正是因为前面提到的那个不存在的引用对象的问题。是的,那个 $dropdown_area ,指的就是下拉框里的内容。要解决这个问题,比较简单粗暴的方法是去全部下拉框的祖师爷,位于 ui_common.json 文件里的 dropdown那里,把全部的这个变量都给删掉。具体的做法是,写一个带节点路径的控件 “dropdown/$dropdown_name”,赋予唯一一个变量dropdown_area值为空字符串""。这里原本是 $dropdown_area ,把它变成空白,似乎没有任何改变,但是这回不会报错,这又是为什么?因为部分硬编码变装成了 $ 全局变量的形式,实际上它们被加上了序列,这保证了每个下拉菜单选项的控件名唯一性。