Godot從零開始的教程—3去往遙遠(yuǎn)的群星
飛行的宇宙飛船:你的第一個場景和腳本
https://www.bilibili.com/video/BV1zu411Y7mF?p=1
歡迎來到您的第一個游戲項(xiàng)目。
您已花費(fèi)數(shù)小時學(xué)習(xí)編程基礎(chǔ)知識?,F(xiàn)在,是時候讓事情變得更有趣了:您將一頭扎進(jìn)游戲開發(fā)中。
在課程的這一部分,您將通過制作玩具和迷你游戲來學(xué)習(xí)。我們將進(jìn)行許多不同規(guī)模的項(xiàng)目。
通過這些項(xiàng)目,您將重用和構(gòu)建您在Learn GDScript 應(yīng)用程序中學(xué)到的一切。
你的第一個項(xiàng)目:宇宙飛船
在第一個項(xiàng)目中,我們將制作一艘可以用鍵盤控制并進(jìn)行加速的宇宙飛船。

首先,我們會讓它非常迅速地移動和停止。然后,我們看看如何使用轉(zhuǎn)向使其平穩(wěn)移動。
你將學(xué)習(xí):
如何將節(jié)點(diǎn)添加到場景并運(yùn)行該場景。
如何通過附加 GDScript 代碼來控制節(jié)點(diǎn)。
如何使用游戲循環(huán)讓物體移動。
如何聽取鍵盤輸入并將控制權(quán)交給播放器。
如何使用計時器和信號進(jìn)行限時提升。
在后續(xù)視頻中,我們將首先編寫一艘自行移動的船。然后,我們將向項(xiàng)目的輸入映射添加播放器控件,并使用輸入函數(shù)對播放器控件進(jìn)行編碼。我們最終將添加提升機(jī)制。

然后輪到您使用?轉(zhuǎn)向行為使船平穩(wěn)移動。

由于這是您的第一個項(xiàng)目,因此信息量可能有點(diǎn)大。
這很正常:一開始要學(xué)的東西太多了!我們不希望您記住這里的一切。
我們正在嘗試創(chuàng)建真實(shí)的游戲機(jī)制,讓您了解 Godot 的工作原理。
該項(xiàng)目的關(guān)鍵要點(diǎn)是場景、節(jié)點(diǎn)、信號和腳本的概念?。完成項(xiàng)目后,您會找到更深入的指南。
此外,您將在課程中一次又一次地看到該項(xiàng)目中介紹的每個功能,這將使您更好地記住它。
當(dāng)然,我們還在每個視頻下加入了很多其他新概念的解釋。
請前往下一課,我們將開始一起編寫我們的宇宙飛船。
導(dǎo)入項(xiàng)目
如果您還沒有,請下載?godot-practice-*.zip
文件并解壓縮。
鏈接:https://pan.baidu.com/s/1_iFZTWIU8WT2XCZZDrgzig?pwd=2k50?
該課程以壓縮檔案形式提供。要訪問這些文件,您需要從檔案中提取它們。您的系統(tǒng)應(yīng)該帶有預(yù)安裝的程序。
要解壓縮文件:
在您的文件資源管理器中,導(dǎo)航到包含下載文件的文件夾。
右鍵單擊 zip 文件并選擇“解壓”選項(xiàng)(Windows、Linux)。在 macOS 上,您需要雙擊該文件。
您應(yīng)該會看到一個名為 zip 存檔的新目錄。它包含本教程和所有其他教程的所有課程文件。
啟動 Godot,然后在打開的項(xiàng)目管理器中單擊?Import。

導(dǎo)航到解壓縮項(xiàng)目的位置,輸入目錄,然后雙擊project.godot
.

然后,單擊導(dǎo)入和編輯。

就是這樣,您已經(jīng)導(dǎo)入了項(xiàng)目!
下次,您只需在項(xiàng)目列表中選擇它:

