1. Введение в скриптинг: структура C# и жизненный цикл MonoBehaviour
Введение в скриптинг: структура C# и жизненный цикл MonoBehaviour
Unity — это не просто графический редактор, а мощный движок, управляемый кодом. Скрипты в Unity — это компоненты, которые оживляют объекты: заставляют персонажа двигаться, врагов — атаковать, а интерфейс — реагировать на нажатия. Основным языком программирования в Unity является C#.
Скрипт как компонент
В Unity действует компонентный подход. Любой объект на сцене (GameObject) — это контейнер. Его свойства определяются компонентами, которые к нему прикреплены. Transform определяет позицию, MeshRenderer — внешний вид, а ваш скрипт — поведение.
Когда вы создаете C# скрипт, вы создаете новый тип компонента, который можно добавить к игровому объекту так же, как и встроенные компоненты Unity.
!Игровой объект состоит из набора компонентов, одним из которых является ваш скрипт
Создание и структура скрипта
При создании нового скрипта через Create -> C# Script, Unity генерирует файл с шаблонным кодом. Рассмотрим его структуру детально.
1. Библиотеки (Namespaces)
В самом верху находятся директивыusing. Они подключают пространства имен, содержащие готовые классы и функции.
* using UnityEngine; — самая важная строка. Она дает доступ к базовым классам Unity: GameObject, Transform, Debug и другим.2. Класс и наследование
Строкаpublic class PlayerController : MonoBehaviour объявляет ваш класс.Критически важное правило: Имя класса (PlayerController) должно в точности совпадать с именем файла (PlayerController.cs). Если они различаются, Unity не сможет подключить скрипт к объекту и выдаст ошибку.
3. Наследование от MonoBehaviour
Обратите внимание на часть: MonoBehaviour. Это означает, что ваш класс наследуется от базового класса Unity — MonoBehaviour. Именно это превращает обычный C# класс в компонент Unity, который можно перетащить в Инспектор, и который имеет доступ к методам жизненного цикла (Start, Update и т.д.).Переменные и Инспектор
Одной из самых удобных функций Unity является возможность редактировать переменные скрипта прямо в редакторе, не меняя код.
Public переменные
Если вы объявите переменную какpublic, она станет видимой в окне Inspector.В Инспекторе появятся поля для ввода чисел и слот для перетаскивания игрового объекта.
Private и SerializeField
Переменныеprivate доступны только внутри скрипта и не видны в редакторе. Это полезно для внутренних расчетов.Однако, часто бывает нужно скрыть переменную от других скриптов (инкапсуляция), но оставить возможность настраивать её в редакторе. Для этого используется атрибут [SerializeField].
Жизненный цикл MonoBehaviour
Скрипты в Unity не выполняются линейно сверху вниз один раз. Они реагируют на события. Unity вызывает определенные методы в вашем скрипте в строго определенные моменты времени. Эти методы называются методами жизненного цикла (Lifecycle Methods) или "магическими методами".
!Порядок выполнения основных методов в Unity
Awake
МетодAwake() вызывается самым первым, как только объект инициализируется. Он срабатывает даже если скрипт выключен (галочка снята), но сам объект активен.Для чего использовать:
* Инициализация переменных.
* Получение ссылок на другие компоненты (например, GetComponent<Rigidbody>()).
* Настройка синглтонов.
Start
МетодStart() вызывается перед первым кадром, если скрипт включен. Он срабатывает после Awake().Для чего использовать:
* Действия, требующие, чтобы все остальные объекты уже были инициализированы (прошли стадию Awake).
* Установка начальных параметров логики игры.
Update
МетодUpdate() вызывается каждый кадр. Это основное место для игровой логики.Частота вызова зависит от производительности компьютера (FPS). Если игра идет в 60 FPS, Update вызовется 60 раз в секунду. Если компьютер тормозит и выдает 10 FPS — то 10 раз.
Для чего использовать: * Обработка ввода игрока (нажатия клавиш). * Перемещение персонажей (не физическое). * Таймеры.
FixedUpdate
МетодFixedUpdate() вызывается через фиксированные промежутки времени (по умолчанию 0.02 секунды, или 50 раз в секунду). Он не зависит от частоты кадров.Для чего использовать:
* Любые манипуляции с физикой (работа с Rigidbody).
* Приложение сил, импульсов.
Если вы будете двигать физическое тело в Update, движение будет дерганым при нестабильном FPS. В FixedUpdate физика всегда стабильна.
LateUpdate
МетодLateUpdate() вызывается каждый кадр, но строго после того, как отработали все методы Update во всех скриптах.Для чего использовать:
* Камера, следующая за игроком. Это гарантирует, что игрок уже завершил свое движение в Update, и камера переместится в его новую, окончательную позицию, избегая дрожания.
Взаимодействие с консолью
Для проверки работы кода и поиска ошибок используется класс Debug.
Сообщения появятся в окне Console внизу редактора Unity.
Итоги
* Скрипт в Unity — это компонент, наследуемый от MonoBehaviour. Имя файла и имя класса обязаны совпадать.
* Переменные public и [SerializeField] private видны в Инспекторе Unity, что позволяет настраивать игру без изменения кода.
* Awake используется для инициализации ссылок, Start — для настройки логики перед стартом.
* Update зависит от FPS и используется для ввода и логики, FixedUpdate имеет фиксированный шаг и нужен для физики.
* LateUpdate выполняется после всех обновлений и идеален для управления камерой.