載入為佔位符的功能設計上是用來輔助選擇性載入場景的。比如一個很龐大的3D世界,玩家一時之間只會處在世界一小部分割槽域內,同時讓整個地圖駐留於記憶體是不現實的,此時需要選擇性地靈活載入地圖,使用Godot的"載入為佔位符"功能可輔助這項工作的進行。
本人以開發2D遊戲為主,發現此功能也可為我提供便利。
基本使用
-
將節點儲存為場景。
把希望動態載入的每個節點拖入"檔案系統"對話方塊中,這將使場景被儲存起來成為資源。
-
載入為佔位符。
右鍵場景中剛剛操作的節點,勾選"載入為佔位符"
-
編寫指令碼,在希望的時機例項化它
就像獲取一般節點一樣獲取到此節點,然後呼叫其CreateInstance()
函式。C#需要將其轉化為InstancePlaceholder
才可呼叫該函式。
//C# code
var node = GetNode("../TheNode");
var placeholderNode = node as InstancePlaceholder;
var target = placeholderNode.CreateInstance();
(啟動遊戲後,物體沒有被立即載入)
(↓點選"載入"按鈕後,物體被載入了)
效果與特點
在程式碼中像上文那樣呼叫函式後,看上去物體已經被例項化了。
如何取得例項化出來的節點?
CreateInstance()
會返回例項化出來的節點。
反覆例項化會怎樣?
目標物體會被多次建立。
例項化後的物體替換了原有節點嗎?
並沒有。例項化後的節點是新的節點,例項化與作為佔位符節點的節點是兄弟關係,
並且Godot會為節點取新的名字。
如果多次例項化,取的名字中帶有的序號會遞增。
如果你時不時會移除、重新例項化此場景,這似乎是一個合適的設計。
值得注意的bug
節點儲存為場景資源後,不要修改該資源的名稱。
若進行了修改,原場景將無法找到該資源,並且設定為佔用符的節點無法例項化,更糟的是你正在編輯的場景可能因為無法找到此依賴而無法儲存,
按理來說Godot內部應該會維護資源名稱的變更,但是這次它沒有(我使用的版本v4.0.2.stable.mono.official [7a0977ce2],該問題存在。)
跟蹤這個Issue以獲得Bug修復進展
https://github.com/godotengine/godot/issues/37818
如果遇到了此問題,嘗試改回原場景名,或用文字編輯器編輯場景檔案(.tscn)使依賴恢復正常。
參考
https://docs.godotengine.org/en/stable/classes/class_instanceplaceholder.html