Menu
CoddyTech

Шпаргалка по 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 }
Использовать значение enumvar state: State = State.IDLE
Векторы и цветаvar pos := Vector2(10, 20) var tint := Color(1, 0, 0)
Пустая ссылка на объектvar target: Node = null
Преобразовать в строку, int или floatstr(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
Тернарный ifvar 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, elseif 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())
Цикл whilewhile 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
Вызвать Callablesquare.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)
Mapscores.map(func(x): return x * 2)
Filterscores.filter(func(x): return x > 15)
Reducescores.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()
Ввод, который не обработал UIfunc _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 бесплатная?
Да. Шпаргалка по GDScript полностью бесплатна, регистрация не нужна. Добавьте её в закладки и возвращайтесь, когда понадобится точный синтаксис сигнала, образца match или метода массива.
Эта шпаргалка для Godot 4 или для Godot 3?
Для Godot 4. Версии различаются так, что скопированный код ломается: в Godot 4 используются аннотации @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 онлайн?
Да. Откройте playground для GDScript и запускайте фрагменты из этой шпаргалки в браузере: playground привязывает ваш скрипт к узлу, поэтому код внутри _ready() выполняется один раз. А если хочется системы, бесплатный интерактивный курс GDScript от Coddy шаг за шагом проведёт вас от переменных и функций до классов и сигналов.
Иллюстрация языков программирования Coddy

Изучайте GDScript с Coddy

НАЧАТЬ