|
|
@@ -2,3 +2,163 @@
|
|
|
|
|
|

|
|
|
|
|
|
+
|
|
|
+### 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 на их фоне:
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+###### Важный нюанс: многие путают 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 сэкономит вам сотни часов времени.
|