第 1 節:認識 GdScript#
godot 使用 GdScript 作為腳本語言,用代碼來控制遊戲對象
- 因為 GdScript 是弱類型語言,所以比較自由,但是我們可以約定一些原則讓代碼更加的規範:
類名必須與文件名相同,且為小寫
盡量繼承於 Node2D 節點,Node2D 節點中的Transform是我們用的最多的節點
- 常用函數內部執行順序,_init _ready _process
默認定義了一些事件函數,例如,
_init() 腳本初始化的時候調用,對象的構造器,類似於Java的構造函數construct
_ready() 開始調用一次,可用於初始化腳本
_process(delta) 每幀調用,幀間隔不等,可用於更新遊戲
第 2 節:變量和數據類型#
- 變量是用於存儲信息的 "容器"。
var x=5;
var y=6;
var z=x+y;
就像代數那樣
x=5
y=6
z=x+y
在代數中,我們使用字母(比如 x)來保存值(比如 5)。
通過上面的表達式 z=x+y,我們能夠計算出 z 的值為 11。
在 godot 中,這些字母被稱為變量。
- Export 關鍵字可以讓變量在編輯器中編輯
# 導出一個數字
@export var a = 1
# 導出一個節點路徑
@export var b:NodePath
# 導出一個節點路徑,不同的寫法
@export(NodePath) var c
# 導出一個文件路徑
@export(String, FILE) var e
# 導出一個文件路徑,以txt結尾
@export(String, FILE, "*.txt") var d
# 導出一個資源文件路徑
@export(Resource) var f
# 導出一個顏色
@export(Color, RGB) var g
- Gds 數據類型分類
- Bool,一個字節,默認為 false
- Int (同 C++ 和 Java long),8 個字節,默認為 0
- Float (同 C++ 和 Java double),8 個字節,默認為 0
- String,默認為 null,字符串可以存儲一系列字符,如 "John Doe"。
- 陣列
- 對象
- Null,變量沒有被賦值,則默認為 null
第 3 節:函數#
- 函數是可以簡單的理解為當它被調用時執行的可重複使用的代碼塊。
- 函數就是包裹在花括號中的代碼塊,前面使用了關鍵詞 func,當調用該函數時,會執行函數內的代碼。
- 空函數需要使用 pass 關鍵字
func sayHello():
# 執行代碼
- 調用帶參數的函數,在調用函數時,您可以向其傳遞值,這些值被稱為參數。
func sayHello(param1, param2):
# 執行代碼
- 帶有返回值的函數,有時,我們會希望函數將值返回調用它的地方,通過使用 return 語句就可以實現。
- return 方法可以指定返回的類型
func sayHello(param1, param2):
# 執行代碼
return x
第 4 節:變量的作用域#
- 局部作用域,變量在函數內聲明,變量為局部作用域,只能在函數內部訪問
# 此處不能調用 carName 變量
func myFunction():
var carName = "Volvo";
# 函數內可調用 carName 變量
- 全局變量,變量在函數外定義,即為全局變量,整個腳本文件中都可以使用
var carName = " Volvo";
# 此處可調用 carName 變量
func myFunction():
# 函數內可調用 carName 變量
第 5 節:運算符#
- 算術運算符
+ 加法 x=y+2 7 5
- 減法 x=y-2 3 5
* 乘法 x=y*2 10 5
/ 除法 x=y/2 2.5 5
% 取模(餘數) x=y%2 1 5
- 赋值运算符,赋值运算符用于给 GdScript 变量赋值
= x=y x=5
+= x+=y x=x+y x=15
-= x-=y x=x-y x=5
*= x*=y x=x*y x=50
/= x/=y x=x/y x=2
%= x%=y x=x%y x=0
- 比較運算符,比較運算符在邏輯語句中使用,以測定變量或值是否相等
== 等於 x==8 false
!= 不等於 x!=8 true
> 大於 x>8 false
< 小於 x<8 true
>= 大於或等於 x>=8 false
<= 小於或等於 x<=8 true
- 邏輯運算符,邏輯運算符用於測定變量或值之間的邏輯。
&& and (x < 10 && y > 1) 為 true
|| or (x==5 || y==5) 為 false
! not !(x==y) 為 true
第 6 節:條件語句#
-
通常在寫代碼時,您總是需要為不同的決定來執行不同的動作。您可以在代碼中使用條件語句來完成該任務。
-
if 語句 - 只有當指定條件為 true 時,使用該語句來執行代碼
if (condition):
當條件為 true 時執行的代碼
- if...else 語句 - 當條件為 true 時執行代碼,當條件為 false 時執行其他代碼
if (condition):
當條件為 true 時執行的代碼
else:
當條件不為 true 時執行的代碼
- if...else if....else 語句 - 使用該語句來選擇多個代碼塊之一來執行
if (condition1):
當條件 1 為 true 時執行的代碼
elif (condition2):
當條件 2 為 true 時執行的代碼
else:
當條件 1 和 條件 2 都不為 true 時執行的代碼
- match (switch) 語句 - 使用該語句來選擇多個代碼塊之一來執行
第 7 節:循環語句#
- 循環可以將代碼塊執行指定的次數,如果您希望一遍又一遍地運行相同的代碼,並且每次的值都不同,那麼使用循環是很方便的
- for
- while
- break 語句跳出循環後,會繼續執行該循環之後的代碼(如果有的話)
- continue 語句中斷循環中的迭代,如果出現了指定的條件,然後繼續循環中的下一個迭代
第 8 節:數組和字典的遍歷#
- 陣列遍歷
func arrayIterator():
# range等價於for(int i = 0; i < 20; i++)
print("陣列遍歷方法1:")
for i in range(3):
print(i)
print("陣列遍歷方法2:")
for ele in arr:
print(ele)
print("陣列遍歷方法3:")
for index in range(arr.size()):
print(arr[index])
- 字典遍歷
func dictionaryIterator():
print("字典遍歷方法1:")
for key in dict:
print("key:" + key as String)
print("value:" + dict[key] as String)
print("字典遍歷方法2:")
for key in dict.keys():
print("key:" + key as String)
print("value:" + dict[key] as String)
print("字典遍歷方法3:")
for value in dict.values():
print("value:" + value as String)
第 9 節: 靜態變量和靜態方法#
- const 變量(靜態變量)
const ANSWER = 42
- 靜態方法
static func getAnswer():
return ANSWER
第 10 節:對象#
- 真實生活中的對象,屬性和方法
- 真實生活中,一輛汽車是一個對象。對象有它的屬性,如重量和顏色等,方法有啟動停止等
# Inner class,默認繼承Object
class Animal:
extends Object # 如果不指定繼承的類,默認基礎Object
const STATIC_FIELD = "靜態變量"
# 屬性
var height: int
func _init():
print("Animal 構造方法")
func move():
print("animal,移動")
static func staticFuction():
pass
第 11 節:節點的獲取方式#
# 獲取當前節點
var currentNode1 = $"."
var currentNode2 = self
# 獲取父節點
var parentNode1 = get_parent()
var parentNode2 = $"../"
# 獲取子節點
var subNode1 = $SubNode2
var subNode2 = $"SubNode2"
var subNode3 = get_node("SubNode2")
# 根節點查找法,會返回節點樹從上到下找到的第一個節點
var subNode4 = get_tree().root.find_node("SubNode2", true, false)
第 12 節:信號 signal#
-
信號是用來完成模塊或功能之間通信的媒介,其實就是約定了一些方法的回調形式
-
設計模式上叫做觀察者設計模式
1. 觀察者和被觀察者是抽象耦合的,解耦模塊
2. 建立一套統一的觸發機制
-
Godot 引擎官方建議在你的遊戲開發中更多的使用信號來完成模塊或功能間的通信
-
第一種使用方法
# 第一種信號接受方法,通過在場景中配置信號的接收方法
func _on_Button1_pressed():
print("hello button1")
- 第二種使用方法
# 第二種信號接受方法,通過代碼控制信號的接收,更加的靈活,比較推薦方式
func _ready():
$Button2.connect("pressed", self, "onButton2")
func onButton2():
print("button2 pressed")
第 13 節:自定義信號#
- 自定義信號
signal mySignal(a, b)
- 發送信號
emit_signal("mySignal", 1, 2)
- 解除綁定信號
disconnect("mySignal", 1, 2)