Godot 的設計理念

現在你已經逐漸上手了,讓我們來瞭解一下 Godot 的設計。

所有的遊戲引擎都是不同的,而且適用於不同的需求。 不同遊戲引擎不僅提供了不同的功能,他們各自的設計也有所不同。這就造成了工作流程的不同與不同的遊戲架構組織方式。而這都要歸咎於他們各自的設計理念。

這個頁面會幫助你瞭解 Godot 的運作原理,會先一些核心概念開始。這裡不是要介紹 Godot 包含的功能,也不是要比較各個引擎。如果要知道哪一種引擎適合你的專案,需要自己嘗試並瞭解各個引擎的設計與其限制。

如果您想快速了解 Godot 引擎的功能概覽,請觀看 7 分鐘搞懂 Godot 這個影片。

物件導向的設計與組合

Godot 通過靈活的場景系統與節點結構,在核心設計上就貫徹了物件導向設計。Godot 避免強制規定程式設計模式來讓你用更直觀的方式組織遊戲。

首先,Godot 讓你可以 組合或聚合 場景。這樣的做法就像巢狀架構的 Prefab 一樣:可以建立一個「BlinkingLight」(閃燈)場景與一個使用 BlingkingLight 的「BrokenLantern」(壞掉的路燈)場景。接著,製作一個使用 BrokenLantern 填滿的城市。一旦修改了 BlinkingLight 的色彩,城市裡所有的 BrokenLantern 都會馬上跟著一起變。

重點是,場景可以 繼承

Godot 的場景可以是一個武器、或是一個角色、是一件物品、一扇門、一道關卡、或是一道關卡的一部分……等任何你能想像的東西。在程式碼中場景就以物件的形式存在,但你也可以使用編輯器來設計場景,也可以只用程式碼來設計出場景,或是同時用編輯器與程式碼來設計場景。

但 Godot 的場景與其他各種 3D 引擎的 Prefab 不同,因為在 Godot 中,可以對場景繼承來進行擴充。你可以建立一個繼承自 Character (角色)場景的 Magician(魔術師)場景,並在編輯器中修改 Character,接著 Magician 便會隨之更新。這樣的設計可以幫助你在建立專案時,這些架構都能符合遊戲的設計。

image0

另外,Godot 也提供成各種不同型別的物件,稱為節點。不同的節點都有不同的功能。節點是樹狀結構下的一員,且繼承自其母節點,而繼承樹的最上層則為 Node 類別。雖然 Godot 引擎也提供了如碰撞區域這類的組件,但這類組件屬於特例。

換句話說,Godot的節點並不像其他一些遊戲引擎中的元件那樣工作。

image1

Sprite 繼承自 Node2D、CanvasItem、與 Node 型別。Sprite 有這些母類別上所有的屬性與功能如變換、繪製自定形狀、使用自定著色器算繪等。

一條龍服務的套裝軟體

Godot 竭力自主提供一般情況下會用到的工具。我們有專用的腳本工作區、有動畫編輯器、有圖塊編輯器、有著色器編輯器、有除錯工具、有分析工具、還有可以在本機與遠端裝置上熱重載 (Hot-Reload) 的功能…等。

image2

我們的目標是提供完整的一體化遊戲製作方案與一致的使用者體驗。只要 Godot 有相應的匯入外掛,你仍可與外部工具搭配使用。

這也是 Godot 除了 C# 以外,有自己的程式語言 GDScript 與視覺腳本 (VisualScript) 一部分的原因。這些語言是源自遊戲開發者與設計師的需求所設計的,而且也與引擎及編輯器高度整合。

GDScript 讓你可以使用類似 Python 的格式來撰寫簡單的程式碼,但同時也會偵測型別,並提供媲美靜態語言品質的自動補全功能。而且 GDScript 還提供了如 Vector 與 Color 這樣的內建型別來最佳化遊戲執行。

使用 GDExtension 的話,你也可以使用高效的語言如 C、C++、Rust 等這類的編譯語言而無須重新編譯整個引擎。

請注意,3D 工作區沒有提供如 2D 工作區這麼多的工具。你會需要使用外部程式或擴充套件來編輯地形、複雜的動態角色等。Godot 提供了能用遊戲程式碼來擴充編輯器功能的完整 API。詳細請參考下方的 Godot 編輯器就是一個 Godot 遊戲

開放原始碼

Godot 以 MIT 授權 完整開放其原始碼。這代表任何人都可自由下載、使用、修改與分享,只要保留授權檔即可。

Godot 隨附的所有技術(包含第三方程式庫)都必須在法律上與此開源授權相容。因此,Godot 的多數元件皆由社群貢獻者自底層自行開發。

任何人都可以根據各自的需求來在自己的專案內插入專屬軟體,這些工具只是不會跟著引擎一起提供給你而已。例如 Google AdMob、或 FMOD。這些專屬軟體工具都作為第三方外掛來提供。

另一方面,開放原始碼代表你可以根據你的需求 一邊擴充引擎一邊學習 。而你也可以更輕鬆地來除錯遊戲,因為 Godot 在印出錯誤提示時,就算錯誤是來自引擎內部也會包含在堆疊回溯中 。

備註

開放原始碼不管在各種方面都 不會影響到你使用 Godot 製作的作品 :Godot 引擎與所有你通過 Godot 製作的東西都不會帶有附加條件。

社群驅動

Godot 是由社群製作,也是為社群以及世界上所有遊戲創作者所製作的。 重大的更新都是由使用者的需求與開放的討論而來的。核心開發者製作的新功能通常是優先是為了大多數使用者的利益來考慮。

話雖如此,雖然有少數核心開發者全職投入,但在撰寫本文時,這個專案已有數千名貢獻者。熱心的程式設計師會開發他們自己可能需要的功能,因此您會在每個主要版本中看到引擎各個方面的同步改進。

Godot 編輯器就是一個 Godot 遊戲

Godot 編輯器運行於遊戲引擎之上。它使用引擎自有的 UI 系統,當你測試專案時可以即時重新載入程式碼與場景,或在編輯器內直接執行遊戲程式碼。這代表你可以 在遊戲中使用相同的程式碼 與場景,或是 建立外掛並擴充編輯器。

這帶來了非常穩定且靈活的UI系統,並且編輯器本身就是由它自身驅動的。使用 @tool 關鍵字,就能在編輯器中執行任何遊戲程式碼。

../../_images/introduction_rpg_in_a_box.webp

RPG in a Box 是以 Godot 製作的體素 RPG 編輯器。它使用 Godot 的 UI 工具來打造其基於節點的程式設計系統與其餘介面。

@tool 關鍵字放在任何 GDScript 檔案的最上方就可以在編輯器中使用。這就讓你可以匯入與匯出外掛、可以建立如自定關卡的編輯器、或是可以使用與專案相同的節點與 API 來建立腳本。

備註

編輯器完全使用 C++ 編寫並且靜態地編譯為二進位檔案。這意味著你不能像匯入一個擁有 project.godot 檔的普通專案一樣匯入它。

互相獨立的 2D 與 3D 引擎

Godot 提供了互相獨立的 2D 與 3D 算繪引擎。所以 2D 場景的基本單位是像素 。雖然引擎是分開的,但你可以在 3D 中使用 2D、在 2D 中使用 3D 、或是在 3D 世界中使用 2D Sprite 或界面。