跳轉到內容

Godot 遊戲引擎/程式設計指南

75% developed
來自 Wikibooks,開放世界中的開放書籍

三種語言

[編輯 | 編輯原始碼]

Godot 有三種主要的程式設計(或指令碼)語言,如果你擁有編譯了 Mono 的 Godot 版本,還有一種額外的第四種語言。 然而,你可以獲得非官方語言,甚至可以建立自己的語言!

GDScript(“.gd” 副檔名)是 Godot 的主要語言。 它是一種自定義語言,與 Godot 的“場景”系統協同工作。 它也非常容易使用。 Godot 的開發者表示,你可以在不到一個小時的時間裡學會 GDScript。

示例“Hello world!” 程式

func _ready() -> void:
    # This is a comment. It isn't shown in the game.
    print("Hello world!")

我建議你從一開始就使用 GDScript,因為它是最容易使用的,並且還支援自動完成功能,這非常有用。 本書將使用 GDScript 作為主要的程式語言。

有趣的事實:Godot 的開發者在決定建立更適合 Godot 的自定義指令碼語言之前,曾嘗試過 Python 和 Swift。 因此,這種語言與這兩種語言非常相似。

有關更多資訊,請參閱 GDScript 章節.

VisualScript

[編輯 | 編輯原始碼]

VisualScript(“.vs” 副檔名)是 Godot 的視覺化語言,它使用使用者友好的介面來建立程式碼。 它缺乏 GDScript 中的許多功能,但可以用於建立例如對話樹。

然而,這種語言在 Godot 4.x 中已被棄用[1],因為只有 0.5% 的使用者實際使用過這種語言。 它仍然可以在 Godot 3.x 中使用,並且可能會在將來作為擴充套件新增到 Godot 4 中。


GDExtension (Godot 4.x 之前的 NativeScript)

[編輯 | 編輯原始碼]

GDExtension 允許你在不重新編譯引擎的情況下執行 c 和 c++ 程式碼。 這使你能夠為計算量很大的任務建立超高速程式碼。

Godot 4.1+ 中的 GDExtension 向前相容,這意味著為 4.2 製作的 GDExtensions 可以在 4.3 中執行,反之則不行。 但是,這不是保證,因為在將來為了修復 bug 並新增關鍵功能,相容性可能會被破壞。

與引擎模組不同,GDExtension 不需要編譯引擎的原始碼。 它使你能夠訪問大多數可用於 GDScript 和 C# 的 API,讓你能夠使用完全控制的效能編寫遊戲邏輯。 如果你需要快速程式碼並且希望將其作為附加元件分發到資產庫,它非常理想。

GDExtension 也可以使用其他語言,你並不侷限於 c 和 c++。 如果你想使用其他語言,你需要安裝社群製作的繫結。 它們可以在 官方文件頁面 中找到。

如果你擁有 Godot 的 mono 版本,你就可以編寫 C# 程式碼。 你可以使用它為你的遊戲建立高速程式碼以製作模組或物件。 它也可以用於編寫工具。

資訊

注意:Godot 本身是用 C++ 編寫的,直接進行修改需要你重新編譯 Godot 的編輯器。 許多 Godot 使用者使用這種方法建立了具有自定義工具的自定義 Godot 編輯器。

我如何使用這些?

[編輯 | 編輯原始碼]

GDScript、VisualScript 和 GDExtension(或 NativeScript)都可以附加到一個節點,或用於建立一個自定義節點。 在 Godot 的 mono 版本中,C# 也可以被附加。 C++ 只能用於 Godot 的現有引擎中。 為此,你需要下載一個沒有被編譯成應用程式檔案的特殊版本的 Godot。

要將指令碼附加到一個節點,你首先需要一個節點來附加它! 假設你閱讀了上一章(“什麼是節點”),你可以從上次開始的專案開始。

開啟 Godot,並透過雙擊螢幕中央選單中的專案來開啟你的測試專案。 如果 “Test UI.tscn” 還沒有開啟,請從檔案系統塢站中開啟它。 選擇你的 Test UI Control 節點。 在場景塢站的頂部有一個看起來像紙張,兩側邊緣捲起來的按鈕。 按下它。

單擊“模板”按鈕,並從出現的下拉選單中選擇“空”。 按下建立。 現在應該出現一個新螢幕,螢幕中央有一個文字編輯區域,Test UI 節點應該有一個紙張圖示。 任何時候你想重新開啟此處的指令碼,都可以點選它。 現在指令碼看起來很無聊

