Основы Unity3D

Unity – это кроссплатформенный игровой движок, предназначенный для разработки 2D и 3D игр. Он поддерживает более 20 платформ для развертывания, таких как Android, PC и iOS. Unity также способен создавать AR VR контент и считается одной из лучших платформ для создания метавселенной.

В этой статье мы изучим основные строительные блоки Unity3D, такие как активы, игровые объекты, префабы, освещение, физика и анимация.

Активы

Актив – это представление элемента, используемого в проекте. Активы делятся на два вида – внутренние и внешние. Активы, созданные внутри Unity IDE, называются внутренними активами. Например, контроллер аниматора, аудиомикшер, текстура рендера и т.д. Внешние активы – это активы, которые импортируются в Unity, например, 3D-модель, аудиофайл или изображение.


Изображение предоставлено документацией Unity 3D

Ниже перечислены несколько важных внутренних активов,

  • Сцены – контейнер для хранения игровых объектов.
  • Анимации – хранит данные анимации игровых объектов.
  • Материалы – Определяют внешний вид объекта.
  • Скрипты – бизнес-логика, применяемая к различным игровым объектам.
  • Префабы – чертеж игрового объекта, который может быть сгенерирован во время выполнения.

Чтобы создать внутренний актив, щелкните правой кнопкой мыши в папке Assets и выберите Create, затем выберите нужный актив.

Игровые объекты

GameObjects – это строительные блоки Unity. Он действует как контейнер, в котором хранятся компоненты объекта, такие как освещение, персонажи и пользовательский интерфейс. Мы можем создавать различные игровые объекты путем добавления или удаления некоторых компонентов из игрового объекта.


На рисунке (рис. 1) показаны игровые объекты – основная камера, направленный свет, куб, сфера и плоскость.

Свойства статуса сцены

Пользователи могут изменять статус игрового объекта через скрипт или с помощью инспектора. Игровой объект имеет три статуса – активный (по умолчанию), неактивный и статичный.

Активный и статический статус

По умолчанию игровой объект находится в активном состоянии. Пользователи могут установить статус игрового объекта как активный, неактивный или статичный. Вы можете сделать объект неактивным, сняв флажок в инспекторе, что сделает объект невидимым. Он не будет получать никаких событий, таких как Update или FixedUpdate. Вы можете управлять состоянием гейм-объекта с помощью скрипта GameObject.SetActive. Вы можете сделать gameObjects статичными, установив флажок static в инспекторе, тем самым ограничив трансформации.

Теги и слои

Теги полезны для определения типа игрового объекта. Слои позволяют включать или исключать группы GameObjects из определенных действий, таких как рендеринг или физические столкновения. Вы можете изменять значения тегов и слоев с помощью свойств GameObject.tag и GameObject.layer.

Создание и уничтожение игровых объектов

Вы можете создавать и уничтожать игровые объекты динамически. Мы можем создавать GameObjects в Unity, вызывая метод Instantiate() во время выполнения. Этот процесс создаст дубликат элемента объекта при условии, что он передан в аргументе. Мы можем удалить его содержимое со сцены, вызвав метод Destroy().

Создание объекта

public GameObject cube;  
void Start() {  
    for (int i = 0; i < 5; i++) {  
        Instantiate(cube);  
    }  
}
Object Destruction
void OnCollisionEnter(Collision otherObj) {  
    if (otherObj.gameObject.tag == "Cube") {  
        Destroy(otherObj,.5f);  
    }  
}
Вход в полноэкранный режим Выход из полноэкранного режима

Этот фрагмент кода уничтожит otherObj, если он столкнется с игровым объектом.

Поиск игровых объектов по имени или тегу

Мы можем найти отдельный игровой объект по его имени с помощью функции GameObject.Find(), а коллекцию объектов можно найти по их тегу с помощью методов GameObject.FindWithTag() и GameObject.FindGameObjectsWithTag().

GameObject player;
GameObject bat;
GameObject[] balls;
void Start()
{
    player = GameObject.Find("Player1");
    bat = GameObject.FindWithTag("Bat");
    balls = GameObject.FindGameObjectsWithTag("Ball");
}
Вход в полноэкранный режим Выход из полноэкранного режима

Поиск дочерних игровых объектов

Дочерние игровые объекты можно найти с помощью ссылки на компонент преобразования родительского объекта и метода GetChild().

