手冊:編輯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 ,把它變成空白,似乎沒有任何改變,但是這回不會報錯,這又是為什麼?因為部分硬編碼變裝成了 $ 全域變數的形式,實際上它們被加上了序列,這保證了每個下拉選單選項的控件名唯一性。