實體化

簡介

對於小型的專案來說,建立單一場景然後把各個節點都加到同一個場景下可能沒關係。但當專案的大小與複雜度都成長後,節點的數量很快就會變得難以管理。為了解決這個問題,Godot 中可以將專案拆分成任意數量的場景,進而將遊戲整理成各個不同的模組。

我們已經在 場景與節點 裡學過,場景就是由依據樹狀組織的節點所構成的,而其中會有一個節點作為樹的根節點。

../../_images/tree.png

可以建立任意數量的場景並保存在硬碟上。場景會用一種叫做「打包場景 (Packed Scenes)」的形式保存,副檔名為 .tscn

../../_images/instancingpre.png

場景儲存後就能像其他節點一樣實體化到另一個場景內。

../../_images/instancing.png

在上面的圖片中,場景 B 被新增到場景 A 中作為實體。

實體化的例子

讓我們先下載一個範例專案來瞭解實體化是怎麼運作的: instancing.zip

解壓縮到任意處,然後打開 Godot 並在專案管理員裡點擊 [匯入] 按鈕來新增該專案:

../../_images/instancing_import.png

可以在解壓縮後的資料夾裡找到一個「project.godot」檔案,打開這個檔案。之後專案列表就會顯示出新的專案。按 [編輯] 來編輯專案。

這個專案包含了兩個場景:「Ball.tscn」與「Main.tscn」。Ball 場景使用了 RigidBody2D 來做物理行為。而主場景則有一組用來讓球碰撞的障礙物 (使用了 StaticBody2D )。

../../_images/instancing_ballscene.png ../../_images/instancing_mainscene.png

打開 Main 場景,然後選擇根節點:

../../_images/instancing_mainroot.png

我們想要把 Ball 的實體新增到 Main 場景作為子節點。點擊「鎖鏈」形狀的按鈕 (滑鼠移上去會顯示「實體化場景檔案作為節點。」)。然後選擇 Ball.tscn 檔案。

../../_images/instancing_linkbutton.png

球會被放到螢幕區域的左上角 (也就是螢幕座標的 (0, 0))。點擊並把那顆球拖到靠近場景中間上方的地方:

../../_images/instancing_placeball.png

按下 [執行] 按鈕,就可以看到球落到畫面的底部:

../../_images/instancing_playbutton.png

多個實體

我們可以往場景裡新增任意多個的實體,可以用剛才的 [實體] 按鈕,或是點擊已經有的球的實體然後按 Ctrl + D (或 macOS 上 Cmd+D) 來拷貝:

../../_images/instancing_multiball.png

再執行一次場景,然後看看所有球掉下來的樣子。

../../_images/instancing_multiball.gif

編輯實體

打開 Ball 場景,點擊 PhysicsMaterial 來展開,然後將 Bounce 屬性設為 1

../../_images/instancing_physicsmat2.png

按 [執行],然後就能注意到所有球的實體都變得更有彈性了。這是因為實體化的球是由剛才保存的場景所產生,所以我們對那個場景的改動都會反映到實體上。

也可以調整個別的實體。我們先把反彈值跳回 0 ,然後回到 Main 場景選擇其中一個球的實體。由於一些如 PhysicsMaterial 的資源在各個實體之間是共用的,所以我們要讓這個實體變成獨立的。點擊屬性面板右上角的工具按鈕,然後選擇 [獨立化子資源]。再來把 Bounce 改成 1 然後按 [執行]。

../../_images/instancing_property.png

可以注意到在已經調整的屬性旁邊會出現一個灰色的 [還原] 按鈕。如果出現了這個按鈕就代表修改了實體化的場景,而且這個節點的數值覆蓋了原始場景的值。就算再次修改原本的場景,這裡自定的數值還是會保留。點擊 [還原] 按鈕就能把屬性還原成原始場景的值。

結論

如果要複製很多個物件的話,實體化應該很有用。也可以通過 GDScript 來用程式建立實體,詳細請參考 實體化 (續)