1. Основы синтаксиса GDScript: строгая типизация и настройка 2.5D окружения
Основы синтаксиса GDScript: строгая типизация и настройка 2.5D окружения
Добро пожаловать в курс по разработке 2.5D RPG на Godot. Мы создадим ролевую игру с видом сверху, используя мощь Godot 4 и углубленные возможности GDScript. В этой вводной статье мы не просто создадим проект, а заложим фундамент профессиональной архитектуры кода, используя строгую типизацию, и настроим сцену для специфического визуального стиля 2.5D.
Выбор рендеринга: Почему Compatibility?
При создании нового проекта в Godot 4 перед нами встает выбор между тремя режимами рендеринга: Forward+, Mobile и Compatibility. Для нашей задачи — Top-Down 2.5D RPG — мы выбираем Compatibility (Совместимость).
Этот режим использует OpenGL ES 3.0 (или WebGL 2.0 для веба). Вот почему это важно для нашего жанра:
* Пиксельная точность: Compatibility отлично справляется с рендерингом 2D-спрайтов в 3D-пространстве без лишних артефактов сглаживания, свойственных более сложным конвейерам. * Охват аудитории: RPG — жанр, популярный на самых разных устройствах, включая старые ноутбуки и мобильные телефоны. Compatibility обеспечивает максимальную поддержку железа. * Простота освещения: Для стилизованной 2.5D картинки нам не нужны тяжелые функции вроде SDFGI или Volumetric Fog, которые потребляют ресурсы в Forward+.
Концепция 2.5D в Godot
Термин "2.5D" может означать разные вещи. В рамках этого курса мы будем использовать подход "3D мир + 2D спрайты" (Billboarding). Это позволяет нам использовать 3D-физику, навигацию и освещение, сохраняя при этом ретро-эстетику спрайтов.
Для достижения эффекта "Top-Down" без перспективных искажений (когда дальние объекты кажутся меньше), мы будем использовать камеру в режиме Orthogonal (Ортогональная проекция).
Углубленный GDScript: Строгая типизация
Главная ошибка новичков в RPG-проектах — использование динамической типизации везде. RPG — это сложная система характеристик, инвентаря и состояний. Без строгой типизации отладка превратится в кошмар.
Синтаксис статической типизации
В GDScript 2.0 статическая типизация не только помогает избежать ошибок, но и улучшает производительность и работу автодополнения. Рассмотрим базовый синтаксис:
Если вы попытаетесь присвоить переменной max_health строковое значение, редактор выдаст ошибку еще до запуска игры. Это называется compile-time error check.
Выведение типов (Type Inference)
Чтобы писать меньше кода, можно использовать оператор :=. Godot сам определит тип переменной на основе присваиваемого значения:
Важно: Используйте := только тогда, когда значение очевидно. Если значение возвращается из сложной функции, лучше указать тип явно для читаемости.
Типизация функций
В RPG функции часто рассчитывают урон или проверяют условия. Мы обязаны указывать типы аргументов и возвращаемого значения.
Стрелка -> указывает, какой тип данных вернет функция. Если функция ничего не возвращает, используется void.
Типизированные массивы
Инвентарь — классический пример использования массивов. В старом GDScript массив мог содержать всё вперемешку: числа, строки, объекты. В нашем курсе мы будем использовать типизированные массивы:
Попытка добавить в quest_log число вызовет ошибку. Это критически важно для стабильности данных сохранения.
Математика движения: Нормализация вектора
При разработке управления в Top-Down играх часто возникает проблема: движение по диагонали происходит быстрее, чем по прямой. Это происходит потому, что вектор движения складывается из скоростей по осям X и Z (в 3D).
Если мы нажмем "Вверх" (Z = -1) и "Вправо" (X = 1), наш вектор будет . Длина этого вектора рассчитывается по теореме Пифагора:
Где: * — длина (магнитуда) вектора скорости. * — компонент вектора по оси X. * — компонент вектора по оси Z. * — операция извлечения квадратного корня.
Подставив значения, получаем:
Где: * — итоговая длина вектора.
Это означает, что персонаж движется по диагонали в 1.4 раза быстрее. Чтобы исправить это, мы должны нормализовать вектор. Нормализация — это приведение длины вектора к 1 (единичный вектор), сохраняя его направление.
Формула нормализации вектора:
Где: * — нормализованный вектор (единичный). * — исходный вектор. * — длина исходного вектора.
В GDScript для этого есть встроенный метод .normalized(), который мы будем активно использовать в контроллере персонажа.
Организация кода: class_name и Enums
Для большой RPG нам нужно, чтобы скрипты знали друг о друге без постоянного использования get_node или preload. Для этого мы используем ключевое слово class_name.
Глобальные классы
Добавив class_name в начало скрипта, мы регистрируем его как новый тип данных в редакторе.
Теперь в любом другом скрипте мы можем писать:
Перечисления (Enums) для состояний
Персонаж RPG всегда находится в каком-то состоянии: стоит, бежит, атакует, оглушен. Использование строк (например, if state == "run") — плохая практика, так как легко допустить опечатку. Используйте enum:
Под капотом IDLE будет равен 0, MOVE — 1 и так далее, но в коде мы работаем с понятными именами.
Практическая настройка проекта
Перед тем как перейти к следующему уроку, выполните следующие действия в Godot:
Main.tscn с узлом Node3D.В следующей статье мы приступим к созданию контроллера персонажа и реализуем передвижение с учетом нормализации векторов.