注意:如果您需要,該文件?godot-complete-demos-*.zip
包含所有教程(但不包括實(shí)踐)的完整代碼。
如何跟上每節(jié)課
對于每一節(jié)課,您都應(yīng)該在 Godot 中打開項(xiàng)目“Learn to Code with Godot: Practices”。如果有視頻,您應(yīng)該先觀看視頻,然后再閱讀文本。您還應(yīng)該按照說明在 Godot 中重現(xiàn)場景和代碼。
我們的教程分為三個部分:
我們解釋為什么我們做我們正在做的事情。跳過這部分可能很誘人,但請閱讀它,我們認(rèn)為這對您的學(xué)習(xí)很重要。
我們?yōu)槟峁┙忉屢怨┠M(jìn),并為您編寫代碼。抵制復(fù)制粘貼的誘惑。編程在很大程度上是一個習(xí)慣問題。反復(fù)編寫代碼對于學(xué)習(xí)來說是必不可少的。
我們?yōu)槟峁┙换ナ綄?shí)踐來訓(xùn)練新技能。他們的標(biāo)題如“練習(xí):……”。當(dāng)您看到它們時,您應(yīng)該通過單擊右側(cè) GDQuest Practices dock 中的相應(yīng)實(shí)踐在 Godot 中打開指定的場景。
找到課程文件
首先,在 Godot 中打開項(xiàng)目“Learn to Code with Godot: Practices”,然后在FileSystem?dock 中展開?MovingShip
目錄,然后 展開01.MakingShipMove
目錄,然后雙擊?MakingShipMove.tscn
.?教程見!
移動宇宙飛船
https://www.bilibili.com/video/BV1zu411Y7mF?p=2
在本視頻中,我們將編寫一艘自行移動的宇宙飛船。
在每個視頻下方,您都會找到有關(guān)新概念的說明和 回答您的問題。

