Godot 的設計理念

Now that you've gotten your feet wet, let's talk about Godot's design.

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

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

Please watch Godot explained in 5 minutes if you're looking for an overview of the engine's features.

物件導向的設計與組合

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

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

重點是,場景可以 繼承

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

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

image0

Also note that Godot offers many different types of objects called nodes, each with a specific purpose. Nodes are part of a tree and always inherit from their parents up to the Node class. Although the engine does feature some nodes like collision shapes that a parent physics body will use, most nodes work independently from one another.

In other words, Godot's nodes do not work like components in some other game engines.

image1

Sprite is a Node2D, a CanvasItem and a Node. It has all the properties and features of its three parent classes, like transforms or the ability to draw custom shapes and render with a custom shader.

一條龍服務的套裝軟體

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

image2

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

That is also partly why Godot offers its own programming languages GDScript and VisualScript, along with C#. They're designed for the needs of game developers and game designers, and they're tightly integrated in the engine and the editor.

GDScript lets you write code using an indentation-based syntax, yet it detects types and offers a static language's quality of auto-completion. It is also optimized for gameplay code with built-in types like Vectors and Colors.

值得注意的是,使用 GDNative 的話,你也可以使用如 C、C++、Rust、與(使用 Cython 編譯器的)Python 這類的編譯語言而毋須重新編譯整個引擎。

image3

> VisualScript 是基於節點的程式語言,且與 Godot 編輯器整合地很好。你可以將節點或資源拖曳到圖形上來建立新的程式碼區塊。

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

image4

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

警告

Godot 4.0 will remove VisualScript from core entirely. As a result, creating new projects using visual scripting in Godot is not recommended. Future Godot 4.x releases may have VisualScript reimplemented as an extension.

While Godot 3.x will keep VisualScript supported, we recommend trying out GDScript instead, especially if you intend to migrate your project to Godot 4.

開放原始碼

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 來建立腳本。

備註

The editor is fully written in C++ and is statically compiled into the binary. This means you can't import it as a typical project that would have a project.godot file.

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

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