跳轉至內容

Godot 遊戲引擎關鍵字指南 (3.x)

100% developed
來自 Wikibooks,開放世界中的開放書籍
注意

此頁面適用於 Godot 3.x。有關 Godot 4.x 的相同頁面,請參閱 更新後的頁面
關鍵字

Godot 中的關鍵字是 GDScript 中使用的特殊詞語。不幸的是,其中一些詞語在 Godot 的類文件中沒有詳細記錄。

break 關鍵字結束迴圈程式碼段。對於“永遠”迴圈很有用。

var counter = 0

while true:
  counter += 1
  if counter == 15:
    break

這將在程式碼執行 15 次後結束迴圈。

continue 關鍵字用於迴圈內部。類似於 breakcontinue 跳過迴圈的單次執行。就像中斷它一樣,但它不是結束整個迴圈,而是隻跳過單次迭代。

for num in range( 1,5 ):
  if num == 4:
    continue
  print( num )

上面執行 5 次。Num 分別為 1、2、3、4 然後是 5。如果 num 為 4,它將“繼續”迴圈。否則它將列印。所以 4 會被列印,但 1、2、3 和 5 會被列印。

const 關鍵字可以用來代替 var 來建立一個 常量,一個 不能 更改的值。

與變數不同,常量可以在 靜態函式 中使用。

enum 關鍵字類似於建立 整數 常量

enum {
  DRAW_MODE_PEN,
  DRAW_MODE_FILL,
  DRAW_MODE_ERASER,
  DRAW_MODE_LINE,
  DRAW_MODE_BOX,
  DRAW_MODE_SHADING,
  DRAW_MODE_CONTRAST,
  DRAW_MODE_BLEND
}

上面的程式碼是我以前在 Godot 中製作的影像編輯器的程式碼片段。它顯示了可能的繪製模式,如線條和填充,作為 命名整數 以便於程式碼除錯。

不要與 匯出 混淆。export 關鍵字是一個非常強大的關鍵字。

它允許在 Inspector 視窗中編輯值,並且它為每個例項儲存更改。

對於基本示例,請嘗試 export var max_health:int

你甚至可以使用模板和範圍

# This allows a range of 0 to 100 with a step of 2
export ( int, 0, 100, 2 ) var number = 50

# This allows linking a file path
export ( String, FILE ) var file_path

# This asks for a file path that ends with ".json" or ".md"
export ( String, FILE, ".json;Json file, .md;Mark Down file" ) var specific_extension_file_path

# You can also try "String" with this one
export ( int, Number1, Number2, Number3 ) var dropdown_menu_int = 0

# This creates a slider to change the float with a step of 0.0001
export ( float, 0, 1, 0.0001 ) var float_with_range = 0.5

extends 關鍵字告訴 Godot 指令碼繼承了給定物件的屬性。

它必須位於指令碼的最頂部。只有 tool 可以放在它之前。

for 關鍵字在給定值的每個專案之後執行其縮排的程式碼塊。

for i in ["Hello", "I", "am", "human", 1, 2, 3]:
  print( i )

通常用於 if 語句 中。如果其前面的值 其後面的值 內部,它將評估為真。它可以檢查

  1. 如果一個值在陣列中
  2. 如果一個鍵在字典中
  3. 如果一段文字包含另一段文字
  4. 如果一個物件包含一個具有相同名稱的屬性或常量

以及其他事物。"h" in "Hello" 將為假。“Hello” 中沒有小寫字母“h”。如果你想要進行不區分大小寫的搜尋,請對兩個值都呼叫 to_lower() 將每個字母轉換為小寫(或 to_upper() 用於大寫 - 全部大寫)。

通常用於 if 語句中。它檢查其前面的值是否為其後面的型別。

print( "Hello" is String ) # True
print( 52434 is int ) # True
print( bool( "52434" ) is bool ) # True
print( load( "res://icon.png" ) is StreamTexture ) # True
print( load( "res://icon.png" ) is Texture ) # True

好的,load 在技術上是在 全域性範圍 中描述的。但是,它被明確定義為關鍵字,因此如果它不在此,將毫無意義。

它在被呼叫時從你的檔案系統載入檔案。它接受一個引數:檔案路徑。

檔案路徑 必須相對於你的專案資料夾 或玩家儲存資料夾,並且 不能超出

有效示例

load( "res://assets/weapons/sword.png" )
load( "res://entities/chicken_egg.tscn" )
load( "user://custom_entities/mutant_monster.tscn" )

res 指向你的專案資料夾。user 指向玩家的儲存資料夾。這通常是 %appdata%/roaming/godot/app_userdata/<project_name>,除非 ProjectSetting Config/Use Custom User DirConfig/Custom User Dir Name 被設定,在這種情況下,它將是 %appdata%/roaming/<ProjectSettings:Config/Custom User Dir Name>

master 關鍵字是 5 個多玩家關鍵字系列的一部分。如果使用它,它將使只有“master”呼叫函式。

remote master func take_damage( damage ):
  health -= damage
  rpc( "set_health", health )

你不應該在 傀儡 上呼叫它,以幫助防止錯誤。

onready

[edit | edit source]

onready 關鍵字放在 var 關鍵字之前。它允許使用在 _ready() 函式呼叫之前設定的動態數字。

