Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

編輯實體

上一部分中,我們瞭解到場景是一系列組織成樹狀結構的節點,其中只有一個節點是根節點。你可以將專案拆分成任意數量的場景。這一功能可以幫你將遊戲拆解成不同的元件,並進行組織。

你可以建立任意數量的場景並將他們保存成副檔名為 .tscn (“text scene” 文字場景)的檔。上節課的 label.tscn 檔就是一個例子。我們把這些檔叫作“打包的場景”(Packed Scene),因為它們將場景的內容資訊進行了打包。

這有一個小球的例子。它由以下內容組成:一個叫“Ball”的 RigidBody2D 節點是根節點,可以讓小球下落、在撞牆後反彈;一個 Sprite2D 節點以及一個 CollisionShape2D

../../_images/instancing_ball_scene.png

保存場景過後,這個場景就可以作為藍圖使用:你可以在其他場景中進行任意數量的翻制。將物件根據範本進行翻制的這一過程就叫作 產生實體

../../_images/instancing_ball_instances_example.png

我們在上一部分提到過,產生實體場景的行為與節點類似:編輯器預設會隱藏其中的內容。產生實體 Ball 之後,你只會看到 Ball 節點。請注意製作出的副本,名字是唯一的。

Ball 場景的實例最開始都和 ball.tscn 有相同的結構和屬性。不過你也可以單獨修改各個實例,比如修改反彈的方式、重量等源場景所暴露的屬性。

最佳實踐

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

Extract the archive on your computer. To import it, you need the Project Manager. The Project Manager is accessed by opening Godot, or if you already have Godot opened, click on Project -> Quit to Project List (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q on macOS)

在專案管理員裡點擊 [匯入] 按鈕來匯入該專案。

../../_images/instancing_import_button.png

在彈出框中點擊瀏覽按鈕,定位到剛才解壓的資料夾。

../../_images/instancing_import_browse.png

按兩下打開 project.godot 檔案。

../../_images/instancing_import_project_file.png

最後,點擊匯入 & 編輯按鈕。

../../_images/instancing_import_and_edit_button.png

The project contains two packed scenes: main.tscn, containing walls against which the ball collides, and ball.tscn. The Main scene should open automatically. If you're seeing an empty 3D scene instead of the main scene, click the 2D button at the top of the screen.

../../_images/instancing_2d_scene_select.webp ../../_images/instancing_main_scene.png

讓我們為 Main 節點新增一個小球作為子節點。在“場景”面板中,選擇 Main 節點。然後點擊場景面板頂部的連結圖示。這個按鈕的作用是為目前選中節點新增另一個場景的實例作為子節點。

../../_images/instancing_scene_link_button.png

按兩下小球場景來產生實體。

../../_images/instancing_instance_child_window.png

Logo 會顯示在螢幕的最上方。

../../_images/instancing_ball_instanced.png

點擊「新增合集」然後拖移並選擇整個圖塊表。

../../_images/instancing_ball_moved.png

Ctrl + F (或 macOS 上 Cmd + F) 可以搜尋列表。

Now, we want to create more instances of the Ball node. With the ball still selected, press Ctrl + D (Cmd + D on macOS) to call the duplicate command. Click and drag to move the new ball to a different location.

../../_images/instancing_ball_duplicated.png

你可以重複這個過程,直到你已經放幾個在場景上。

../../_images/instancing_main_scene_with_balls.png

再次運作遊戲。現在你應該看到每個小球都各自下落。這就是實例的作用。每一個都是範本場景的獨立副本。

編輯實體

實例還有很多用法。使用這個功能,你可以:

  1. 使用“屬性面板”修改一個小球的屬性,不影響其他實例。

  2. 打開 ball.tscn 場景修改 Ball 節點,從而修改所有 Ball 的預設屬性。在保存時,專案中所有 Ball 的實例都會更新其屬性值。

備註

修改實例上的屬性總是會覆蓋對應打包場景中的值。

讓我們來試一試。打開 ball.tscn 然後選中 Ball 節點。在右側的“屬性面板”中,點擊展開 PhysicsMaterial 屬性。

../../_images/instancing_physics_material_expand.webp

