Теперь, когда вы уверенно работаете с классами, наследованием, сигналами и взаимодействием нод, пришло время перейти к тем вещам, которые делают опытный GDScript-разработчик сильнее: аннотации, корутины, лямбды, работа с ресурсами, типизация и механизм @tool. Эти инструменты значительно упрощают жизнь, ускоряют разработку и позволяют писать код, который приятно читать.
Здесь мы разберём всё максимально понятно, с примерами и пояснениями — так, чтобы даже сложные темы стали очевидными.

Аннотации (декораторы) — как «надстраивать» поведение
Аннотации — это специальные команды, которые меняют поведение переменных, функций или всего скрипта. Они всегда начинаются с @ и располагаются перед объявлением.
📢 Подписывайтесь на наш Telegram-канал.
Там вы найдете анонсы обучающих статей и видео, готовый код для ваших проектов и увлекательные курсы. Ничего лишнего — только практика, вдохновение и развитие.
Вот базовый пример:
@export var health := 100
Давайте разберём основные аннотации.
@export — показать переменную в редакторе
Если вы хотите управлять параметрами прямо в инспекторе — используйте @export.
@export var speed: float = 120.0
@export var title: String = "Slime"
Экспорт можно расширять:
@export_range(0, 500)— ограничение диапазона;@export_file— выбор файла;@export_color_no_alpha— цвет без прозрачности;@export_enum("Idle", "Walk", "Attack")— перечисление.
@onready — получить ноду, когда сцена готова
Если переменная должна существовать только после появления ноды в дереве сцены, используйте @onready:
@onready var sprite := $Sprite2D
Это самый правильный способ обращаться к дочерним нодам.
@tool — запуск кода прямо в редакторе
С ним ваш скрипт работает не только в игре, но и в редакторе. Это мощнейший инструмент.
Пример простейшего скрипта для предпросмотра вращения:
@tool
extends Node2D
func _process(delta):
rotation += 0.02
Где это полезно:
- генераторы уровней;
- автоматическое размещение объектов;
- валидация значений;
- создание пользовательских инструментов для редактора.
@rpc — для сетевой синхронизации
Если вы делаете мультиплеер, аннотация @rpc помогает синхронизировать действия:
@rpc
func sync_position(pos: Vector2):
position = pos
Механика RPC — это тема на отдельную статью, но главное — Godot сам обрабатывает сетевые вызовы.
Корутины — выполнение кода «по шагам»
Корутины позволяют временно приостанавливать выполнение функции. Это очень полезно, когда нужно выполнить действия последовательно, но не блокировать игру.
await — современный и удобный способ
Вы можете «подождать» события:
func open_door():
animation_player.play("Open")
await animation_player.animation_finished
print("Дверь открыта!")
Блок await останавливает функцию, пока событие не произойдёт.
Где это незаменимо
- кат-сцены;
- анимации;
- ожидание загрузки ресурсов;
- задержки в поведении AI;
- последовательности действий UI.
yield — старый способ (до Godot 4)
В новых проектах лучше не использовать:
yield(animation_player, "animation_finished")
Лямбда-функции — компактные действия «на лету»
Лямбды позволяют объявлять маленькие функции прямо внутри выражений. Это чистый плюс к читаемости.
Пример с массивами:
var result = [1, 2, 3].map(func(n): return n * 2)
Передача функции как аргумента:
func apply_twice(value, func_ref):
return func_ref(func_ref(value))
print(apply_twice(3, func(n): return n + 1))
Где полезны лямбды:
- map, filter, reduce;
- обработчики сигналов;
- временные вычисления;
- когда не хочется создавать отдельную функцию ради строки кода.
Ресурсы (Resource): данные вне сцены
Resource — объект, который существует без сцены. Он идеально подходит для хранения:
- предметов;
- настроек;
- параметров врагов;
- описаний диалогов;
- конфигураций оружия.
Пример собственного ресурса:
class_name ItemData
extends Resource
@export var title: String
@export var damage: int
@export var description: String
Теперь это можно сохранять в .tres файл и использовать по всему проекту.
Типизация — стабильность и чистота кода
Типизация помогает избежать ошибок и ускоряет выполнение. Рассмотрим простой пример:
var speed: float = 120
var name: String = "Slime"
func get_damage() -> int:
return 10
Если вы попытаетесь присвоить переменной другого типа значение — редактор предупредит.
Когда обязательно использовать типизацию
- в базовых классах (например, CharacterBase);
- в коде, который работает каждый кадр;
- в системах AI;
- в больших проектах для контроля структуры.
@tool — написание собственных редакторских инструментов
@tool превращает скрипт в инструмент внутри редактора. Это революционная вещь, хотя многие новичками её недооценивают.
Вот простой инструмент, который показывает пример «живого объекта» в редакторе:
@tool
extends Sprite2D
func _process(delta):
rotation += 0.01
Применение @tool
- автоматическое размещение платформ;
- построение дорог, рек, тайлов;
- генерация уровней;
- создание предпросмотра оружия или способностей;
- редактор диалогов;
- процедурное размещение декораций.
Итоги статьи
Теперь вы знаете ключевые продвинутые функции GDScript и умеете применять их в реальных задачах. Мы разобрали:
- аннотации: @export, @tool, @onready, @rpc;
- корутины через await — лучший способ управлять последовательностями;
- лямбда-функции — компактные функции внутри выражений;
- ресурсы Resource — удобный формат хранения данных;
- типизацию — важный инструмент для чистоты проекта;
- создание редакторских инструментов для ускорения разработки.
26.11.2025
0
8
Комментарии
0