# Язык программирования GDScript в Godot Engine. ![gds.png](gds.png) ### GDScript — это высокоуровневый, динамически типизированный (с поддержкой опциональной статической типизации) объектно-ориентированный язык программирования, созданный специально для игрового движка Godot Engine. Его синтаксис во многом вдохновлен Python, что делает код чистым, читаемым и лаконичным. В отличие от языков общего назначения, GDScript не существует отдельно от своего движка. Он разработан с одной целью: максимально быстро и удобно писать код для игр в экосистеме Godot. ## Плюсы и минусы GDScript (в современных реалиях). ### Плюсы: * Идеальная интеграция с движком: язык «из коробки» понимает архитектуру Godot. Работа с узлами (Nodes), сценами, векторами и сигналами (событиями) интуитивно понятна и требует минимум кода. * Мгновенная компиляция и быстрая итерация: код не нужно долго компилировать. Вы вносите изменения, нажимаете «Воспроизвести» и сразу видите результат. Это значительно ускоряет создание прототипов. * Низкий порог вхождения: благодаря синтаксису, похожему на синтаксис Python, язык очень прост в освоении. Отсутствие фигурных скобок и лишней «воды» (бойлерплейта) позволяет сосредоточиться на логике игры. * Опциональная статическая типизация (в GDScript 2.0): вы можете указывать типы переменных (например, var speed: float = 10.0). В наше время это огромный плюс: это ускоряет работу самого языка и позволяет автодополнению в редакторе работать безошибочно. * Встроенный редактор: код пишется прямо в Godot. Вам не нужно настраивать тяжелые внешние IDE вроде Visual Studio или Rider (хотя при желании можно использовать VS Code). ### Минусы: * Производительность вычислений: поскольку это интерпретируемый язык, сложные математические вычисления, генерация процедурных миров «на лету» или обработка десятков тысяч объектов одновременно (например, в стратегии в реальном времени) на GDScript будут выполняться заметно медленнее, чем на компилируемых языках (C# или C++). * Узкая специализация (вендор-лок): знание GDScript применимо только в Godot. Вы не сможете написать на нем бэкенд для веб-сайта или скрипт для автоматизации системы. * Сложности рефакторинга в крупных проектах: несмотря на появление типизации, язык остается динамическим. В проектах уровня ААА с сотнями тысяч строк кода отслеживать связи и проводить глобальный рефакторинг на GDScript сложнее, чем на строгом C#. * Ограниченная экосистема сторонних библиотек: в отличие от Python или C#, вы не можете просто скачать из интернета библиотеку для интеграции сложной нейросети или специфической базы данных без дополнительных усилий (часто для этого приходится писать модули на C++). ## Для кого подходит этот язык? * Инди-разработчики и сольные творцы: для тех, кому нужно быстро реализовать идею без сложной архитектуры. * Новички в GameDev: Идеальный старт для тех, кто никогда раньше не программировал. * Участники Game Jams: Когда на создание игры есть всего 48 часов, скорость написания кода на GDScript спасает ситуацию. * Технические художники и геймдизайнеры: Язык настолько прост, что люди, далекие от хардкорного программирования, могут сами настраивать логику поведения персонажей, пользовательский интерфейс и анимацию. ## Сравнение GDScript с другими языками в Godot. Godot Engine официально поддерживает несколько языков. Вот как выглядит GDScript на их фоне: ![gdst.png](gdst.png) ###### Важный нюанс: многие путают GDScript с Python. Синтаксически они похожи, как братья, но по сути это разные языки. В GDScript нет сборщика мусора (используется подсчет ссылок), и он не имеет огромной стандартной библиотеки Python. ###### Давайте разберем синтаксис GDScript на практике и сравним его с C#, чтобы наглядно увидеть, почему многие разработчики предпочитают встроенный язык Godot для написания игровой логики. В качестве примера возьмем самую классическую задачу — базовое передвижение и прыжок 2D-персонажа (с учетом гравитации). Мы будем использовать современный синтаксис Godot 4. ### 1. Перемещение персонажа с помощью GDScript. Вот как выглядит стандартный скрипт для узла CharacterBody2D, отвечающего за физическое перемещение персонажа в платформере: ``` extends CharacterBody2D const SPEED: float = 300.0 const JUMP_VELOCITY: float = -400.0 # Получаем значение гравитации из глобальных настроек проекта var gravity: float = ProjectSettings.get_setting("physics/2d/default_gravity") func _physics_process(delta: float) -> void: # 1. Применяем гравитацию, если персонаж не на полу if not is_on_floor(): velocity.y += gravity * delta # 2. Обработка прыжка (клавиша Пробел или стрелка вверх) if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY # 3. Получаем направление движения (-1 для влево, 1 для вправо, 0 если стоим) var direction: float = Input.get_axis("ui_left", "ui_right") if direction: velocity.x = direction * SPEED else: # Плавная остановка, если кнопки не нажаты velocity.x = move_toward(velocity.x, 0, SPEED) # 4. Применяем вычисленную скорость и двигаем персонажа move_and_slide() ``` ### Особенности синтаксиса GDScript, которые здесь видны: * Нет фигурных скобок {} и точек с запятой ;: блоки кода выделяются отступами (табуляцией), как в Python. Это делает код визуально «воздушным» и заставляет разработчика писать аккуратно. * Ключевые слова var и func: используются для объявления переменных и функций соответственно. * Статическая типизация (опционально): записи вида : float или -> void помогают движку и вам избегать ошибок, хотя код работал бы и без них. * Прямой доступ к свойствам узла: переменная velocity (текущая скорость) доступна напрямую, так как скрипт наследует (extends) класс CharacterBody2D. ### 2. Тот же код на C#. А теперь посмотрим, как та же логика реализуется в Godot с использованием C#: ``` using Godot; using System; public partial class Player : CharacterBody2D { public const float Speed = 300.0f; public const float JumpVelocity = -400.0f; // Получаем гравитацию и явно приводим её к типу float public float Gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle(); public override void _PhysicsProcess(double delta) { // В C# мы должны создать локальную копию вектора скорости Vector2 velocity = Velocity; // 1. Применяем гравитацию if (!IsOnFloor()) { velocity.Y += Gravity * (float)delta; } // 2. Обработка прыжка if (Input.IsActionJustPressed("ui_accept") && IsOnFloor()) { velocity.Y = JumpVelocity; } // 3. Получаем направление float direction = Input.GetAxis("ui_left", "ui_right"); if (direction != 0) { velocity.X = direction * Speed; } else { velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed); } // 4. Возвращаем измененный вектор обратно в свойство Velocity и двигаем Velocity = velocity; MoveAndSlide(); } } ``` ### Сравнивая эти два фрагмента кода, можно выделить несколько ключевых моментов: * Бойлерплейт (избыточный код): C# требует гораздо больше «обвязки». Нужны директивы using, объявление класса (public partial class), модификаторы доступа (public, override). В GDScript файл скрипта сам по себе является классом, и это скрыто от пользователя. * Стиль написания (соглашения об именовании):в GDScript принято использовать snake_case (слова через подчеркивание: move_and_slide, is_on_floor), в C# используется PascalCase (каждое слово с заглавной буквы: MoveAndSlide, IsOnFloor). * Работа со свойствами: в C# (начиная с Godot 4) свойства вроде Velocity являются структурами. Вы не можете просто написать Velocity.Y += 10. Вам нужно скопировать вектор в локальную переменную, изменить его, а затем переназначить обратно (Velocity = velocity). GDScript делает это автоматически, что значительно упрощает работу. * Приведение типов: в C# требуется строгое приведение типов (кастинг). Например, дельта времени в C# имеет тип double, а гравитация — float, поэтому нужно писать (float)delta. Кроме того, настройку гравитации нужно явно распаковывать с помощью .AsSingle(). В GDScript типизация менее строгая. ### Итог сравнения Если вам нужно реализовать механику движения, GDScript позволит сделать это быстрее, код займет меньше строк и будет читаться как обычный текст. Однако если бы мы писали алгоритм генерации бесконечного мира с использованием многопоточности, строгий синтаксис и производительность C# были бы гораздо предпочтительнее. ## Применение в наше время и подходящие проекты. В 2023–2024 годах, после скандалов, связанных с изменением ценовой политики Unity, Godot пережил взрывной рост популярности. GDScript стал основным инструментом для тысяч студий, перешедших на этот движок. Как это применяется сейчас: современный подход в Godot — комбинирование языков. Разработчики используют GDScript для 80–90 % проекта (управление персонажем, интерфейс, диалоги, квесты), а сложные алгоритмы (например, алгоритм поиска пути A* для тысячи врагов) пишут на C# или C++. **В каких проектах GDScript проявляет себя лучше всего:** 1. 2D-игры (платформеры, метроидвании): GDScript идеально подходит для работы с физикой и логикой 2D-игр. Примеры известных игр на Godot: Cruelty Squad, Dome Keeper, Brotato, Cassette Beasts — в большинстве из них активно используется GDScript. 2. Рогалики (Rogue-like / Rogue-lite): на этом языке легко писать генерацию уровней средней сложности и управление инвентарем. 3. Игры с упором на сюжет и пользовательский интерфейс (визуальные новеллы, карточные игры): лучшего инструмента для управления состояниями кнопок, окон и текста не придумаешь. 4. Настольные неигровые приложения: Удивительно, но на Godot создают много софта (например, программу для пиксель-арта Pixelorama или инструмент для анимации RPG in a Box). GDScript отлично подходит для создания сложных пользовательских интерфейсов. 5. Мобильные игры: казуальные и гиперказуальные проекты безупречно работают на GDScript. ## Вывод. GDScript — прагматичный инструмент. Он не претендует на звание самого быстрого или универсального языка в мире. Его сила — в филигранной подстройке под нужды движка Godot. Если ваша цель — создать игру, а не строить сложные программные архитектуры ради самих архитектур, GDScript сэкономит вам сотни часов времени.