新概念
精靈
在游戲中,精靈是可以移動的圖像。我們用這個詞來談?wù)撚螒蛑袔缀跛械睦L圖:角色、怪物、門、箱子、武器、云等等?!熬`”一詞在 2D 游戲中很流行。
您還會聽到游戲藝術(shù)家稱他們創(chuàng)建的任何圖像都是“精靈”。
關(guān)鍵詞extends
_
關(guān)鍵字extends
告訴計算機(jī)您的腳本直接從游戲引擎擴(kuò)展代碼。
例如,該行extends Sprite
告訴 Godot 將您的代碼附加到 Godot 開發(fā)人員為該類型編寫的所有代碼? 。這就是您可以像GDScript 一樣訪問?_process()
函數(shù)或成員變量的 方式。position
rotation
在 Godot 中,每個腳本都必須從游戲引擎擴(kuò)展一個類型。正如我們在“添加節(jié)點(diǎn)”對話框中看到的那樣,它?
是引擎內(nèi)置的眾多節(jié)點(diǎn)類型之一。您將在課程的后面學(xué)習(xí)如何創(chuàng)建新類型和擴(kuò)展它們。
速度
速度是將方向和速度組合成單個值的矢量。矢量的方向給了我們它的方向,它的長度代表了速度。
有關(guān)場景、節(jié)點(diǎn)和腳本的更多信息,請查看本章的專門指南。
你的問題
為什么用大寫字母命名文件并且沒有空格?
我們經(jīng)常在代碼中使用大寫字母且沒有空格的名稱來表示大多數(shù)類型。這是一個約定,我們稱之為“PascalCase”。
在這個項(xiàng)目中,我們對相關(guān)文件使用相同的約定。例如,我們用 PascalCase 編寫文件、腳本和文件夾的名稱。
我們這樣做是因?yàn)?PascalCase 是 Godot 社區(qū)的標(biāo)準(zhǔn)約定。Godot 默認(rèn)以 PascalCase 命名節(jié)點(diǎn)、場景和腳本文件,因此人們傾向于使用它。
您可以隨心所欲地編寫文件名。我們建議為每個項(xiàng)目選擇一個約定并堅(jiān)持下去。它有助于讓您和您的隊(duì)友輕松搜索和整理內(nèi)容。
下一個視頻將帶您逐步完成第一個練習(xí)。
代碼
這是本課后該船的完整代碼清單。
extends Sprite
var velocity := Vector2(500, 0)
func _process(delta: float) -> void:
position += velocity * delta
rotation = velocity.angle()
你的第一次練習(xí)
https://www.bilibili.com/video/BV1zu411Y7mF?p=3
現(xiàn)在是您進(jìn)行第一次練習(xí)的時候了,您將在練習(xí)中重現(xiàn)我們在本課中編寫的代碼。
由于這是我們的第一個項(xiàng)目,因此實(shí)踐與課程非常接近。你應(yīng)該把它們當(dāng)作一個機(jī)會來排練和測試你剛剛學(xué)到的東西。實(shí)踐將變得更具挑戰(zhàn)性。
實(shí)踐如何在課程中發(fā)揮作用
練習(xí)都是為了提高您的 Godot 和游戲開發(fā)技能。這就是為什么我們開發(fā)了一個系統(tǒng),讓您可以在 Godot 編輯器中輕松練習(xí)。這是它的工作原理。
在右側(cè),您會看到一個名為GDQuest Practices的停靠欄。它列出了課程中的所有練習(xí)。
每個練習(xí)都有一個專門的場景。要打開第一個練習(xí)場景,請單擊其名稱Making the ship move。

這將在視口中打開練習(xí)場景并顯示您的目標(biāo)、任務(wù)和提示。
在視口中,您應(yīng)該會看到一個帶有腳本的Sprite節(jié)點(diǎn)。

要完成練習(xí),您需要通過多項(xiàng)檢查,就像在Learn GDScript應(yīng)用程序中一樣?。
按 運(yùn)行場景F6。這將在左側(cè)顯示檢查并運(yùn)行它們。對于每個失敗的檢查,右側(cè)都會顯示一條錯誤消息。

按F8停止播放場景并返回到編輯器。
要完成練習(xí),您需要編輯場景及其腳本。使所有檢查通過,完成標(biāo)記將出現(xiàn)在編輯器中。
如果條件允許 經(jīng)可能的關(guān)閉任何能夠影響到你注意力的東西
用鍵盤控制飛船
在本視頻中,您將添加輸入映射和代碼以使用鍵盤控制您的飛船。
https://www.bilibili.com/video/BV1zu411Y7mF?p=4

新概念
什么是對象?
在課程的第一部分,您會不時聽到我們談?wù)搶ο蟆T?Godot 以及 Python 或 JavaScript 等編程語言中,對象是一種將數(shù)據(jù)和函數(shù)捆綁在一起的結(jié)構(gòu)。
您已經(jīng)遇到了幾個對象:您的船Input
也是對象。
它們都將數(shù)據(jù)和函數(shù)捆綁在一個包中:例如,數(shù)組包含值(數(shù)據(jù))并允許您訪問成員函數(shù),例如append()
.
在游戲開發(fā)中,您將一直使用對象。例如,Godot 中的每個節(jié)點(diǎn)都是一個對象。
這個概念現(xiàn)在可能有點(diǎn)抽象,但不要擔(dān)心:您將在本課程的后面學(xué)到更多關(guān)于對象的知識。
輸入
該Input
對象使您可以訪問與 Godot 中的用戶輸入相關(guān)的所有功能。比如我們用它來獲取帶有函數(shù)的玩家的輸入方向get_axis()
。
對象的許多功能都Input
需要輸入操作。輸入操作是您將鍵、鼠標(biāo)按鈕或游戲手柄按鈕映射到的名稱。我們準(zhǔn)備了一份關(guān)于輸入操作的回顧指南:將輸入映射添加到您的游戲中。
方向向量
方向向量是最大長度為 的向量?1
。
我們經(jīng)常通過將方向向量乘以速度值來計算游戲角色的速度。
在那種情況下,方向通常是一個二維向量,而速度是一個十進(jìn)制值。將向量乘以十進(jìn)制值會使向量變長或變短,同時保持其方向。
我們準(zhǔn)備了一個額外的視頻演示來向您展示方向向量的工作原理。
檢查是否有輸入方向
在本課中,我們direction
在以下條件下測試玩家的輸入:if direction
。
使用此快捷方式時,Godot 會同時測試向量的x
和 值。y
如果它們都等于零,則條件失敗。如果向量有任何其他值,則條件通過。
練習(xí):聆聽玩家輸入
在godot-practice項(xiàng)目中,開啟本項(xiàng)目的第二個練習(xí),Listening to player input。
這一次,你的工作是讓飛船聽取輸入。
你的問題
為什么有時在數(shù)字后加小數(shù)?
我們有時會在數(shù)字后添加一個小數(shù)位,即使它是?.0
.?這樣做會告訴計算機(jī)這個值是一個?float
(十進(jìn)制數(shù))而不是一個int
(整數(shù))。
然而,這在 GDScript 中通常是不必要的。雖然整數(shù)和小數(shù)對于計算機(jī)來說是不同的,但 GDScript 會根據(jù)上下文為您轉(zhuǎn)換數(shù)字。
例如,在創(chuàng)建二維向量時,Vector2()
?構(gòu)造函數(shù)只采用十進(jìn)制值。

即使您寫的是整數(shù),計算機(jī)也知道您的意思是使用十進(jìn)制值并照此處理。
那你為什么要.0
在數(shù)字后面打字呢?它使您的代碼更加精確。當(dāng)您需要在幾周后修改它并且小數(shù)點(diǎn)很重要時,它特別有用。
.0
出于這個原因,我們通??偸菍懶?shù)位,即使它們是 。但是,它們是您不應(yīng)該擔(dān)心的細(xì)節(jié)。
為什么我們在過程函數(shù)之外定義速度而在過程函數(shù)內(nèi)部定義方向?
從技術(shù)上講,我們可以像定義 變量一樣定義函數(shù)velocity
內(nèi)部?。這樣做會在每一幀重置變量。_process()
direction
然而,為了讓飛船在系列后期順利移動,我們需要velocity
在幀之間保持它的值,這就是我們在腳本頂部定義它的原因。您將需要在大多數(shù)角色移動腳本中這樣做。
為什么我們用 Vector2.ZERO 的值定義速度?
創(chuàng)建變量時,最好給它們賦值。這允許我們通過編寫來使用類型推斷:=
。此外,如果您忘記設(shè)置變量的初始值,有時您的代碼可能會出現(xiàn)錯誤。
在這種情況下,起始值不是很重要,因?yàn)槲覀冎匦掠嬎?code>velocity每一幀。我們只是經(jīng)常用 的值初始化 2D 向量Vector2.ZERO
。
代碼
到目前為止,這是該船的完整代碼清單。
extends Sprite
var max_speed := 600.0
var velocity := Vector2.ZERO
func _process(delta: float) -> void:
? ? var direction := Vector2.ZERO
? ? direction.x = Input.get_axis("move_left", "move_right")
? ? direction.y = Input.get_axis("move_up", "move_down")
? ? # If we don't do this and the player moves diagonally, they will move 40%
? ? # faster than normal.
? ? if direction.length() > 1.0:
? ? ? ? direction = direction.normalized()
? ? velocity = direction * max_speed
? ? position += velocity * delta
? ? if direction:
? ? ? ? rotation = velocity.angle()
在下一個視頻中,我們將使用信號來編寫增強(qiáng)機(jī)制的代碼。
使船舶升壓
在本視頻中,您將使用信號為您的飛船編寫在短時間內(nèi)提升速度的代碼。
https://www.bilibili.com/video/BV1zu411Y7mF?p=5

信號
信號允許節(jié)點(diǎn)相互通信和做出反應(yīng)。它們是節(jié)點(diǎn)在發(fā)生某些事情時發(fā)出的消息。例如,a?在超時時"timeout"
您可以連接一個信號和一個節(jié)點(diǎn)。當(dāng)您這樣做時,每次發(fā)出信號時,Godot 都會調(diào)用連接的函數(shù)。它是同步發(fā)生的:在視頻中,當(dāng)"timeout"
信號發(fā)出時,連接的_on_Timer_timeout()
函數(shù)在同一幀中被調(diào)用。
您將在本課程和您的項(xiàng)目中大量使用信號。它們是 Godot 最有用的核心功能之一。
獲取節(jié)點(diǎn)
在 GDScript 中,您可以通過調(diào)用函數(shù)來訪問子節(jié)點(diǎn)?get_node()
。此函數(shù)需要一個參數(shù):目標(biāo)節(jié)點(diǎn)相對于您附加腳本的節(jié)點(diǎn)的路徑。
例如,在下圖中,您可以?通過調(diào)用 來?從Player節(jié)點(diǎn)訪問BodySprite節(jié)點(diǎn)。get_node("Pivot/BodySprite")

一旦你得到一個節(jié)點(diǎn),你就可以調(diào)用它的函數(shù)并使用點(diǎn) (?.
) 運(yùn)算符訪問它的變量,就像我們?get_node("Timer").start()
在視頻中寫的那樣。
實(shí)踐:提升機(jī)制
在Godot實(shí)踐項(xiàng)目中,開啟第三個實(shí)踐,The boost mechanic。
在本練習(xí)中,您將重現(xiàn)我們在本課中看到的提升機(jī)制。
您需要在場景中添加一個計時器,連接到它的信號,并在按下輸入boost
操作時使飛船加速。
代碼
到目前為止,這是該船的代碼。
extends Sprite
var boost_speed := 1500.0
var normal_speed := 600.0
var max_speed := normal_speed
var velocity := Vector2.ZERO
func _process(delta: float) -> void:
? ? var direction := Vector2.ZERO
? ? direction.x = Input.get_axis("move_left", "move_right")
? ? direction.y = Input.get_axis("move_up", "move_down")
? ? if direction.length() > 1.0:
? ? ? ? direction = direction.normalized()
? ? if Input.is_action_just_pressed("boost"):
? ? ? ? max_speed = boost_speed
? ? ? ? get_node("Timer").start()
? ? velocity = direction * max_speed
? ? position += velocity * delta
? ? if direction:
? ? ? ? rotation = velocity.angle()
func _on_Timer_timeout() -> void:
? ? max_speed = normal_speed
在下一部分中,您將向節(jié)點(diǎn)添加轉(zhuǎn)向。這一次,您不會有視頻:相反,您必須閱讀簡短的指南并使用代碼清單來修改您的飛船。
它可能不如觀看視頻舒服,但同時對您有好處:它是一種更積極的學(xué)習(xí)形式。
平穩(wěn)地操縱船
在本課中,我們將使用轉(zhuǎn)向行為使我們的船移動得更加順暢。

轉(zhuǎn)向行為是一種計算,可讓您使用通常很少的代碼使角色和 AI 平穩(wěn)移動。它們導(dǎo)致自然運(yùn)動和平滑曲線。
目前,在每一幀中,我們都會立即改變速度。當(dāng)玩家按下方向鍵時,船會以最大速度移動。如果玩家釋放鑰匙,船就會停止。

我們希望飛船平穩(wěn)地加速和減速。為此,我們將使用轉(zhuǎn)向行為。
轉(zhuǎn)向行為是我們用來使物體平穩(wěn)移動的一類算法。轉(zhuǎn)向行為使用矢量計算使對象轉(zhuǎn)向目標(biāo)位置。
我們將看到的第一個轉(zhuǎn)向算法是最簡單的:它只需要兩三行代碼就可以極大地改善運(yùn)動。
var desired_velocity := speed * direction
var steering_vector := desired_velocity - velocity
velocity += steering_vector * drag_factor
我們將在下面對其進(jìn)行分解。
跟隨轉(zhuǎn)向行為
這種轉(zhuǎn)向行為會逐漸改變船只的速度以朝向目標(biāo)移動。
它通過計算我們所說的“所需速度”來工作。那是船在輸入方向上以最大速度立即行駛。我們將其與當(dāng)前速度“比較”。
我們可以像這樣表示當(dāng)前和期望的速度向量。

想象一下船向左行駛,玩家按下右鍵。我們?nèi)绾巫尨蛴肄D(zhuǎn)?
我們首先計算兩個速度之間的差異。這就是我們所說的轉(zhuǎn)向矢量

為了讓船平穩(wěn)地轉(zhuǎn)彎,而不是在每一幀以所需的速度移動,我們將一小部分轉(zhuǎn)向矢量添加到當(dāng)前速度。這樣做會使船逐漸轉(zhuǎn)向?目標(biāo)速度。

到目前為止,我們用一行代碼計算了速度。
func _process(delta: float) -> void:
? ? # ...
? ? velocity = direction * speed
注意:當(dāng)我們寫#...
代碼清單時,它代表我們突出顯示的行之前或之后的代碼行。否則,如果我們每次都包含每一行代碼,那么重要的或新的代碼行將變得難以發(fā)現(xiàn)。
為了獲得平滑的運(yùn)動,我們需要用三行代碼替換更新船速的行。我們還添加了一個新變量,即drag_factor
:
var drag_factor := 0.1
func _process(delta: float) -> void:
? ? # ...
? ? var desired_velocity := max_speed * direction
? ? var steering_vector := desired_velocity - velocity
? ? velocity += steering_vector * drag_factor
? ? # ...
我們首先計算所需的速度:船在輸入方向上以最大速度移動。
? ? var desired_velocity := max_speed * direction
然后我們計算所需速度與當(dāng)前速度之間的差異。
? ? var steering_vector := desired_velocity - velocity
請注意,放置向量的順序很重要,因?yàn)橄蛄坑蟹较?。如果你顛倒這兩項(xiàng),船就會遠(yuǎn)離目標(biāo)。
? ? velocity += steering_vector * drag_factor
我們將這個轉(zhuǎn)向矢量的一部分添加到第三行的當(dāng)前速度。它逐漸改變velocity
?每一幀,使我們的船根據(jù)我們的輸入加速和減速。
如果沒有drag_factor
,我們會立即將我們設(shè)置?velocity
為desired_velocity
,使船始終以最大速度移動或根本不動。
要每幀僅添加一部分轉(zhuǎn)向矢量,請將該值乘以steering_vector
一個小數(shù)。0.01
介于和之間的任何地方都0.3
應(yīng)該運(yùn)作良好。
值越低,船的慣性就越大:它的轉(zhuǎn)彎、加速和減速都會慢得多。drag_factor
這是一艘船?0.05
。

值越高,船的反應(yīng)性越強(qiáng):它會急轉(zhuǎn)彎,迅速達(dá)到最大速度,然后瞬間停止。drag_factor
這是以of?移動的船0.3
。

盡管如此,與使用這種轉(zhuǎn)向算法始終以最大速度移動相比,運(yùn)動總是感覺更順暢。
練習(xí):讓船轉(zhuǎn)向
在 Godot 實(shí)踐項(xiàng)目中,打開Making the ship steer。
代碼
這些轉(zhuǎn)向方程廣泛用于專業(yè)游戲中。本課程僅展示基本原理,但您將在課程中看到我們可以進(jìn)一步推動轉(zhuǎn)向行為以編寫令人印象深刻的 AI 運(yùn)動。
這是舵機(jī)的完整代碼,包括您之前編寫的助推機(jī)制。
extends Sprite
var boost_speed := 1500.0
var normal_speed := 600.0
var max_speed := normal_speed
var velocity := Vector2.ZERO
var drag_factor := 0.1
func _process(delta: float) -> void:
? ? var direction := Vector2.ZERO
? ? direction.x = Input.get_axis("move_left", "move_right")
? ? direction.y = Input.get_axis("move_up", "move_down")
? ? if direction.length() > 1.0:
? ? ? ? direction = direction.normalized()
? ? if Input.is_action_just_pressed("boost"):
? ? ? ? max_speed = boost_speed
? ? ? ? get_node("Timer").start()
? ? var desired_velocity := max_speed * direction
? ? var steering_vector := desired_velocity - velocity
? ? velocity += steering_vector * drag_factor
? ? position += velocity * delta
? ? rotation = velocity.angle()
func _on_Timer_timeout() -> void:
? ? max_speed = normal_speed
到太空和遙遠(yuǎn)的群星!結(jié)束
如果您完成了所有四個練習(xí),恭喜您!您擊敗了第一個項(xiàng)目,并正在成為游戲開發(fā)者的路上。
在下一個項(xiàng)目 Dialog Boxes 中,您將編寫一個漂亮的小對話框系統(tǒng)。那將是一個了解字典力量的好機(jī)會。
將輸入映射添加到您的游戲
您的玩家可能希望使用鍵盤或游戲手柄來玩您的游戲。通常,您需要支持多種輸入設(shè)備。
例如,您可能希望Dkey、→key 和 joystick 都使角色向右移動。
Godot 的Input Map為您解決了這個問題:它將一個?
名稱映射到多個鍵和按鈕。訪問輸入映射
要管理您的Input Map,請轉(zhuǎn)到Project -> Project Settings…窗口,然后單擊Input Map?選項(xiàng)卡。

Input?Map窗口頂部有一個欄,用于添加新的輸入名稱以及現(xiàn)有名稱和相應(yīng)輸入的列表。

在那里,您可以在淺灰色背景上看到每個現(xiàn)有操作的名稱。在每個名稱下方,您會找到相應(yīng)輸入的列表。
當(dāng)玩家按下這些輸入中的任何一個時,Godot 將觸發(fā)相應(yīng)的動作,允許您在代碼中對其做出反應(yīng)。
所有以ui_開頭的動作都是由 Godot 編輯器預(yù)定義和使用的。
您可以在編寫游戲的用戶界面或插件時使用它們。但是,我們建議為游戲的其余部分創(chuàng)建新的輸入操作,以避免在與游戲的 UI 交互時發(fā)生沖突。
創(chuàng)建動作
要定義新操作,請單擊Action旁邊的欄。您鍵入操作的名稱,例如move_right,然后按下Enter或單擊“添加”按鈕。

然后您的新操作會出現(xiàn)在窗口底部。

要將鍵或按鈕映射到此操作,請單擊其右側(cè)的加號圖標(biāo)。

您會看到四個選項(xiàng):
Physical?Key和Key選項(xiàng)適用于鍵盤按鍵。
Joy Button選項(xiàng)適用于游戲手柄上的按鈕。
操縱軸選項(xiàng)代表任何操縱桿。
鼠標(biāo)按鈕控制鼠標(biāo)。在 的情況下?Left Click,它還默認(rèn)與觸摸設(shè)備兼容。

鑰匙和物理鑰匙有什么區(qū)別?
世界各地的玩家使用不同的鍵盤布局。
例如,英語國家有QWERTY鍵盤,但在法國最常見的布局是AZERTY。
當(dāng)試圖映射到鍵盤上的特定字母時,比如?WASD在第一人稱游戲中移動,法國玩家最終會遇到不方便的布局。對于他們來說,鍵的布局不像箭頭鍵,這將要求他們在玩游戲之前更改輸入設(shè)置。
這就是 Godot 引入物理密鑰選項(xiàng)的原因。它不是映射到給定的字母,而是記錄鍵在鍵盤上的位置。例如,如果您在QWERTY鍵盤上記錄您的物理鍵,Godot 會將其保存為“第一個字母行的第二個字母”。W
這使得鍵的位置?WASD在鍵盤布局中保持一致。
如果您想使用字母鍵進(jìn)行移動,我們建議您使用它。
獎勵:方向向量
https://www.bilibili.com/video/BV1zu411Y7mF/?p=6
這段簡短的附贈視頻應(yīng)該可以幫助您直觀地了解我們所說的?方向向量的含義。
簡而言之,它通常是一個最大長度為 的向量?1.0
,我們用它來表示玩家或?qū)嶓w的移動方向。您可以將它乘以速度值來計算?速度。
場景、節(jié)點(diǎn)、腳本和信號
這些是 Godot 游戲所依賴的四個基本概念:場景、節(jié)點(diǎn)、腳本和信號。
我們已經(jīng)在我們的第一個項(xiàng)目中看到了它們的實(shí)際應(yīng)用。
本指南將幫助您更多地理解這些概念。您可以隨時返回以復(fù)習(xí)。
Godot 游戲由許多場景組成。場景可以由更小的場景和節(jié)點(diǎn)組成。
您游戲的所有場景和節(jié)點(diǎn)一起構(gòu)成了場景樹:您的游戲?qū)⒔M織在場景樹中。當(dāng)我們從事更大的項(xiàng)目時,您會了解更多。
現(xiàn)在,場景和節(jié)點(diǎn)沒有腳本就做不了多少。腳本是包含附加到節(jié)點(diǎn)的代碼的文件。代碼在您將腳本鏈接到的節(jié)點(diǎn)上執(zhí)行。
最后,您可以使用信號讓腳本對游戲世界中的事件做出反應(yīng)?。信號是節(jié)點(diǎn)在發(fā)生特定事件時發(fā)出的消息,例如計時器用完。
Godot 游戲由場景組成
在 Godot 中,您會將游戲分解為多個場景。
場景可以是游戲中任何有意義的東西,例如角色、武器、門、房子或整個游戲關(guān)卡。

場景可以是任意大小和復(fù)雜程度。在設(shè)計場景時,我們專注于為游戲制作單一的東西,比如角色或菜單。如果我們需要二十個節(jié)點(diǎn)來這樣做,我們就使用二十個節(jié)點(diǎn)。如果我們只需要三個,我們就用三個。

您可以嵌套場景
假設(shè)您有幾個場景:一個房間、一個傳送器和一個箱子。你可以通過將它們組合成一個新場景來制作一個可玩的關(guān)卡場景,就像你在課程介紹中所做的那樣。

您可以根據(jù)需要多次復(fù)制場景。例如,您的寶箱場景是制作新寶箱的藍(lán)圖。
我們稱您游戲中的每個箱子為實(shí)例:場景的具體再現(xiàn)。在整個課程中,您將了解有關(guān)創(chuàng)建實(shí)例的更多信息。
節(jié)點(diǎn)是您最小的構(gòu)建塊
要創(chuàng)建場景,您需要小型構(gòu)建塊。在 Godot 中,我們稱它們?yōu)楣?jié)點(diǎn)。
節(jié)點(diǎn)就像樂高積木。它們是游戲的基本構(gòu)造塊。Godot 提供了其中的幾十個。這里有四個例子:
該
節(jié)點(diǎn)顯示圖像并允許您移動、旋轉(zhuǎn)和縮放它。AudioStreamPlayer2D
可以播放聲音或音樂配樂。檢測另一個區(qū)域或物理體何時接觸它。
倒計時并在每次超時時發(fā)出信號。
節(jié)點(diǎn)為您提供制作游戲所需的所有基本功能。例如,您可以檢測到玩家何時靠近箱子并嘗試使用
.?您還可以使用它們來了解角色何時受到打擊并且應(yīng)該失去健康。請注意某些節(jié)點(diǎn)如何具有“2D”后綴。Godot支持2D和3D游戲,很多節(jié)點(diǎn)都有2D和3D版本。后綴和圖標(biāo)的顏色區(qū)分它們。
就其本身而言,節(jié)點(diǎn)通常不執(zhí)行任何操作。它們是 Godot 為您提供的代碼庫的一部分?。要使節(jié)點(diǎn)栩栩如生,您需要將腳本附加到它們。
腳本
腳本是包含附加到 Godot 節(jié)點(diǎn)的代碼的文件。
我們在本課程中專門使用 GDScript 代碼,但Godot為有需要的經(jīng)驗(yàn)豐富的游戲開發(fā)人員支持多種編程語言。
最好將腳本想象成附在兼容主機(jī)上并控制它們的寄生蟲。
每個節(jié)點(diǎn)都帶有一個代碼庫,默認(rèn)情況下不會做太多事情。此代碼正在等待您使用它。為此,您需要在腳本中編寫說明。
您的腳本通常以extends
?關(guān)鍵字開頭,后跟節(jié)點(diǎn)類型。
您在第一行所寫的內(nèi)容限制了兼容節(jié)點(diǎn)。例如,以以下代碼開頭的腳本僅與精靈和從精靈派生的節(jié)點(diǎn)兼容。
extends Sprite
關(guān)鍵字extends
的意思是“此腳本擴(kuò)展了該節(jié)點(diǎn)類型的代碼”,使您的腳本可以訪問 Godot 開發(fā)人員為該節(jié)點(diǎn)編碼的所有函數(shù)和變量。
例如,每個start()
啟動計時器的功能。要在 節(jié)點(diǎn)上使用此功能,您必須:
創(chuàng)建一個
節(jié)點(diǎn)。將腳本附加到
以 code 開頭的節(jié)點(diǎn)?extends Timer
。
信號
你可以只用節(jié)點(diǎn)和腳本做很多事情,但你很快就會遇到問題。想象一顆子彈飛向怪物。您想準(zhǔn)確知道子彈何時接觸到怪物并在那一刻減去生命值。
為了解決這個問題,Godot 有一個名為signals的特性。它們是您可以收聽的消息,可以準(zhǔn)確地告訴您事件發(fā)生的時間。
例如,在給船升壓時,我們
在項(xiàng)目中啟動一個。我們想知道計時器何時超時并降低船速。為此,我們連接到timeout
信號。當(dāng)? 結(jié)束時,它發(fā)出信號。
我們將信號連接到函數(shù)。當(dāng)timeout
信號發(fā)出時,Godot 調(diào)用連接的函數(shù)并運(yùn)行它的代碼,這就是我們對信號做出反應(yīng)的方式。
總之
信號、腳本、節(jié)點(diǎn)和場景。他們一起工作來幫助你制作游戲:
您連接信號和腳本以對游戲世界中的事件做出反應(yīng)。
您將腳本附加到節(jié)點(diǎn)以控制節(jié)點(diǎn)。
您創(chuàng)建多個節(jié)點(diǎn)并將其組合到場景中。
你所有的場景都匯集到一個游戲中。
請注意,這些概念是 Godot 特有的,因?yàn)槊總€游戲引擎的工作方式都不同。
您不會在其他游戲引擎中找到節(jié)點(diǎn)本身。但是,您會發(fā)現(xiàn)精靈、聲音播放器、區(qū)域等。他們只是工作方式不同。