Шпаргалка по GDScript
Последнее обновление
Основы и вывод
Скрипт расширяет тип узла, а Godot сам вызывает его функции.
| Операция | Синтаксис |
|---|---|
| Привязать скрипт к типу узла | extends Node |
| Код, который выполняется при запуске узла | func _ready() -> void:
print("Hello, World!") |
| Вывести значения без разделителя | print("HP: ", hp) |
| Вывести значения через пробел | prints("a", "b", 3) |
| Комментарий | # This is a comment |
| Документирующий комментарий | ## Shown in the editor's help |
| Многострочная строка | var text := """Line one
Line two""" |
| Сообщить об ошибке | push_error("Health is negative") |
| Вывести предупреждение | push_warning("Old save file") |
Переменные, константы и типы
Типы необязательны. Добавляйте их ради проверок в редакторе, автодополнения и более быстрого кода.
| Операция | Синтаксис |
|---|---|
| Переменная (динамический тип) | var score = 0 |
| Переменная со статическим типом | var speed: float = 200.0 |
| Вывести статический тип автоматически | var lives := 3 |
| Константа | const MAX_HP = 100 |
| Перечисление (enum) | enum State { IDLE, RUN, JUMP } |
| Использовать значение enum | var state: State = State.IDLE |
| Векторы и цвета | var pos := Vector2(10, 20)
var tint := Color(1, 0, 0) |
| Пустая ссылка на объект | var target: Node = null |
| Преобразовать в строку, int или float | str(42), int("42"), float("3.5") |
| Из float в int (дробная часть отбрасывается) | int(3.9) # 3 |
| Проверить тип | value is int, node is Sprite2D |
| Привести к типу | var sprite := node as Sprite2D |
Операторы
Привычная арифметика и английские слова для логики.
| Операция | Синтаксис |
|---|---|
| Сложение, вычитание, умножение, деление | a + b, a - b, a * b, a / b |
| Целочисленное деление (int / int) | 7 / 2 # 3 |
| Остаток от деления | 7 % 3, fmod(7.5, 2.0) |
| Возведение в степень | 2 ** 10 # 1024 |
| Составное присваивание | x += 1, x -= 1, x *= 2, x /= 2 |
| Сравнение | ==, !=, <, >, <=, >= |
| Логические операторы | a and b, a or b, not a |
| Логические операторы (символами) | a && b, a || b, !a |
| Тернарный if | var label := "win" if score > 10 else "lose" |
| Есть ли элемент в коллекции | "sword" in inventory |
| Побитовые операторы | a & b, a | b, a ^ b, ~a, a << 1, a >> 1 |
Управление потоком
Блоки задаются отступами, как в Python. По умолчанию Godot делает отступы табуляцией.
| Операция | Синтаксис |
|---|---|
| If, elif, else | if hp <= 0:
die()
elif hp < 20:
print("Low HP")
else:
print("OK") |
| If в одну строку | if hp <= 0: die() |
| Цикл по диапазону | for i in range(5):
print(i) # 0 to 4 |
| Диапазон с началом, концом и шагом | for i in range(10, 0, -2):
print(i) # 10, 8, 6, 4, 2 |
| Повторить n раз | for i in 3:
print(i) # 0, 1, 2 |
| Цикл по массиву | for item in items:
print(item) |
| Типизированная переменная цикла (Godot 4.2+) | for n: String in names:
print(n.to_upper()) |
| Цикл while | while hp > 0:
hp -= 10 |
| Выйти из цикла или пропустить шаг | break, continue |
| Заглушка для пустого блока | pass |
Сопоставление с образцом (match)
match выполняет первую ветку, чей образец подходит. Проваливания в следующую ветку нет.
| Операция | Синтаксис |
|---|---|
| Сопоставить значения | match state:
State.IDLE:
print("idle")
State.RUN:
print("run") |
| Несколько значений в одной ветке | match key:
"w", "up":
move_up() |
| Ветка по умолчанию (подстановочный знак) | match n:
0:
print("zero")
_:
print("other") |
| Связать значение с именем | match cmd:
"quit":
get_tree().quit()
var other:
print("Unknown: ", other) |
| Образец массива | match pos:
[0, 0]:
print("origin")
[var x, 0]:
print("on the x axis at ", x) |
| Массив с любым хвостом | match args:
["move", ..]:
print("move command") |
| Образец словаря | match item:
{"type": "coin", "value": var v}:
gold += v |
| Условие when (Godot 4.4+) | match score:
var s when s >= 90:
print("A")
var s when s >= 75:
print("B")
_:
print("C") |
Функции и лямбды
Функции тоже значения: их можно хранить, передавать и привязывать к ним аргументы.
| Операция | Синтаксис |
|---|---|
| Типизированные параметры и возвращаемое значение | func add(a: int, b: int) -> int:
return a + b |
| Без возвращаемого значения | func reset() -> void:
score = 0 |
| Аргумент по умолчанию | func greet(who := "player") -> void:
print("Hi, ", who) |
| Статическая функция | static func double(x: int) -> int:
return x * 2 |
| Лямбда в одну строку | var square := func(x): return x * x |
| Вызвать Callable | square.call(4) # 16 |
| Функция как значение | var on_done := reset
on_done.call() |
| Привязать аргументы | var add_ten := add.bind(10)
print(add_ten.call(5)) # 15 |
| Многострочная лямбда | var greet_all := func(names: Array) -> void:
for n in names:
print("Hi, ", n) |
| Дождаться таймера | await get_tree().create_timer(1.0).timeout |
| Дождаться корутины | var data = await fetch_data() |
Строки
Методы строк возвращают новую строку и никогда не меняют исходную.
| Операция | Синтаксис |
|---|---|
| Форматирование через % | "%s has %d HP" % [name, hp] |
| Два знака после запятой | "%.2f" % 3.14159 # "3.14" |
| Форматирование с именованными подстановками | "{a} vs {b}".format({"a": 1, "b": 2}) |
| Склеить через + | "Score: " + str(score) |
| Длина | text.length() |
| Верхний или нижний регистр | text.to_upper(), text.to_lower() |
| Разбить на части | "a,b,c".split(",") # ["a", "b", "c"] |
| Склеить части | ", ".join(["a", "b", "c"]) |
| Убрать пробелы по краям | " hi ".strip_edges() # "hi" |
| Заменить текст | text.replace("cat", "dog") |
| Найти позицию | text.find("lo") # -1 if missing |
| Начинается или заканчивается на | text.begins_with("Hi"), text.ends_with("!") |
| Подстрока | text.substr(0, 5) |
| Содержит | "ell" in "Hello" # true |
Массивы
Массивы растут и сжимаются. Типизированный массив принимает только элементы своего типа.
| Операция | Синтаксис |
|---|---|
| Литерал массива (разные типы) | var items = [1, "two", 3.0] |
| Типизированный массив | var scores: Array[int] = [10, 20, 30] |
| Чтение по индексу (отрицательный считается с конца) | scores[0], scores[-1] |
| Добавить в конец | scores.append(40), scores.push_back(40) |
| Вставить по индексу | scores.insert(0, 5) |
| Удалить и вернуть последний | var last = scores.pop_back() |
| Удалить по значению или по индексу | scores.erase(20), scores.remove_at(0) |
| Наличие элемента, индекс элемента | scores.has(30), scores.find(30) |
| Длина, проверка на пустоту | scores.size(), scores.is_empty() |
| Сортировка | scores.sort() |
| Сортировка по своему правилу | enemies.sort_custom(func(a, b): return a.hp < b.hp) |
| Map | scores.map(func(x): return x * 2) |
| Filter | scores.filter(func(x): return x > 15) |
| Reduce | scores.reduce(func(acc, x): return acc + x, 0) |
| Срез (конец не включается) | scores.slice(1, 3) |
Словари
Пары ключ и значение. Ключи могут быть любого типа, чаще всего это строки.
| Операция | Синтаксис |
|---|---|
| Литерал словаря | var stats = {"hp": 100, "mp": 30} |
| Типизированный словарь (Godot 4.4+) | var prices: Dictionary[String, int] = {"sword": 50} |
| Прочитать или записать ключ | stats["hp"], stats["xp"] = 50 |
| Прочитать со значением по умолчанию | stats.get("luck", 0) |
| Есть ли ключ | stats.has("hp"), "hp" in stats |
| Удалить ключ | stats.erase("mp") |
| Ключи и значения | stats.keys(), stats.values() |
| Количество записей | stats.size() |
| Слить с другим словарём (true перезаписывает) | stats.merge({"luck": 5}), stats.merge(bonus, true) |
| Цикл по ключам | for key in stats:
print(key, " = ", stats[key]) |
Классы и аннотации
Каждый скрипт является классом. Аннотации начинаются с @.
| Операция | Синтаксис |
|---|---|
| Дать классу глобальное имя | class_name Player
extends CharacterBody2D |
| Конструктор | func _init(start_hp := 100) -> void:
hp = start_hp |
| Создать экземпляр | var p := Player.new() |
| Вложенный класс | class Item:
var name := ""
var price := 0 |
| Вызвать родительскую версию этого метода | func _ready() -> void:
super()
print("child ready") |
| Вызвать другой метод родителя | super.take_damage(10) |
| Статическая переменная (Godot 4.1+) | static var count := 0 |
| Показать в инспекторе | @export var speed := 300.0 |
| Показать с ползунком и диапазоном | @export_range(0, 100) var volume := 50 |
| Получить дочерний узел, когда он готов | @onready var sprite: Sprite2D = $Sprite2D |
| Сеттер и геттер | var hp := 100:
set(value):
hp = clampi(value, 0, 100)
get:
return hp |
| Запускать скрипт в редакторе | @tool |
Сигналы
Сигналы здесь полноценные объекты: объявите их, а затем испускайте, подключайте и ждите напрямую.
| Операция | Синтаксис |
|---|---|
| Объявить сигнал | signal died |
| Сигнал с типизированными аргументами | signal health_changed(old_hp: int, new_hp: int) |
| Испустить | died.emit() |
| Испустить с аргументами | health_changed.emit(100, 80) |
| Подключить к методу | player.died.connect(_on_player_died) |
| Подключить лямбду | button.pressed.connect(func(): print("Clicked")) |
| Передать дополнительные аргументы | button.pressed.connect(_on_pressed.bind("start")) |
| Сработать только один раз | timer.timeout.connect(_on_timeout, CONNECT_ONE_SHOT) |
| Отключить | player.died.disconnect(_on_player_died) |
| Проверить подключение | player.died.is_connected(_on_player_died) |
| Дождаться сигнала | await player.died |
Узлы и жизненный цикл
Колбэки, которые Godot вызывает у вашего узла, и вызовы, которые вы делаете в дереве сцены.
| Операция | Синтаксис |
|---|---|
| Объект создан (ещё до попадания в дерево) | func _init() -> void:
print("created") |
| Узел и его дети готовы | func _ready() -> void:
print("ready") |
| Каждый кадр | func _process(delta: float) -> void:
position.x += 100.0 * delta |
| Каждый шаг физики | func _physics_process(delta: float) -> void:
velocity.y += 980.0 * delta
move_and_slide() |
| Ввод, который не обработал UI | func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("jump"):
jump() |
| Получить узел по пути | get_node("Sprite2D"), $Sprite2D |
| Путь с пробелами, уникальное имя | $"UI/Health Bar", %HealthBar |
| Проверить действие ввода | Input.is_action_pressed("move_right") |
| Создать экземпляр сцены | var enemy := preload("res://enemy.tscn").instantiate()
add_child(enemy) |
| Безопасно удалить узел | queue_free() |
| Родитель и дети | get_parent(), get_children() |
| Сменить сцену | get_tree().change_scene_to_file("res://main.tscn") |
Синтаксис GDScript, к которому вы обращаетесь, пока делаете игру на Godot, собран на одной странице. Эта шпаргалка по GDScript служит быстрым справочником по Godot 4: переменные и статические типы, операторы, управление потоком и match, функции и лямбды, строки, массивы и словари, классы, сигналы и колбэки узлов, которые Godot вызывает каждый кадр.
Всё здесь написано на синтаксисе Godot 4, поэтому вы увидите @export, @onready, died.emit() и await, а не формы из Godot 3. Копируйте нужное в свой скрипт или пробуйте фрагменты вживую в playground для GDScript: поместите их в _ready() и запустите прямо в браузере, без установки Godot.
Часто задаваемые вопросы по шпаргалке GDScript
Эта шпаргалка по GDScript бесплатная?
Эта шпаргалка для Godot 4 или для Godot 3?
@export и @onready вместо ключевых слов export и onready, died.emit() и died.connect(callable) вместо emit_signal("died") и connect со строками, await вместо yield и super() вместо .method(). Строки с пометками 4.1+, 4.2+ или 4.4+ требуют как минимум этой версии Godot.Чем = отличается от := в GDScript?
var x = 5 создаёт динамическую переменную, в которую потом можно записать значение любого типа. var x := 5 выводит тип из значения (здесь int) и фиксирует его, так что присвоить потом строку будет ошибкой. var x: int = 5 задаёт тип явно. Статические типы дают ошибки прямо в редакторе, лучшее автодополнение и более быстрый код.Как работают сигналы в GDScript?
signal died, отправьте его через died.emit() и реагируйте на него в другом узле через player.died.connect(_on_player_died). Вместо метода можно подключить лямбду, привязать дополнительные аргументы через .bind() или приостановить функцию до срабатывания сигнала через await player.died.GDScript похож на Python?
for ... in, if/elif/else и английские слова вроде and, or и not. Но GDScript это отдельный язык, созданный для Godot. В нём есть необязательные статические типы, сигналы, аннотации вроде @export и прямой доступ к узлам через $.Можно ли практиковаться в GDScript онлайн?
_ready() выполняется один раз. А если хочется системы, бесплатный интерактивный курс GDScript от Coddy шаг за шагом проведёт вас от переменных и функций до классов и сигналов.