onready var random_number = randi( )

pass 關鍵字用作空白程式碼行。在 "if" 語句或 "for" 語句之後或在函式宣告之後使用它,以作為 "程式碼塊"(消除錯誤),而不執行任何操作。這被稱為 "空" if 語句或 "樁函式"。

if true:
    pass

preload

[edit | edit source]

參見 load。檔案可以相對於呼叫它的指令碼或 "res"。當指令碼載入時,資源會被載入,從而防止在遊戲執行過程中出現停頓。但是,檔案**必須**存在,否則會發生錯誤,並且路徑**必須**是常量(即:不可更改)。

res://game/game.gd

preload( "entities/thing.tscn" )

preload( "res://game/entities/thing.tscn" )

puppet

[edit | edit source]

puppet 關鍵字是 5 個多玩家關鍵字中的一個。在 "func" 之前但 "remote" 之後使用它。它使函式只調用 非主機

remote puppet func set_health( v ):
  health = v

為了阻止玩家作弊,你不想將它呼叫到 主機

remote

[edit | edit source]

在 "func" 關鍵字之前使用 remote 關鍵字,以允許在呼叫 "rpc"、"rpc_id"、"rpc_unreliable" 或 "rpc_unreliable_id" 時,在多玩家環境中被其他對等體遠端呼叫函式。注意作弊和安全威脅!

func hit( ):
  health -= 1
  rpc( "player_hit", health )

remote func player_hit( hp ):
  if get_tree().get_rpc_sender_id( ) != get_network_master( ):
    return # This means a player is trying to cheat
  health = hp

有關更多資訊,請參閱 puppetmaster。使用 remotesync 在本地以及透過網路呼叫函式。

警告:如果您不新增阻止它們的檢查,惡意駭客可以使用您的遊戲檢索或刪除資料,或者玩家可以作弊。除非您知道自己在做什麼,否則不要在刪除或建立檔案的函式中新增 remote

remotesync

[edit | edit source]

參見 remote。此關鍵字還會在本地呼叫函式,而不是僅透過網路呼叫它們。對於告訴其他對等體以及主機角色已跳躍的情況很有用。

return

[edit | edit source]

return 關鍵字用於結束函式。對於被呼叫並 "返回" 值的函式,return 關鍵字是返回值的地方。

func get_some_value( ):
  return "some string"

它還會結束函式呼叫,因此可以在 if 語句中使用它來跳過函式的其餘部分。它不需要返回值,預設情況下返回 null

setget

[edit | edit source]

變數 宣告的末尾使用。語法:var points = 0 setget set_points get_points。getter 是可選的。setter 必須有一個引數(要設定的值),而 getter 必須返回一個值。例如

export var points = 0 setget set_points get_points

func set_points( value ):
  points = value

func get_points( ):
  return points

static

[edit | edit source]

通常,要呼叫物件的函式,您需要它的例項。如果在 "func" 關鍵字之前使用 static 關鍵字,您將能夠從非例項呼叫它。但是,您只能使用其他靜態函式或全域性範圍內的函式。您不能使用成員 變數

在以下示例中,Weapon 是一個自定義的 資源

Weapon.gd
extends Resource
class_name Weapon

export var damage = 5
const DAMAGE = 5

static func get_damage( ):
  # Cannot use an outside variable here
  return DAMAGE # Can use a constant though

Weapon.new( ).get_damage( ) 變為 Weapon.get_damage( ),如果您想查詢值,則可以節省記憶體和 CPU 資源。

tool 關鍵字告訴 Godot 指令碼在編輯器中執行。這類指令碼通常被稱為工具指令碼。如果指令碼僅在指令碼編輯螢幕中開啟,則它不會執行。它必須附加到場景中的節點,或者具有指令碼的節點必須在編輯器中。

它必須始終放在extends關鍵字之前。

如果您有一個工具指令碼,它繼承的指令碼和繼承它的指令碼將不會執行,除非它們也是工具指令碼。所有節點本身都在編輯器中執行,但只有在使用編輯器外掛將其放置到其介面中時才會執行。

另請參閱:編輯器外掛(以及 外掛章節),功能非常強大。

var 關鍵字建立一個變數。當它們離開作用域(例如,縮排的程式碼塊取消縮排)時,它們會自動從記憶體中釋放。

var global_varible := 1

func _ready():
  some_function(7)
 
func some_function(argument):
  print(argument)
  print(global_variable)
  var temporary_variable = 2
  print(temporary_variable)
  if true:
    var another_variable = 3
    print(another_variable)
    print(temporary_variable)
  print(another_variable) # Error: the identifier "another_variable" isn't declared in the current scope, since it is not declared in an lower indentation.

while

[edit | edit source]

while 關鍵字在其之後執行縮排的程式碼塊,直到它之後的 if 語句不再為真。如果它一開始為假,則不會執行。

var i = 0
while i < 50:
  print(i)
  i += 1

yield

[edit | edit source]

目前,yield 接受 2 個引數:一個物件和一個訊號名稱(作為字串)。呼叫它將等待,直到從該物件呼叫該訊號。

print(1)
# Creates a 1 second timer
yield(get_tree().create_timer(1), "timeout")
print(2)




華夏公益教科書