Настройки в инспекторе: @export
@export превращает переменную скрипта в настройку, которую видно и можно крутить прямо в редакторе.
Суть: пиши @export перед переменной — и она появится в инспекторе, чтобы менять её мышкой без захода в код.
Допустим, у врага есть скорость, здоровье и урон. Можно зашить их числами прямо в код, но тогда, чтобы сделать второго врага чуть быстрее, придётся копировать скрипт и править цифры. Неудобно. Аннотация @export решает это: помеченная ею переменная появляется в инспекторе — панели настроек узла. Теперь у тебя один скрипт врага, а скорость и здоровье каждого экземпляра ты крутишь мышкой.
extends CharacterBody2D
@export var speed: float = 150.0
@export var max_health: int = 100
@export var enemy_name: String = "Гоблин"
@export var is_boss: bool = false
func _ready() -> void:
print(enemy_name, " со скоростью ", speed)Это огромный шаг к гибкости. Дизайнер уровня (даже если это ты) может настраивать баланс игры, вообще не открывая код: сделать одного гоблина медленным, другого — быстрым боссом с большим здоровьем. @export умеет выносить не только числа и текст, но и ссылки на другие узлы, картинки, звуки и даже целые сцены.
Особенно ярко польза @export видна в командной работе, но пригодится она и тебе одному. Представь, что ты неделю спустя вернулся к игре и хочешь сделать врагов чуть слабее. Без @export пришлось бы лезть в код, искать нужные числа среди строк логики и бояться что-нибудь сломать. С @export ты открываешь сцену, выделяешь врага и крутишь ползунки в инспекторе, вообще не касаясь кода. Настройки баланса отделены от логики поведения — а это один из главных принципов чистого устройства игры: данные отдельно, поведение отдельно.
Как работает под капотом
Когда движок загружает скрипт, он замечает аннотации @export и регистрирует эти переменные как редактируемые свойства узла. Значение, выставленное в инспекторе, сохраняется прямо в файле сцены. При запуске игры движок подставляет сохранённое значение в переменную ещё до _ready. То есть @export — это мостик между визуальным редактором и твоим кодом.
Идея «настройки отдельно от кода» легко моделируется на Python через словарь конфигурации. Один и тот же класс врага получает разные настройки.
class Enemy:
def __init__(self, config):
self.speed = config["speed"]
self.max_health = config["max_health"]
self.name = config["name"]
def describe(self):
return f"{self.name}: скорость {self.speed}, HP {self.max_health}"
# Один класс, разные "@export"-настройки
goblin = Enemy({"speed": 150, "max_health": 30, "name": "Гоблин"})
boss = Enemy({"speed": 80, "max_health": 500, "name": "Босс"})
print(goblin.describe())
print(boss.describe())Та же логика на Python ▶. Класс один, но поведение настраивается снаружи. В Godot роль этого словаря играет инспектор, а роль ключей — переменные с @export.
Полезно понимать и обратную сторону удобства: чем больше настроек ты выносишь наружу, тем важнее давать им осмысленные значения по умолчанию. Узел, перетащенный на сцену, должен сразу работать разумно, даже если дизайнер ничего не покрутил. Поэтому хорошее значение по умолчанию — это не формальность, а забота о том, кто будет пользоваться твоим узлом (часто это ты сам через месяц). Ставь дефолты, которые дают рабочее, среднее поведение: не нулевую скорость, не бесконечное здоровье, а нормальные игровые числа, от которых удобно отталкиваться при настройке.
Частые ошибки
Частая ошибка — менять значение @export-переменной из кода в _ready и удивляться, что инспектор «не работает»: код перезаписывает то, что ты выставил мышкой. Если переменная управляется инспектором, не присваивай ей значение в _ready. Вторая ошибка — забыть указать тип: @export var speed без типа работает хуже, движок не всегда понимает, какое поле показать. Третья — выносить в @export то, что вообще не нужно настраивать: инспектор замусоривается. Экспортируй только настоящие настройки баланса.
Best practices
Выноси в @export параметры баланса: скорость, урон, здоровье, время перезарядки. Всегда указывай тип и разумное значение по умолчанию — так узел сразу работает. Группируй и называй переменные понятно, чтобы в инспекторе было ясно, что крутишь. Через @export удобно подключать ссылки на узлы (например, цель для врага) — это чище, чем искать узлы по пути в коде.
Итоги: @export выносит переменную в инспектор, и её можно настраивать мышкой без правки кода. Значение хранится в сцене и подставляется до _ready. Экспортируй параметры баланса с типом и значением по умолчанию, не перезаписывай их в коде и не засоряй инспектор лишним.