Menu
CoddyTech

Cheat sheet GDScript

Cập nhật lần cuối

Cơ bản và in kết quả

Một script kế thừa một kiểu node, và Godot tự gọi các hàm của nó cho bạn.

Thao tácCú pháp
Gắn script vào một kiểu nodeextends Node
Code chạy khi node bắt đầufunc _ready() -> void: print("Hello, World!")
In giá trị không có ký tự phân cáchprint("HP: ", hp)
In giá trị cách nhau bằng dấu cáchprints("a", "b", 3)
Chú thích# This is a comment
Chú thích tài liệu## Shown in the editor's help
Chuỗi nhiều dòngvar text := """Line one Line two"""
Báo lỗipush_error("Health is negative")
Báo cảnh báopush_warning("Old save file")

Biến, hằng số và kiểu dữ liệu

Kiểu là tùy chọn. Thêm kiểu để editor kiểm tra lỗi, gợi ý code tốt hơn và code chạy nhanh hơn.

Thao tácCú pháp
Biến (kiểu động)var score = 0
Biến có kiểu tĩnhvar speed: float = 200.0
Tự suy ra kiểu tĩnhvar lives := 3
Hằng sốconst MAX_HP = 100
Enumenum State { IDLE, RUN, JUMP }
Dùng một giá trị enumvar state: State = State.IDLE
Giá trị vector và màuvar pos := Vector2(10, 20) var tint := Color(1, 0, 0)
Tham chiếu đối tượng rỗngvar target: Node = null
Chuyển sang chuỗi, int hoặc floatstr(42), int("42"), float("3.5")
Float sang int (bỏ phần thập phân)int(3.9) # 3
Kiểm tra kiểuvalue is int, node is Sprite2D
Ép kiểuvar sprite := node as Sprite2D

Toán tử

Các phép toán quen thuộc, cộng thêm từ tiếng Anh cho phép logic.

Thao tácCú pháp
Cộng, trừ, nhân, chiaa + b, a - b, a * b, a / b
Chia lấy phần nguyên (int / int)7 / 2 # 3
Phép chia lấy dư7 % 3, fmod(7.5, 2.0)
Lũy thừa2 ** 10 # 1024
Gán kết hợpx += 1, x -= 1, x *= 2, x /= 2
So sánh==, !=, <, >, <=, >=
Logica and b, a or b, not a
Logic (dạng ký hiệu)a && b, a || b, !a
If trên một dòngvar label := "win" if score > 10 else "lose"
Kiểm tra có nằm trong collection"sword" in inventory
Thao tác bita & b, a | b, a ^ b, ~a, a << 1, a >> 1

Luồng điều khiển

Khối lệnh được xác định bằng thụt lề, giống Python. Mặc định Godot thụt lề bằng tab.

Thao tácCú pháp
If, elif, elseif hp <= 0: die() elif hp < 20: print("Low HP") else: print("OK")
If trên một dòngif hp <= 0: die()
Lặp qua một khoảngfor i in range(5): print(i) # 0 to 4
Khoảng có điểm đầu, điểm cuối và bước nhảyfor i in range(10, 0, -2): print(i) # 10, 8, 6, 4, 2
Lặp lại n lầnfor i in 3: print(i) # 0, 1, 2
Lặp qua một mảngfor item in items: print(item)
Biến lặp có kiểu (Godot 4.2+)for n: String in names: print(n.to_upper())
Vòng lặp whilewhile hp > 0: hp -= 10
Thoát hoặc bỏ qua một lần lặpbreak, continue
Giữ chỗ cho khối lệnh rỗngpass

So khớp mẫu (match)

match chạy nhánh đầu tiên có mẫu khớp. Không có chuyện rơi xuống nhánh tiếp theo.

Thao tácCú pháp
So khớp giá trịmatch state: State.IDLE: print("idle") State.RUN: print("run")
Nhiều giá trị trong một nhánhmatch key: "w", "up": move_up()
Nhánh mặc định (ký tự đại diện)match n: 0: print("zero") _: print("other")
Gán giá trị cho một tênmatch cmd: "quit": get_tree().quit() var other: print("Unknown: ", other)
Mẫu mảngmatch pos: [0, 0]: print("origin") [var x, 0]: print("on the x axis at ", x)
Mảng với phần đuôi bất kỳmatch args: ["move", ..]: print("move command")
Mẫu dictionarymatch item: {"type": "coin", "value": var v}: gold += v
Điều kiện phụ với when (Godot 4.4+)match score: var s when s >= 90: print("A") var s when s >= 75: print("B") _: print("C")

Hàm và lambda

Hàm cũng là giá trị: bạn có thể lưu, truyền đi và gắn sẵn đối số cho chúng.

