Первый скрипт: переменные и функции
GDScript — это язык Godot, и он почти как Python: отступы вместо скобок, var для переменных, func для функций.
Суть: скрипт — это файл с правилами поведения, который вешается на узел и оживляет его.
Сам по себе узел статичен: Sprite2D просто стоит и показывает картинку. Чтобы он начал двигаться, реагировать на клавиши, считать очки — к нему прикрепляют скрипт. Скрипт пишут на GDScript, родном языке движка. Хорошая новость: GDScript специально сделали похожим на Python, поэтому если ты хоть немного видел Python, ты уже наполовину знаешь GDScript. Блоки кода задаются отступами, а не фигурными скобками; переменные объявляют словом var; функции — словом func.
Каждый скрипт начинается со строки extends — она говорит, от какого узла наследуется скрипт. Если ты пишешь поведение персонажа, в начале будет extends CharacterBody2D. Это значит «мой скрипт — это CharacterBody2D, плюс вот эти мои правила сверху».
extends Sprite2D
var speed: float = 200.0
var player_name: String = "Чик"
func _ready() -> void:
print("Привет, я ", player_name)
print("Моя скорость: ", speed)
func greet(target: String) -> String:
return "Привет, " + target + "!"Заметь -> void и -> String — это типы того, что функция возвращает. void значит «ничего не возвращает», String — «возвращает строку». Указывать типы необязательно, но это хороший тон: движок ловит ошибки заранее и подсказывает в редакторе.
Важно понять разделение ролей. Узел — это то, что движок умеет делать сам: рисовать картинку, играть звук, считать физику. Скрипт — это твои добавочные правила поверх узла. Когда ты пишешь extends CharacterBody2D, ты как бы говоришь: «возьми всё, что умеет персонаж, и добавь сверху вот эту мою логику». Скрипт не заменяет узел, а расширяет его. Поэтому в одном проекте уживаются узлы вообще без скриптов (например, простой фон) и узлы с богатой логикой (персонаж, враг, меню). Сам выбираешь, что оставить движку, а что описать кодом.
Как работает под капотом
Когда узел появляется в игре, движок ищет прикреплённый скрипт и исполняет его. Сначала создаются переменные верхнего уровня, потом, когда узел готов, движок зовёт твою функцию _ready(). Дальше каждый кадр он может звать _process(). Ты не вызываешь эти функции сам — их вызывает движок в нужный момент. Это называется «движок управляет потоком, а ты подключаешься в точках».
GDScript так похож на Python, что почти любой алгоритм можно сначала проверить на Python, а потом перенести. Вот функция приветствия и подсчёт — синтаксис практически совпадает.
speed = 200.0
player_name = "Чик"
def greet(target):
return "Привет, " + target + "!"
print(greet(player_name))
print("Скорость:", speed)
# Небольшой расчёт: путь за 3 секунды
distance = speed * 3
print("За 3 секунды пройдёт", distance, "пикселей")Та же логика на Python ▶. Сравни с GDScript-блоком выше: var speed = 200.0 против speed = 200.0, func greet против def greet. Различия минимальны, поэтому Python — отличный тренажёр для логики будущей игры.
Полезно сразу завести привычку читать сообщения об ошибках, а не пугаться их. Когда движок ругается на скрипт, он почти всегда пишет номер строки и причину: пропущено двоеточие, неизвестное имя переменной, неверный отступ. Это не наказание, а подсказка, где именно споткнулся компьютер. Опытные разработчики не пишут код без ошибок — они просто быстро их читают и исправляют. Поэтому не бойся красных строк внизу редактора: открой указанную строку, перечитай её внимательно, и в девяти случаях из десяти ошибка окажется простой опечаткой.
Частые ошибки
Самая частая ошибка новичка в GDScript (как и в Python) — сбитые отступы. Тело функции должно быть с отступом ровно в один уровень, иначе движок не поймёт, где функция начинается и кончается. Вторая ошибка — забыть двоеточие в конце строки с func, if или for: оно обязательно. Третья — путать = и ==: одно равно присваивает, два равно сравнивают. И не забывай extends в первой строке — без него скрипт не знает, к какому узлу он относится.
Best practices
Указывай типы переменных и возвращаемых значений (var speed: float, func greet() -> String) — движок будет ловить ошибки заранее. Давай переменным и функциям понятные имена: speed, player_name, take_damage, а не s, pn, td. Держи функции короткими: одна функция — одно дело. И пиши комментарии через знак решётки там, где логика неочевидна, — будущий ты скажет спасибо.
Итоги: скрипт на GDScript оживляет узел. Язык почти как Python: отступы, var, func, двоеточия. Первая строка — extends, она задаёт базовый узел. Функции _ready и _process зовёт движок, а не ты. Указание типов и понятные имена делают код надёжнее и читабельнее.