將其 Bounce(彈力)屬性設為 0.5 ,只要點擊對應的數字欄位、輸入 0.5 、然後按 Enter 就可以了。

../../_images/instancing_property_bounce_updated.webp

F5 運作遊戲,請注意所有的小球都更有彈性了。因為 Ball 場景是所有實例的範本,對它進行修改並保存,就會導致所有實例同時進行更新。

現在讓我們來調整單個實例。點擊視口上方的對應分頁回到 Main 場景。

../../_images/instancing_scene_tabs.png

選擇一個 Ball 實例節點,然後“屬性面板”中將 Gravity Scale(重力縮放)設為 10

../../_images/instancing_property_gravity_scale.png

在被調整過的屬性旁邊就會多一個灰色的“復原”按鈕。

../../_images/instancing_property_revert_icon.png

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

重新運作遊戲,請注意這個小球會比其他小球落得快得多。

備註

如果你修改了一個實例中的 PhysicsMaterial ,那麼就會影響到其他所有實例。這是因為 PhysicsMaterial 是一個資源,而資源是跨實例共用的。要讓某個實例的資源唯一,請在“屬性面板”中對其右鍵,然後選擇彈出功能表中的“唯一化”。

資源也是 Godot 遊戲的關鍵元件,我們會在後續課程中介紹。

作為設計語言的場景實例

Godot中的實例和場景提供了一種優秀的設計語言,使該引擎與其他引擎不同。我們從一開始就圍繞這個概念設計Godot。

我們建議在使用 Godot 製作遊戲時忽略架構程式碼模式,例如模型-視圖-控制器 (MVC) 或實體關係圖。相反,你可以從想像玩家將在遊戲中看到的元素開始,並圍繞它們建構程式碼。

例如,可以這樣想像簡單的射擊遊戲:

../../_images/instancing_diagram_shooter.png

幾乎任何一種遊戲都可以用這種方式畫成圖片。先寫下遊戲裡可以被看到的部分,然後在每個部分用箭頭來表示這些元素的從屬關係。

畫出這樣的圖之後,我們建議你為圖上的各個元素都建立一個場景來使用,再通過實體化來做出從屬關係 (可以用程式碼或是直接在編輯器裡實體化)。

開發遊戲 (或是一般軟體) 時,我們總會花費許多時間來設計架構,然後再花時間把遊戲的元素都套用到這個架構上。以場景為基礎來設計就取代了這個過程,讓開發變得更快速而且更直觀,也讓你能直接專注於實作遊戲本身的邏輯。由於大多數的遊戲元件都可以直接對應到場景上,使用使用以場景實體化為基礎的設計也就能在架構上花費較少的程式碼。

再來看看另一個某方面來說更複雜的例子。這個例子是開放世界型別的遊戲,有很多素材以及巢狀的元素:

../../_images/instancing_diagram_open_world.png

想像一下,我們從建立房間開始。我們可以製作幾個不同的房間場景,在其中有獨特的傢俱安排。後來,我們可以製作一個房屋場景,在內部使用多個房間實例。我們將用許多產生實體的房子和一個大的地形來建立一個城堡,我們將把城堡放在這個地形上。每一個場景都將是一個或多個子場景的實例。

接下來我們可以建立一些代表守衛 (以及其他 NPC) 的場景,然後也把這些場景都加進城堡裡。這樣一來,這些 NPC 就間接地進到了整個遊戲世界裡了。

在 Godot 裡,很容易就可以通過這種方式來迭代出遊戲,需要做的就只是建立場景、實體化場景然後建立更多場景再實體化更多場景。而且,不管是對於程式設計師或非程式設計師來說,Godot 的編輯器 UI 很友善。一般標準的團隊開發流程還會有 2D 與 3D 設計師、關卡設計師、遊戲設計師以及動畫家的參與,大家都會使用 Godot 編輯器界面來進行作業。

總結

Instancing, the process of producing an object from a blueprint, has many handy uses. With scenes, it gives you:

  • 能讓你的遊戲拆分成可充分利用的元件。

  • 一個建構和封裝複雜系統的工具。

  • 一種以自然方式思考遊戲專案結構的語言。