Thao tácCú pháp
Tham số và giá trị trả về có kiểufunc add(a: int, b: int) -> int: return a + b
Không có giá trị trả vềfunc reset() -> void: score = 0
Đối số mặc địnhfunc greet(who := "player") -> void: print("Hi, ", who)
Hàm staticstatic func double(x: int) -> int: return x * 2
Lambda một dòngvar square := func(x): return x * x
Gọi một Callablesquare.call(4) # 16
Dùng hàm như một giá trịvar on_done := reset on_done.call()
Gắn sẵn đối sốvar add_ten := add.bind(10) print(add_ten.call(5)) # 15
Lambda nhiều dòngvar greet_all := func(names: Array) -> void: for n in names: print("Hi, ", n)
Chờ một bộ hẹn giờawait get_tree().create_timer(1.0).timeout
Chờ một coroutinevar data = await fetch_data()

Chuỗi

Các phương thức chuỗi trả về chuỗi mới và không bao giờ thay đổi chuỗi gốc.

Thao tácCú pháp
Định dạng bằng %"%s has %d HP" % [name, hp]
Hai chữ số thập phân"%.2f" % 3.14159 # "3.14"
Định dạng bằng placeholder có tên"{a} vs {b}".format({"a": 1, "b": 2})
Nối bằng +"Score: " + str(score)
Độ dàitext.length()
Chữ hoa hoặc chữ thườngtext.to_upper(), text.to_lower()
Tách thành nhiều phần"a,b,c".split(",") # ["a", "b", "c"]
Ghép các phần", ".join(["a", "b", "c"])
Xóa khoảng trắng hai đầu" hi ".strip_edges() # "hi"
Thay thế văn bảntext.replace("cat", "dog")
Tìm vị trítext.find("lo") # -1 if missing
Bắt đầu hoặc kết thúc bằngtext.begins_with("Hi"), text.ends_with("!")
Chuỗi context.substr(0, 5)
Kiểm tra có chứa"ell" in "Hello" # true

Mảng

Mảng có thể dài ra hoặc ngắn lại. Mảng có kiểu chỉ nhận phần tử đúng kiểu đó.

Thao tácCú pháp
Tạo mảng bằng literal (nhiều kiểu)var items = [1, "two", 3.0]
Mảng có kiểuvar scores: Array[int] = [10, 20, 30]
Đọc theo chỉ số (số âm đếm từ cuối)scores[0], scores[-1]
Thêm vào cuốiscores.append(40), scores.push_back(40)
Chèn tại một chỉ sốscores.insert(0, 5)
Xóa và trả về phần tử cuốivar last = scores.pop_back()
Xóa theo giá trị hoặc theo chỉ sốscores.erase(20), scores.remove_at(0)
Kiểm tra có chứa, tìm chỉ sốscores.has(30), scores.find(30)
Độ dài, kiểm tra rỗngscores.size(), scores.is_empty()
Sắp xếpscores.sort()
Sắp xếp theo quy tắc riêngenemies.sort_custom(func(a, b): return a.hp < b.hp)
Ánh xạ (map)scores.map(func(x): return x * 2)
Lọc (filter)scores.filter(func(x): return x > 15)
Gộp (reduce)scores.reduce(func(acc, x): return acc + x, 0)
Cắt mảng (không gồm vị trí cuối)scores.slice(1, 3)

Dictionary

Các cặp khóa và giá trị. Khóa có thể thuộc bất kỳ kiểu nào; phổ biến nhất là chuỗi.

Thao tácCú pháp
Tạo dictionary bằng literalvar stats = {"hp": 100, "mp": 30}
Dictionary có kiểu (Godot 4.4+)var prices: Dictionary[String, int] = {"sword": 50}
Đọc hoặc ghi một khóastats["hp"], stats["xp"] = 50
Đọc với giá trị mặc địnhstats.get("luck", 0)
Kiểm tra có khóastats.has("hp"), "hp" in stats
Xóa một khóastats.erase("mp")
Các khóa và các giá trịstats.keys(), stats.values()
Số phần tửstats.size()
Gộp dictionary khác (true để ghi đè)stats.merge({"luck": 5}), stats.merge(bonus, true)
Lặp qua các khóafor key in stats: print(key, " = ", stats[key])

Lớp và annotation

Mỗi script là một lớp. Annotation bắt đầu bằng @.

Thao tácCú pháp
Đặt tên toàn cục cho lớpclass_name Player extends CharacterBody2D
Hàm khởi tạofunc _init(start_hp := 100) -> void: hp = start_hp
Tạo instancevar p := Player.new()
Lớp lồng bên trongclass Item: var name := "" var price := 0
Gọi phiên bản của lớp cha cho phương thức nàyfunc _ready() -> void: super() print("child ready")
Gọi phương thức khác của lớp chasuper.take_damage(10)
Biến static (Godot 4.1+)static var count := 0
Hiện trong Inspector@export var speed := 300.0
Hiện với thanh trượt có khoảng giá trị@export_range(0, 100) var volume := 50
Lấy node con khi sẵn sàng@onready var sprite: Sprite2D = $Sprite2D
Setter và gettervar hp := 100: set(value): hp = clampi(value, 0, 100) get: return hp
Chạy script trong editor@tool

Signal

Signal là first-class: khai báo rồi emit, kết nối và chờ chúng trực tiếp.