extends Control

然而,這非常重要! extends 關鍵字(非常重要的程式碼片段,如 pass)告訴 Godot 你的指令碼繼承了你放置在這裡的節點型別。 你只能將指令碼附加到該型別的節點,或者繼承該型別的節點。

extends Control 下面,寫入以下程式碼

func _ready() -> void:
  print("Hello world!")

func 告訴 Godot 你想定義一個函式。 如果你經常使用 Python,你可能會認為 print 從未被呼叫,因為它在函式內部,而函式從未被自動呼叫。 內建函式 _ready() 告訴 Godot 在具有該指令碼的節點“準備就緒”時執行程式碼,或者說它已完全載入。

_init() 在節點準備就緒之前執行。 使用它執行自包含的預構造操作。 _process(delta) 以儘可能快的速度在每一幀執行。 delta 是函式的引數。 它代表自上一幀以來的秒數。 當遊戲出現延遲時,該值會上升。 _physics_process(delta)_process 類似,它在固定時間步長上以每秒 60 幀的速度執行。 _exit_tree() 在節點退出場景(成為孤兒或被“釋放”或刪除)或遊戲關閉時執行。

現在,讓我們使用一些更復雜的程式碼。 此程式將記錄遊戲執行以來的秒數,並在遊戲結束時顯示它。

var time: float = 0 # Or just "var time = .0"

# The "-> void" is optional

func _process(delta):
  # This increments time
  time += delta

func _exit_tree():
  print("Time passed: ",time)

現在,讓我們更新它,使其在隨機時間後自動關閉遊戲。

_process 之前新增此程式碼

const MAX_TIME = 10

const MIN_TIME = 5
onready var time_to_quit=randi() % (MAX_TIME-MIN_TIME) + MIN_TIME + 1

這將在呼叫 _ready 時自動建立一個變數並設定它。 time_to_quit 是 5 到 10 之間的隨機數。 在 _process 函式新增此程式碼

if time >= time_to_quit:
  # Quit after a random amount of time.
  get_tree().quit()

一個問題... 數字從未改變。為什麼?因為你需要先呼叫 randomize()

time_to_quit 的宣告更改為 var time_to_quit,並在 _ready 函式中新增以下內容

randomize()
time_to_quit = randi()% (MAX_TIME-MIN_TIME) + MIN_TIME + 1

+ 1 是必要的,因為 randi()%X 返回一個介於 0{{Gdscript/string|X-1)) 之間的隨機數。

這將建立一個介於 0 和 MAX_TIME 減去 MIN_TIME 減去 1 之間的數字。新增 MIN_TIME 和額外的 1 會得到您需要的結果,即 MIN_TIMEMAX_TIME 之間的隨機數。

randomize() 使 randi() 提供不同的隨機數流。隨機化基於時間,並且出於效能原因不應該 每幀呼叫一次。每個節點一次,在 _ready 呼叫期間呼叫就足夠了。

您學到了什麼

[編輯 | 編輯原始碼]
  1. 目前支援的 3 種(Godot 3.x 版本為 4 種)指令碼型別
  2. 如何將指令碼附加到節點
  3. 如何使用 delta 記錄時間
  4. 如何關閉遊戲
  5. 如何生成隨機數。

另請參見

[編輯 | 編輯原始碼]

Godot 文件 -> 指令碼


1 NativeScript 是引擎使用的程式碼,需要重新編譯引擎才能使用。

正確
錯誤

2 Godot 4 中停用了哪種語言?

視覺指令碼
GDScript
C++
C#
Python

3 GDScript 基於哪些其他流行的程式語言?

4 哪些函式使用delta 作為引數?

_process
_physics_process
_ready
_exit_tree

5 這些過程中的哪一個以固定的時間步長執行?

_process
_physics_process
_second_process

6 "delta" 這個詞也是一個關鍵字:

正確
錯誤


參考文獻

[編輯 | 編輯原始碼]

Godot 遊戲引擎指南

入門 [編輯]
安裝
什麼是節點?
程式設計
資源和匯入
訊號和方法
你的第一個遊戲
使其正常工作
除錯
輸入
物理
儲存和載入
多人遊戲
使其看起來不錯
UI 皮膚
動畫
高階幫助
伺服器(單例)
平臺特定
最佳化
加密
匯出
外掛
其他
有用連結
作者和貢獻者
印刷版


<-- 上一頁 返回頂部 下一頁 -->


華夏公益教科書