void Start()
{
    for(int i=0;i<gameobject.transform.childCount;i++)
        balls[i] = gameobject.transform.GetChild(i).gameObject;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Связывание с игровыми объектами с помощью переменных

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

public class Demo : MonoBehaviour
{
    public GameObject bat;
    // Other variables and functions...
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Публичные переменные будут видны в Инспекторе. Вы можете назначить объекты переменным, перетащив объект из сцены или из панели Hierarchy.

Компоненты Unity

Компоненты – это функциональные части объекта GameObject. Вы можете назначить компонент игровому объекту, чтобы добавить ему функциональность. Transform, Mesh Renderer, Mesh Filter, Box Collider – вот некоторые из компонентов GameObject.

Как упоминалось ранее, GameObject – это контейнер, в котором хранятся различные компоненты. Все объекты GameObject по умолчанию имеют компонент Transform для определения основных преобразований, таких как перевод, поворот и масштабирование.

Манипуляции с компонентами

Доступ к компонентам

Метод GetComponent() используется для получения ссылки на необходимый экземпляр компонента. Получив ссылку на экземпляр компонента, вы можете изменить значения его свойств или ссылок, что аналогично изменению значений в панели инспектора.

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();
    rb.mass = 1f;
    rb.AddForce(Vector3.down * 5f);
}
Вход в полноэкранный режим Выйти из полноэкранного режима

В этом примере скрипт получает ссылку на компонент Rigidbody, mass устанавливается равным 1, а AddForce устанавливается в направлении вниз с множителем 5. 

Добавление или удаление компонентов

Вы можете добавлять или удалять компоненты во время выполнения с помощью методов AddComponent и Destroy. Этот метод можно использовать для динамического добавления/удаления игровых объектов на сцене. Однако вы можете включить или отключить некоторые компоненты с помощью скрипта, не уничтожая их.

Вы можете добавить компонент к объекту, используя AddComponent<Type> и указав тип компонента в угловых скобках, как показано на рисунке. Для удаления компонента можно использовать метод Object.Destroy.

//Adding a component to the current gameObject
void Start ()
{
    gameObject.AddComponent<Rigidbody>();
}
//Removing a component from the current gameObject
void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();
    Destroy(rb);    
}
Вход в полноэкранный режим Выход из полноэкранного режима

Префабы

Префабы – это повторно используемые игровые объекты, которые позволяют пользователю хранить GameObject с его полными компонентами и свойствами. Эти активы можно использовать в разных сценах. Основное преимущество префабов заключается в том, что изменения, внесенные или примененные к оригинальному префабу, распространяются на все остальные экземпляры. Это полезно при исправлении ошибок объекта, внесении изменений в материал, и все это в одном экземпляре.

Префабы создаются автоматически при перетаскивании объекта из иерархии в окно проекта. Префабы представлены синим текстом и синим кубом и имеют расширение *.prefab.

Рендеринг

Камера

Камера – это компонент, который захватывает вид со сцены. Обязательно наличие хотя бы одной камеры в сцене для визуализации игровых объектов. По умолчанию при создании новой сцены в ней присутствует компонент Main Camera.

Материалы, шейдеры и текстуры

Материалы, шейдеры и текстуры – это основные компоненты для визуализации игровых объектов в сцене.

Материалы

Материалы определяют способ рендеринга поверхности, который включает в себя текстуру, прозрачность, цвет, отражательную способность и т.д.


Рис. 1. Создание материала 2. Расположение материала в Assets 3. Спецификация материала в Инспекторе

Материалы выступают в качестве контейнера для шейдеров и текстур, которые могут быть применены к модели. Настройка материалов зависит от шейдера, который используется в материале.

Шейдеры

Шейдеры – это небольшие скрипты, которые рендерят графические данные, интегрируя сетки, текстуры и т.д. в качестве входных данных и генерируя изображение в качестве выходного.

Текстуры

Текстуры – это растровые изображения, которые могут использоваться с шейдерами материалов для расчета цвета поверхности объекта. Помимо базового цвета (альбедо), текстуры могут представлять другие аспекты поверхности, такие как отражательная способность и шероховатость.

Освещение

Освещение полезно для создания реалистичных теней и правильно освещенных реквизитов окружения. Однако нам также необходимо учитывать производительность этих вычислений освещения.

Unity предоставляет три режима для освещения, основанные на расчетах освещения. Это освещение в реальном времени, смешанное или запеченное освещение.

  • Освещение в реальном времени – лучший режим освещения, в котором мы можем создавать динамические тени. Однако они являются самыми дорогими в использовании. Рекомендуется свести освещение в реальном времени к минимуму и добавлять его только при необходимости.
  • Запеченное освещение позволяет нам сделать “моментальный снимок” освещения в игре. Оно позволяет рассчитать тени и блики от света в сцене во время выполнения.
  • Смешанное освещение – это сочетание функций освещения в реальном времени и запеченного освещения.

