Godot 4.0 載入為佔位符(InstancePlaceholder)的用法和特點

期miu發表於2023-05-09

載入為佔位符的功能設計上是用來輔助選擇性載入場景的。比如一個很龐大的3D世界,玩家一時之間只會處在世界一小部分割槽域內,同時讓整個地圖駐留於記憶體是不現實的,此時需要選擇性地靈活載入地圖,使用Godot的"載入為佔位符"功能可輔助這項工作的進行。
本人以開發2D遊戲為主,發現此功能也可為我提供便利。

基本使用

  1. 將節點儲存為場景。
    把希望動態載入的每個節點拖入"檔案系統"對話方塊中,這將使場景被儲存起來成為資源。
    image


  2. 載入為佔位符。
    右鍵場景中剛剛操作的節點,勾選"載入為佔位符"
    image


  3. 編寫指令碼,在希望的時機例項化它
    就像獲取一般節點一樣獲取到此節點,然後呼叫其CreateInstance()函式。C#需要將其轉化為InstancePlaceholder才可呼叫該函式。

//C# code
var node = GetNode("../TheNode");
var placeholderNode = node as InstancePlaceholder;
var target = placeholderNode.CreateInstance();

(啟動遊戲後,物體沒有被立即載入)
image


(↓點選"載入"按鈕後,物體被載入了)
image



效果與特點

在程式碼中像上文那樣呼叫函式後,看上去物體已經被例項化了。

如何取得例項化出來的節點?

CreateInstance()會返回例項化出來的節點。

反覆例項化會怎樣?

目標物體會被多次建立。

image

例項化後的物體替換了原有節點嗎?

並沒有。例項化後的節點是新的節點,例項化與作為佔位符節點的節點是兄弟關係,

並且Godot會為節點取新的名字。

如果多次例項化,取的名字中帶有的序號會遞增。
image


如果你時不時會移除、重新例項化此場景,這似乎是一個合適的設計。

值得注意的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

相關文章