🏠 Главная

Базовые компоненты Unity

В этом туториале мы разберём основные компоненты Unity, с которыми почти каждый сталкивается в самых первых проектах. Именно они определяют, какими свойствами обладает игровой объект и как он ведёт себя в сцене.

В прошлых уроках мы уже говорили о том, что сцена игры состоит из игровых объектов (GameObject). Однако сами по себе эти объекты почти ничего не делают — их поведение и свойства определяются компонентами. По сути, каждый объект в Unity представляет собой набор компонентов, которые вместе задают его внешний вид, физику, звук и логику работы.

В этом уроке мы кратко рассмотрим несколько базовых компонентов, которые чаще всего используются в начале работы с Unity, и разберём, для чего они нужны и как применяются на практике.

Пустой игровой объект

Игровой объект в Unity выступает контейнером для компонентов, которые определяют его свойства и роль в сцене. Сам по себе GameObject почти ничего не делает — поведение, внешний вид и взаимодействие появляются только после добавления компонентов.

Чаще всего создание объекта начинается с пустого GameObject. Его можно создать через меню GameObject → Create Empty или сочетанием клавиш Ctrl + Shift + N.

После создания объект появляется в сцене и в окне Hierarchy. Ему можно задать удобное имя, а также выбрать небольшую иконку, чтобы было легче находить объект в сцене и ориентироваться в структуре проекта.

При создании Unity автоматически добавляет первый и обязательный компонент — Transform. Он отвечает за положение объекта в сцене и присутствует у каждого GameObject. Подробнее о нём мы поговорим в следующем шаге.

пустой геймобъект в сцене
Пустой GameObject в сцене. Новый объект уже содержит компонент Transform.

Transform

Transform — обязательный компонент любого GameObject в Unity. Если объект существует в сцене, значит у него есть положение, ориентация и размер. Все эти параметры задаются именно в компоненте Transform.

Изменяя значения в полях Transform в Inspector, мы меняем положение объекта в сцене, его поворот и масштаб. Практически все объекты в игре так или иначе используют эти параметры.

💡 Inspector можно считать «визитной карточкой» игрового объекта. Через Inspector мы видим все добавленные компоненты и их настройки. Когда ты выбираешь объект в сцене или в окне Hierarchy, Unity показывает его свойства именно в окне Inspector.

Значения компонентов можно менять не только через Inspector, но и через скрипты — именно так чаще всего и происходит во время работы игры.

В прошлых уроках мы уже говорили о доступе к компонентам через GetComponent<T>(). Однако для Transform Unity делает исключение: поскольку этот компонент есть у каждого объекта, к нему можно обращаться напрямую через transform.

Через Transform можно изменять не только поля, которые видны в Inspector, но и использовать дополнительные функции для управления объектом.

Часто используемые свойства и методы Transform:

Для примера напишем простой скрипт, который показывает, как можно взаимодействовать с компонентом Transform через код.

using UnityEngine;

public class TransformExample : MonoBehaviour
{
    void Start()
    {
        // Устанавливаем позицию объекта в точку (1, 1, 0)
        transform.position = new Vector3(1f, 1f, 0f);

        // Поворачиваем объект на 45 градусов по оси Z
        transform.rotation = Quaternion.Euler(0f, 0f, 45f);

        // Увеличиваем размер объекта в 2 раза
        transform.localScale = new Vector3(2f, 2f, 2f);
    }

    void Update()
    {
        // Каждый кадр немного перемещаем объект вправо
        transform.Translate(1f * Time.deltaTime, 0f, 0f);

        // Каждый кадр немного вращаем объект
        transform.Rotate(0f, 0f, 90f * Time.deltaTime);
    }
}
инспектор компонента Transform
Компонент Transform в Inspector — здесь задаются позиция, поворот и масштаб объекта.

Sprite Renderer

Компонент Sprite Renderer отвечает за отображение спрайтов в сцене. Именно он делает игровой объект видимым, используя выбранное изображение.

💡 Чтобы добавить компонент к объекту, выберите его в Hierarchy или в сцене и нажмите кнопку Add Component в Inspector. После этого можно найти нужный компонент через строку поиска.

В отличие от Transform, компонент Sprite Renderer не является обязательным. Поэтому для доступа к нему через код сначала необходимо получить его с помощью GetComponent<SpriteRenderer>().

Часто используемые свойства и методы Sprite Renderer:

Параметры, которые обычно меняют через скрипт:

Настройки, которые удобнее выставить в Inspector:

Для примера напишем простой скрипт, который получает компонент Sprite Renderer и изменяет некоторые его параметры.

using UnityEngine;

public class SpriteRendererExample : MonoBehaviour
{
    // ссылка на компонент Sprite Renderer
    private SpriteRenderer spriteRenderer;

    // новый спрайт, который можно назначить в Inspector
    public Sprite newSprite;

