Up to date

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

Godot 的設計理念

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

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

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

如果你想瞭解的是引擎功能的概覽,請觀看 Godot explained in 5 minutes (英語)。

物件導向的設計與組合

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

我們的目標就是要提供一個製作遊戲的完整套裝軟體,同時還擁有一致的使用者經驗(User Experience,或譯作使用者體驗)。你也可以同時使用外部程式來配合,只要這個外部程式有匯入工具可以將成品匯入至 Godot。如果沒有的話你甚至也可以自己做一個,如 Tiled Map Importer 就是個例子。

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

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

Note that with GDExtension, you can write high-performance code using compiled languages like C, C++, Rust, D, Haxe, or Swift without recompiling the engine.

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

image4

Godot 2 中的狀態機 (State Machine) 編輯器外掛,作者為 kubecz3k。這個外掛提供視覺化的狀態管理與轉換界面。

開放原始碼

Godot 所有的程式碼皆使用 MIT 授權 開放原始碼。這表示 Godot 所包含的所有技術都能自由使用。而且大部分的程式都是由許多貢獻者從頭開始開發的。

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

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

備註

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

社群驅動

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

話雖如此,雖然 Godot 只有少數全職的核心開發者,但本文撰寫時本專案有超過 600 位貢獻者。這些佛心的工程師都是在處理各自的需求,所以 Godot 每次主要更新都包含了各方面的改進。

Godot 編輯器就是一個 Godot 遊戲

Godot 編輯器是在遊戲引擎上執行的,編輯器使用了 Godot 引擎自己的 UI 系統,能夠在測試專案時熱重載程式碼與場景,或是在編輯器中執行遊戲程式碼。這表示同一個程式碼可以用在場景,也可以製作成外掛並擴充編輯器功能

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

image5

RPG in a Box是一個使用 Godot 2 開發的 Voxel RPG 編輯器。他使用 Godot 的 UI 工具來製作他的基於節點的程式系統以及其他界面。

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

備註

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

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

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