Наряду с настройками освещения, вы также можете захотеть поиграть с некоторыми параметрами освещения. Перейдите в Window > Rendering > Lighting Settings.

  • Включите Освещение в реальном времени, если вы не используете освещение в реальном времени в вашей сцене.
  • Выберите режим освещения из следующих – маска тени, запеченное косвенное и субтрактивное.
  • Теневая маска обеспечивает наилучшие характеристики освещения, но стоит дорого.
  • Запеченное косвенное освещение полезно для сцен в помещении.
  • Субтрактивное освещение является наиболее производительным и используется для WebGL или мобильных платформ.

Свет

Направленный свет

Направленный свет можно представить как далекий источник света, который существует бесконечно далеко, как солнце.

Лучи от направленного света всегда параллельны друг другу, поэтому отбрасываемые тени выглядят одинаково. Мы можем разместить его в любом месте сцены без изменения эффекта света, поскольку он не имеет положения источника. Они полезны для сцен на открытом воздухе.

Точечные светильники

Точечный светильник – это точка, из которой свет исходит во всех направлениях. Интенсивность света уменьшается от полной интенсивности в центре до нуля на расстоянии света. Они полезны для создания эффектов, подобных электрическим лампам, светильникам и т.д.

Прожекторы

Прожекторы излучают свет в прямом направлении (+Z) в виде конической структуры. Ширина этого конуса определяется параметром Spot Angle прожектора. Интенсивность света уменьшается по направлению к длине конуса и минимальна у его основания.

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

Физика

Физика позволяет управлять объектами с помощью сил, существующих в реальном мире, таких как гравитация, скорость и ускорение. Unity Physics – это комбинация детерминированных систем динамики твердого тела и пространственных систем запросов. Она написана с нуля с использованием стека технологий Unity, ориентированных на данные.

Коллайдеры

Коллайдеры – это компоненты, используемые для обнаружения столкновений, когда игровые объекты ударяются или сталкиваются друг с другом. Мы должны добавить компонент Rigidbody к объекту GameObject, к которому мы присоединили компонент коллайдера.

Типы коллайдеров: Box Collider, Capsule Collider, Mesh Collider, Sphere Collider, Terrain Collider и Wheel Collider.

Чтобы добавить события физики к объекту GameObject, выберите кнопку Add Component в окне Inspector, выберите Physics и укажите тип Collider.

Триггеры

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

Rigidbody

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

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

Добавление компонента Rigidbody достаточно, чтобы превратить игровой объект в физический объект. В качестве лучшей практики прикрепите к геймобъекту любой из коллайдеров.

Сценарии

Вот события физики в Unity для обнаружения столкновений.

void OnCollisionEnter(Collision collision) { 
 if(collision.gameObject.CompareTag("Ball") { 
  //Hit the ball
 } 
}
Вход в полноэкранный режим Выход из полноэкранного режима

Анимация

Создать анимацию в Unity очень просто. Unity упростил эту задачу с помощью элементов управления Animator и Animation Graph. Unity вызывает контроллеры аниматора, чтобы определить, какие анимации воспроизводить и когда их воспроизводить. Компонент анимации используется для воспроизведения анимации.

Взаимодействовать с анимацией с помощью сценария довольно просто. Сначала нужно сослаться на анимационные клипы в компоненте анимации. Затем получить ссылку на компонент Animator в сценарии с помощью метода GetComponent или сделав эту переменную публичной.

Наконец, установите значение атрибута enabled в true для включения анимации и false для ее отключения.
Для создания анимации на игровом объекте,

  • Сначала выберите объект в иерархии и нажмите ctrl + 6 или Window → Animation → Animation.

  • Нажмите на кнопку Create. После этого появится окно с предложением указать имя файла. Назовите его так, как вам нравится. Здесь это rotateAnim.
  • В окне анимации нажмите кнопку записи, а затем кнопку Добавить свойство. Выберите Transform → Rotation.


  • Измените ключевой кадр на 60 и измените значение поворота по оси X от 0 до 60. Измените вращение куба по оси X на 360 градусов.

  • Играйте в игру. Ваш куб будет вращаться по оси X каждые 1 секунду.

Спасибо за прочтение этой статьи.
Благодарим Gowri M Bhatt за рецензирование материалов.

Получить статью в формате pdf: unity3d-fundamentals.pdf

Если вам понравилась эта статья, пожалуйста, нажмите на кнопку с сердечком ♥ и поделитесь, чтобы помочь другим найти ее!

Если вы заинтересованы в дальнейшем изучении, вот некоторые ресурсы, которые я нашел полезными на этом пути:

Unity 3D C# scripting cheatsheet for beginners

Первоначально опубликовано на Medium –
Основы Unity3D

Оцените статью
Procodings.ru
Добавить комментарий