    void Start()
    {
        // получаем компонент Sprite Renderer у объекта
        spriteRenderer = GetComponent<SpriteRenderer>();

        // меняем изображение спрайта
        spriteRenderer.sprite = newSprite;

        // переворачиваем спрайт по горизонтали
        spriteRenderer.flipX = true;

        // устанавливаем порядок отрисовки
        spriteRenderer.sortingOrder = 10;
    }
}
инспектор компонента Sprite Renderer
Компонент Sprite Renderer — отвечает за отображение спрайта и порядок его отрисовки в сцене.

Коллайдеры

Компоненты Collider отвечают за границы объекта и его взаимодействие с другими объектами. Сам спрайт или модель не имеют физических границ — именно коллайдер задаёт форму, по которой Unity определяет столкновения и контакт.

Обычно коллайдеры выполняют две основные функции. Во-первых, они могут служить физической границей объекта, чтобы другие объекты не проходили сквозь него. Во-вторых, коллайдер может работать как область обнаружения, если включить у него режим Is Trigger.

В режиме триггера коллайдер не создаёт обычного физического столкновения, а только сообщает о факте контакта. Через скрипт можно определить, когда другой объект вошёл в область триггера, находится внутри неё или покинул её.

💡 Чтобы события триггера работали, хотя бы у одного из объектов должен быть компонент Rigidbody2D.

Для примера можно добавить объекту Box Collider 2D и включить у него режим Is Trigger. Тогда через скрипт получится определить момент, когда другой коллайдер попадает в эту область.

using UnityEngine;

public class TriggerDestroyExample : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D other)
    {
        // Когда другой объект входит в область триггера,
        // уничтожаем этот объект
        Destroy(other.gameObject);
    }
}

В этом примере метод OnTriggerEnter2D вызывается автоматически, когда другой объект с 2D-коллайдером входит в область триггера. Через параметр other мы получаем доступ к вошедшему объекту и можем, например, удалить его командой Destroy().

💡 Не забывайте, что коллайдеры существуют в двух версиях: 2D и 3D. Компоненты 2D работают только с другими 2D-компонентами, а 3D — только с 3D.

Параметры, которые важно знать в Inspector:

Коллайдеры могут иметь разную форму. Например, для 2D часто используются Box Collider 2D, Circle Collider 2D и Polygon Collider 2D. Для 3D есть свои варианты: Box Collider, Sphere Collider, Capsule Collider и другие.

Чем сложнее форма коллайдера, тем больше вычислений требуется движку. Поэтому не стоит стремиться идеально повторять форму спрайта, если это не влияет на игровой процесс. Обычно важнее добиться нужной функциональности, чем точного совпадения с картинкой.

Свойства коллайдера тоже можно настраивать. Например, для 2D-физики можно создать специальный материал Physics Material 2D, который задаёт трение и упругость.

Создать такой материал можно так: Assets → Create → 2D → Physics Material 2D. После этого выберите созданный материал в окне Project и настройте его параметры в Inspector.

Затем этот материал можно назначить в поле Material у компонента Collider 2D.

инспектор компонента Box Collider 2D
Компонент Box Collider 2D. Коллайдер задаёт форму взаимодействия объекта и может работать как обычная граница или как триггер.

Rigidbody

В то время как Collider добавляет объекту физические границы, компонент Rigidbody добавляет физическое поведение: падение под действием гравитации, движение под действием сил и реакцию на столкновения.

Если у вас в игре есть неподвижный объект, например пол или стена, обычно достаточно только Collider. Но если объект должен двигаться, падать или реагировать на силы, ему необходимо добавить компонент Rigidbody.

💡 Не забывайте, что Rigidbody, как и Collider, имеет две версии: 2D и 3D. Rigidbody2D работает только с 2D-коллайдерами, а обычный Rigidbody — с 3D-коллайдерами.

Часто используемые свойства и методы Rigidbody:

Параметры, которые обычно меняют через скрипт:

Настройки, которые удобнее выставить в Inspector:

Движение объектов с Rigidbody можно условно разделить на два типа. Первый — это автоматическая физика Unity: гравитация и взаимодействие с другими телами. Второй — воздействия, которые мы добавляем через скрипт.

В скриптах чаще всего используют два подхода: применение силы или прямое изменение скорости. Сила даёт более реалистичное физическое поведение, а прямое изменение скорости делает управление более отзывчивым.

В следующем примере объект с Rigidbody2D двигается влево и вправо с помощью стрелок клавиатуры, а при нажатии Space получает импульс вверх (прыжок).

using UnityEngine;
using UnityEngine.InputSystem;

public class RigidbodyMovementExample : MonoBehaviour
{
    private Rigidbody2D rb;

    public float moveSpeed = 5f;
    public float jumpForce = 6f;

    void Start()
    {
        // Получаем компонент Rigidbody2D
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Keyboard.current == null) return;

        float x = 0f;