Thao tácCú pháp
Khai báo signalsignal died
Signal có đối số kèm kiểusignal health_changed(old_hp: int, new_hp: int)
Phát signaldied.emit()
Phát kèm đối sốhealth_changed.emit(100, 80)
Kết nối tới một phương thứcplayer.died.connect(_on_player_died)
Kết nối một lambdabutton.pressed.connect(func(): print("Clicked"))
Truyền thêm đối sốbutton.pressed.connect(_on_pressed.bind("start"))
Chỉ kích hoạt một lầntimer.timeout.connect(_on_timeout, CONNECT_ONE_SHOT)
Ngắt kết nốiplayer.died.disconnect(_on_player_died)
Kiểm tra kết nốiplayer.died.is_connected(_on_player_died)
Chờ một signalawait player.died

Node và vòng đời

Các callback Godot gọi trên node của bạn, và các lời gọi bạn thực hiện trên cây scene.

Thao tácCú pháp
Đối tượng được tạo (trước khi vào cây)func _init() -> void: print("created")
Node và các node con đã sẵn sàngfunc _ready() -> void: print("ready")
Mỗi khung hìnhfunc _process(delta: float) -> void: position.x += 100.0 * delta
Mỗi nhịp vật lýfunc _physics_process(delta: float) -> void: velocity.y += 980.0 * delta move_and_slide()
Đầu vào mà UI không dùng tớifunc _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("jump"): jump()
Lấy node theo đường dẫnget_node("Sprite2D"), $Sprite2D
Đường dẫn có dấu cách, tên duy nhất$"UI/Health Bar", %HealthBar
Kiểm tra một input actionInput.is_action_pressed("move_right")
Tạo instance của một scenevar enemy := preload("res://enemy.tscn").instantiate() add_child(enemy)
Xóa node an toànqueue_free()
Node cha và các node conget_parent(), get_children()
Chuyển sceneget_tree().change_scene_to_file("res://main.tscn")

Cú pháp GDScript mà bạn cần khi làm game với Godot, gom trong một trang. Cheat sheet GDScript này là bảng tra cứu nhanh cho Godot 4: biến và kiểu tĩnh, toán tử, luồng điều khiển và match, hàm và lambda, chuỗi, mảng và dictionary, lớp, signal, cùng các callback của node mà Godot gọi mỗi khung hình.

Mọi thứ ở đây đều là cú pháp Godot 4, nên bạn sẽ thấy @export, @onready, died.emit() và await thay vì các dạng của Godot 3. Sao chép phần bạn cần vào script, hoặc chạy thử các đoạn code ngay trong playground GDScript: đặt chúng vào trong _ready() và chạy trên trình duyệt, không cần cài Godot.

Câu hỏi thường gặp về cheat sheet GDScript

Cheat sheet GDScript này có miễn phí không?

Có. Cheat sheet GDScript này hoàn toàn miễn phí, không cần đăng ký. Lưu trang lại và quay lại bất cứ khi nào bạn cần đúng cú pháp của một signal, một mẫu match hay một phương thức mảng.

Cheat sheet này dành cho Godot 4 hay Godot 3?
Godot 4. Hai phiên bản khác nhau ở những điểm khiến code sao chép bị lỗi: Godot 4 dùng annotation @export và @onready thay cho từ khóa export và onready, died.emit() và died.connect(callable) thay cho emit_signal("died") và connect dựa trên chuỗi, await thay cho yield, và super() thay cho .method(). Các hàng ghi 4.1+, 4.2+ hoặc 4.4+ cần Godot từ phiên bản đó trở lên.
= và := trong GDScript khác nhau thế nào?
var x = 5 tạo một biến động, sau này có thể chứa bất kỳ kiểu nào. var x := 5 suy ra kiểu từ giá trị (ở đây là int) và cố định kiểu đó, nên gán một chuỗi về sau sẽ báo lỗi. var x: int = 5 khai báo kiểu một cách tường minh. Kiểu tĩnh giúp editor báo lỗi sớm, gợi ý code tốt hơn và code chạy nhanh hơn.
Signal trong GDScript hoạt động thế nào?
Khai báo signal bằng signal died, phát nó bằng died.emit(), và phản hồi từ một node khác bằng player.died.connect(_on_player_died). Bạn có thể kết nối một lambda thay cho phương thức, gắn thêm đối số bằng .bind(), hoặc tạm dừng một hàm cho đến khi signal được phát bằng await player.died.
GDScript có giống Python không?
Nhìn thì khá giống: khối lệnh được xác định bằng thụt lề, và GDScript dùng for ... in, if/elif/else cùng các từ tiếng Anh như and, or và not. Nhưng GDScript là một ngôn ngữ riêng, được tạo ra cho Godot. Nó có kiểu tĩnh tùy chọn, signal, annotation như @export, và truy cập trực tiếp node bằng $.
Có thể luyện tập GDScript online không?
Có. Mở playground GDScript để chạy các đoạn code trong cheat sheet này ngay trên trình duyệt: playground gắn script của bạn vào một node, nên code bên trong _ready() chạy một lần. Khi muốn học có lộ trình, khóa học GDScript tương tác miễn phí của Coddy đưa bạn đi từng bước từ biến và hàm đến lớp và signal.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học GDScript cùng Coddy

Bắt đầu