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

Здесь мы разберём всё максимально понятно, с примерами и пояснениями — так, чтобы даже сложные темы стали очевидными.

Chatgpt image 26 нояб. 2025 г., 19 46 46

Аннотации (декораторы) — как «надстраивать» поведение

Аннотации — это специальные команды, которые меняют поведение переменных, функций или всего скрипта. Они всегда начинаются с @ и располагаются перед объявлением.

📢 Подписывайтесь на наш Telegram-канал.

Там вы найдете анонсы обучающих статей и видео, готовый код для ваших проектов и увлекательные курсы. Ничего лишнего — только практика, вдохновение и развитие.

👉 https://t.me/codelab_channel

Вот базовый пример:

@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 файл и использовать по всему проекту.

Ресурсы — один из самых мощных способов организовать данные в Godot.

Типизация — стабильность и чистота кода

Типизация помогает избежать ошибок и ускоряет выполнение. Рассмотрим простой пример:

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

  • автоматическое размещение платформ;
  • построение дорог, рек, тайлов;
  • генерация уровней;
  • создание предпросмотра оружия или способностей;
  • редактор диалогов;
  • процедурное размещение декораций.

Если проект растёт, вам почти обязательно придётся написать хотя бы один инструмент @tool, чтобы ускорить работу.

Итоги статьи

Теперь вы знаете ключевые продвинутые функции GDScript и умеете применять их в реальных задачах. Мы разобрали:

  • аннотации: @export, @tool, @onready, @rpc;
  • корутины через await — лучший способ управлять последовательностями;
  • лямбда-функции — компактные функции внутри выражений;
  • ресурсы Resource — удобный формат хранения данных;
  • типизацию — важный инструмент для чистоты проекта;
  • создание редакторских инструментов для ускорения разработки.

Комментарии

0

Без регистрации и смс