        // Движение влево
        if (Keyboard.current.leftArrowKey.isPressed)
            x = -moveSpeed;

        // Движение вправо
        if (Keyboard.current.rightArrowKey.isPressed)
            x = moveSpeed;

        // Меняем горизонтальную скорость
        rb.linearVelocity = new Vector2(x, rb.linearVelocity.y);

        // Прыжок через добавление силы
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }
    }
}
инспектор компонента Rigidbody2D
Компонент Rigidbody2D. Он отвечает за физическое движение объекта, гравитацию и взаимодействие с другими телами.

Скрипт

Ваши скрипты в Unity тоже являются компонентами. Чаще всего используются скрипты типа MonoBehaviour. Это обычные C#-скрипты, которые наследуются от класса MonoBehaviour, чтобы получить доступ к функциям и событиям Unity.

Скрипты обычно определяют логику игры, хранят данные и при необходимости взаимодействуют с другими компонентами объекта — например Transform, Sprite Renderer или Rigidbody.

Чтобы создать новый скрипт, откройте меню Assets → Create → MonoBehaviour Script. После этого Unity создаст новый C#-файл, который можно открыть и редактировать в редакторе кода.

В следующем примере скрипт будет:

using UnityEngine;
using UnityEngine.InputSystem;

public class ScriptExample : MonoBehaviour
{
    // ссылка на Rigidbody2D нашего объекта
    private Rigidbody2D rb;

    // ссылка на объект Friend
    private GameObject friend;

    // компонент SpriteRenderer у объекта Friend
    private SpriteRenderer friendRenderer;

    // спрайты, которые можно назначить в Inspector
    public Sprite sprite1;
    public Sprite sprite2;
    public Sprite sprite3;

    public float moveSpeed = 5f;

    void Start()
    {
        // получаем компонент Rigidbody2D
        rb = GetComponent<Rigidbody2D>();

        // для примера отключаем влияние гравитации
        rb.gravityScale = 0f;

        // ищем в сцене объект с тегом Friend
        friend = GameObject.FindWithTag("Friend");

        // получаем его Sprite Renderer
        if (friend != null)
            friendRenderer = friend.GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        if (Keyboard.current == null) return;

        float x = 0f;
        float y = 0f;

        // движение влево и вправо
        if (Keyboard.current.leftArrowKey.isPressed) x = -moveSpeed;
        if (Keyboard.current.rightArrowKey.isPressed) x = moveSpeed;

        // движение вверх и вниз
        if (Keyboard.current.upArrowKey.isPressed) y = moveSpeed;
        if (Keyboard.current.downArrowKey.isPressed) y = -moveSpeed;

        // изменяем скорость Rigidbody2D
        rb.linearVelocity = new Vector2(x, y);

        // смена спрайта у объекта Friend
        if (friendRenderer != null)
        {
            if (Keyboard.current.digit1Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite1;

            if (Keyboard.current.digit2Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite2;

            if (Keyboard.current.digit3Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite3;
        }
    }
}

💡 Скрипты работают как обычные компоненты. Чтобы использовать скрипт, добавьте его к объекту через кнопку Add Component в Inspector.

скрипт в инспекторе как компонент игрового объекта
Скрипт в Inspector отображается как обычный компонент и может работать вместе с другими компонентами объекта.

Если хотите проверить скрипт в действии, добавьте в поля скрипта три спрайта. Для теста можно использовать системные спрайты Unity, например InputFieldBackground, Knob или UISprite.

Затем создайте новый объект в сцене: GameObject → 2D Object → Sprite → Square. После создания измените тег этого объекта на Friend в Inspector.

Когда вы запустите сцену, скрипт сможет найти объект с тегом Friend и менять его спрайт при нажатии клавиш 1, 2 и 3.

создание объекта Sprite Square
Создание нового 2D-объекта Sprite (Square), который будет использоваться как объект Friend.
заполненные поля спрайтов в скрипте
В Inspector в поля скрипта назначены три спрайта, которые будут переключаться при нажатии клавиш.

Какие компоненты использовать

В конечном итоге только ваша игра определяет, какие компоненты понадобятся объектам в сцене. Перечисленные в этом уроке компоненты служат лишь примером и помогают понять основной принцип работы Unity: игровой объект получает свойства и поведение через добавленные к нему компоненты.

На практике в Unity существует очень большое количество различных компонентов, предназначенных для разных задач. Например, есть компоненты для создания интерфейса, анимаций, освещения, работы со звуком, камерой, навигацией персонажей и многого другого.

По мере развития проекта вы будете добавлять только те компоненты, которые действительно нужны для конкретной механики игры. Один объект может иметь всего пару компонентов, а другой — целый набор, который вместе формирует его поведение.

Если хотите увидеть, как разные компоненты используются на практике, посмотрите примеры игровых механик в других туториалах на этом сайте. В них вы познакомитесь с различными способами применения компонентов Unity в реальных игровых ситуациях.