Создайте AR-игру с помощью Unity AR Foundation.

1. Обзор

ARCore — это платформа Google для создания возможностей дополненной реальности на смартфонах. Вы можете использовать Unity AR Foundation для создания кроссплатформенных AR-приложений.

Что ты построишь

В этой лаборатории кода вы создадите простую игру с использованием AR Foundation. Цель игры — собирать посылки с помощью автомобиля, которым вы управляете с помощью портативного устройства.

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

К концу этой лаборатории ваша игра сможет:

  • Обнаруживайте реальные самолеты и рисуйте над ними игровое поле.
  • Направляйте лучи из поля зрения камеры и обнаруживайте пересечения с плоскостями.
  • Реагируйте на реальные условия освещения, чтобы придать игре дополнительный реализм.

Что вы узнаете

  • Как настроить проект, использующий Unity AR Foundation.
  • Как использовать ARPlaneManager для подписки на новые самолеты.
  • Как использовать Raycast для поиска пересечений с виртуальной геометрией
  • Как использовать ARLightEstimationData для освещения вашей сцены.

Что вам понадобится

2. Настройте среду разработки

На этом этапе вы подготовите свою среду к разработке с помощью Unity AR Foundation.

Убедитесь, что ваше устройство совместимо с AR

Работа с дополненной реальностью на устройствах Android осуществляется с помощью ARCore, который доступен на устройствах с поддержкой ARCore . Убедитесь, что ваше устройство разработки совместимо с AR. Альтернативно вы можете использовать правильно настроенный AR-совместимый экземпляр Android Emulator .

Настройте отладку по USB на вашем устройстве.

Вам нужно будет включить параметры разработчика на вашем устройстве, чтобы запускать приложения для отладки. Если вы еще этого не сделали, обратитесь к документации Android по разделам «Включить параметры разработчика» и «Отладка по USB» .

Установите Unity (2020.3 LTS)

На своей рабочей станции установите Unity 2020 LTS . В этой лаборатории кода показаны снимки экрана пользовательского интерфейса Unity в версии 2020.3 (LTS) . Другие версии Unity могут работать, но могут потребоваться дополнительные действия. Это может выглядеть иначе, чем на скриншотах, показанных здесь.

Создать новый проект

Создайте новый проект, используя шаблон Universal Render Pipeline . Дайте ему описательное имя и подходящее местоположение и нажмите CREATE .

Установите необходимые фреймворки

Unity AR Foundation можно найти в диспетчере пакетов Unity.

  1. Откройте его, нажав «Окно» > «Диспетчер пакетов» .

  1. В этом окне установите пакеты, которые вы будете использовать в этой лаборатории кода. Просмотрите последние версии этих платформ, развернув запись с помощью значка . Установите последние версии для каждой из этих платформ:
    • Фонд АР
    • Плагин ARCore XR

Когда вы закончите, ваш менеджер пакетов должен выглядеть примерно так:

Установите стартовый пакет

Для этой лаборатории кода мы предоставили стартовый пакет, содержащий префабы и сценарии, которые ускорят некоторые части лаборатории кода, чтобы вы могли сосредоточиться на том, как использовать AR Foundation.

  1. Установите стартовый пакет, открыв Assets > Import Package > Custom Package... и открыв starter-package.unitypackage .
  2. В появившемся окне убедитесь, что все выбрано.
  3. Нажмите «Импортировать» .

Изменить настройки сборки

Поскольку приложение будет работать на Android, измените платформу сборки на Android:

  1. Откройте Файл > Настройки сборки .
  2. На панели «Платформа» выберите Android .
  3. При необходимости включите сборку разработки и отладку сценариев , чтобы сохранять отладочную информацию во время работы приложения.
  4. Нажмите «Сменить платформу» .

Изменить настройки проекта

AR Foundation необходимо настроить для инициализации систем XR при запуске.

  1. Откройте «Правка» > «Настройки проекта»… и щелкните раздел «Управление плагинами XR» .
  2. На вкладке Android включите ARCore .

  1. На левой панели щелкните раздел «Проигрыватель» .
  2. На вкладке Android в разделе « Другие настройки » удалите Vulkan из графических API .

  1. Для приложений, требующих AR, использующих ARCore, требуется минимальный уровень API 24. Прокрутите вниз и найдите «Минимальный уровень API» . Установите минимальный уровень API 24.

Добавьте необходимые элементы сцены

Шаблон Universal Render Pipeline включает в себя некоторые игровые объекты, которые вы не будете использовать в этом руководстве.

  1. Удалите все игровые объекты в SampleScene .

  1. Добавьте объекты AR Foundation. Щелкните правой кнопкой мыши на панели Иерархия . Используйте это меню, чтобы добавить:
  • XR > AR Session : этот объект управляет жизненным циклом AR-опыта.
  • XR > AR Session Origin : этот объект преобразует координаты AR в мировые координаты Unity.
  • Свет > Направленный свет : обеспечивает источник света для освещения игровых объектов.

Ваша иерархия должна выглядеть так:

  1. Разверните созданный вами источник сеанса AR в иерархии и выберите объект «Камера AR» . В инспекторе измените его тег на MainCamera .

Настроить рендеринг

Для совместимости с AR Foundation универсальному конвейеру рендеринга Unity требуется одно изменение.

  1. На панели «Проект» перейдите в раздел «Активы» > «Настройки» , чтобы найти актив ForwardRenderer .

  1. Выберите ForwardRenderer .
  2. На панели «Инспектор» используйте «Добавить функцию рендеринга», чтобы добавить функцию фонового рендеринга AR . Этот компонент будет отображать изображение с камеры в вашей сцене.

Проверьте настройку

  1. Убедитесь, что ваше устройство подключено к сети и включена отладка ADB.
  2. Нажмите «Файл» > «Создать и запустить...». Это загрузит приложение на ваше устройство и запустит его после установки.
  3. Вы должны увидеть изображение с камеры на экране вашего устройства.

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

3. Обнаруживайте самолеты в реальном мире

Теперь, когда базовая сцена создана, вы можете приступить к разработке игры. На этом этапе вы обнаружите самолеты и нарисуете их на сцене.

Добавьте компонент ARPlaneManager

ARPlaneManager обнаруживает ARPlane и создает, обновляет и удаляет игровые объекты, когда понимание устройством окружающей среды меняется.

  1. Используя панель «Иерархия», создайте пустой GameObject .
  2. Переименуйте его в Driving Surface Manager . Этот компонент будет отображать самолеты до тех пор, пока игрок не выберет один из них.
  3. Выберите новый игровой объект. На панели «Инспектор» нажмите «Добавить компонент» , чтобы добавить диспетчер плоскостей AR .

  1. Настройте ARPlaneManager , задав поле Plane Prefab :
    1. Нажмите кнопку рядом с надписью None , чтобы открыть окно «Выбор игрового объекта» .
    2. Выберите вкладку «Ресурсы» и найдите « Плоскость движущейся поверхности» .

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

  1. Измените Detection Mode на Horizontal . Это настроит ARPlaneManager на предоставление только горизонтальных плоскостей, идеально подходящих для движения.

Добавьте компонент ARRaycastManager .

ARRaycastManager предоставляет функциональность raycast. На следующем шаге мы будем использовать этот объект, чтобы предоставить пользователю элементы управления.

  1. Убедитесь, что объект под названием Driving Surface Manager выбран на панели «Иерархия».
  2. В Инспекторе нажмите «Добавить компонент» , чтобы добавить компонент ARRaycastManager к вашему игровому объекту.

Никакой дополнительной настройки для этого компонента не требуется.

Добавьте компонент DrivingSurfaceManager .

DrivingSurfaceManager — это вспомогательный сценарий из стартового пакета, который позволяет выбрать ARPlane . После выбора ARPlane все остальные самолеты будут скрыты, а новые самолеты будут отключены.

  1. Убедитесь, что объект под названием Driving Surface Manager выбран на панели «Иерархия».
  2. В Инспекторе нажмите «Добавить компонент» , чтобы добавить компонент DrivingSurfaceManager к вашему игровому объекту.

Никакой дополнительной настройки для этого компонента не требуется.

Запустите приложение

  1. Нажмите «Файл» > «Создать и запустить...», чтобы проверить изменения.
  2. Направьте свое устройство на горизонтальную поверхность реального мира и перемещайте его, чтобы улучшить понимание мира ARCore.

  1. Когда ARCore обнаружит самолет, вы должны увидеть текстуру грязи, покрывающую реальные поверхности. ARPlaneManager создает экземпляр данного Plane Prefab для каждой обнаруженной плоскости. Префаб Driving Surface Plane имеет компонент ARPlaneMeshVisualizer , который создает сетку для данного ARPlane .

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

4. Выполните проверку попадания обнаруженных самолетов.

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

Создайте прицельную сетку

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

Чтобы «приклеить» эту прицельную марку к самолету AR, используйте тест на попадание. Тест на попадание — это метод, который вычисляет пересечения при движении луча в заданном направлении. Вы будете использовать тест на попадание, чтобы обнаружить пересечение в направлении обзора камеры.

Добавить сетку

  1. На панели «Проект» в нижней части экрана выберите «Активы» > «Стартовый пакет» .
  2. Поместите префаб Reticle на сцену, перетащив его на панель Hierarchy проекта.
  3. Выберите сетку в иерархии.
  4. В инспекторе нажмите «Добавить компонент» . Добавьте скрипт ReticleBehaviour из стартового пакета. Этот скрипт содержит шаблон для управления прицельной сеткой.
  5. Сценарий ReticleBehaviour зависит от созданного вами ранее Driving Surface Manager , поэтому добавьте зависимость, щелкнув элемент выбора Driving Surface Manager . Выберите вкладку «Сцена» и выберите Driving Surface Manager .

Отредактируйте ReticleBehaviour

Скрипт ReticleBehavior разместит прицел в плоскости, которая находится в центре области просмотра устройства.

  1. Откройте сценарий ReticleBehaviour.cs дважды щелкнув поле Script .
  2. Определите центр экрана с помощью ViewToScreenPoint камеры . Отредактируйте метод Update() добавив следующее:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
  1. Используйте эту точку для проведения raycast. Добавьте следующее:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);

Переменная hits будет содержать ARRaycastHit , описывающую точки на отслеживаемых объектах, которые пересекаются ray .

  1. Определите интересующую точку пересечения, запросив список hits . Установите приоритет заблокированной плоскости, содержащейся в DrivingSurfaceManager , и, если она не существует, используйте первое попадание в плоскость. Добавьте следующее в конец Update() :
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
    // If you don't have a locked plane already...
    var lockedPlane = DrivingSurfaceManager.LockedPlane;
    hit = lockedPlane == null
        // ... use the first hit in `hits`.
        ? hits[0]
        // Otherwise use the locked plane, if it's there.
        : hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
  1. Если hit содержит результат, переместите преобразование этого GameObject в позицию попадания.
if (hit.HasValue)
{
    CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
    // Move this reticle to the location of the hit.
    transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);

Проверьте прицельную сетку

  1. Нажмите «Файл» > «Создать и запустить...», чтобы проверить изменения.
  2. Когда вы направляете свое устройство на самолет, вы должны увидеть, как прицельная марка следует за движениями вашей камеры.

Создать автомобиль

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

Добавьте CarManager в свою сцену

  1. В Hierarchy создайте новый пустой GameObject .
  2. Переименуйте его в Car Spawner .
  3. Выберите созданный вами объект. На панели «Иерархия» нажмите «Добавить компонент» , чтобы добавить компонент CarManager .
  4. Настройте зависимости CarManager , щелкнув элемент выбора для каждого поля:
    • Car Prefab : В Assets выберите Car Prefab .
    • Прицел : В сцене выберите Reticle Prefab .
    • Диспетчер поверхности вождения : В сцене выберите Диспетчер поверхности вождения .

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

Тест-драйв

  1. Нажмите «Файл» > «Создать и запустить» , чтобы проверить изменения.
  2. Когда вы нажмете на самолет, вы увидите, как в этом месте появится небольшой автомобиль. Эта машина будет следовать за сеткой.

Добавьте игровой элемент

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

  1. Создайте новый пустой GameObject в иерархии.
  2. Переименуйте его в Package Spawner .
  3. Выберите созданный вами объект. На панели «Иерархия» нажмите «Добавить компонент» , чтобы добавить к нему компонент PackageSpawner .
  4. Настройте зависимости PackageSpawner , щелкнув элемент выбора для каждого поля:
    • Префаб пакета : В разделе «Активы» выберите «Префаб пакета» .
    • Диспетчер поверхности вождения В сцене выберите Диспетчер поверхности вождения .

Такое поведение PackageSpawner создает новый пакет в случайном месте на заблокированном ARPlane , если пакета еще нет.

Протестируйте игру

  1. Нажмите «Файл» > «Создать и запустить» , чтобы проверить изменения. 2. После того, как вы создадите машину, должен появиться пакет.
  2. Подъезжайте на машине к упаковке.
  3. Новый появится в случайном месте.

5. Настройте оценку освещения

Теперь, когда базовая игра завершена, добавьте немного реализма в свою AR-сцену. На этом этапе вы будете использовать API оценки освещения ARCore для определения освещения, присутствующего в реальном мире, на основе входящих кадров с камеры. Эта информация будет использоваться для адаптации освещения вашей сцены в соответствии с реальным освещением.

Включить оценку освещения

  1. В «Иерархии» разверните источник сеанса AR и выберите объект «Камера AR» .
  2. В Инспекторе разверните скрипт AR Camera Manager .
  3. Измените поле «Оценка освещения» на «Все» .

Измените направленный свет

  1. В Hierarchy выберите объект Directional Light .
  2. Добавьте к нему компонент LightEstimation . Этот компонент из стартового пакета предоставляет шаблон для подписки на изменения освещения.
  3. В функцию FrameReceived() добавьте:
ARLightEstimationData lightEstimation = args.lightEstimation;

if (lightEstimation.averageBrightness.HasValue)
    Light.intensity = lightEstimation.averageBrightness.Value;

if (lightEstimation.averageColorTemperature.HasValue)
    Light.colorTemperature = lightEstimation.averageColorTemperature.Value;

if (lightEstimation.colorCorrection.HasValue)
    Light.color = lightEstimation.colorCorrection.Value;

if (lightEstimation.mainLightDirection.HasValue)
    Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);

if (lightEstimation.mainLightColor.HasValue)
    Light.color = lightEstimation.mainLightColor.Value;

if (lightEstimation.mainLightIntensityLumens.HasValue)
    Light.intensity = lightEstimation.averageMainLightBrightness.Value;

if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
    RenderSettings.ambientMode = AmbientMode.Skybox;
    RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}

Проверьте свои изменения

  1. Нажмите «Файл» > «Создать и запустить» , чтобы проверить изменения.
  2. Глядя на объекты сцены, вы можете заметить, что они окрашены в зависимости от освещения окружающей среды.
  3. Если возможно, попробуйте изменить освещение. Например, попробуйте выключить свет в комнате, в которой вы находитесь. Вы должны увидеть, как освещение объектов адаптируется к изменению реального освещения.

6. Подведение итогов

Поздравляем! Вы дочитали до конца эту лабораторную работу по Unity AR Foundation.

Что вы рассмотрели

  • Как настроить базовый проект с использованием Unity AR Foundation и Universal Rendering Pipeline.
  • Как использовать ARPlaneManager для подписки на новые самолеты.
  • Как использовать Raycast для поиска пересечений с виртуальной геометрией.
  • Как использовать ARLightEstimationData для освещения вашей сцены.

Следующие шаги

Бонусные задания

Если вы хотите расширить созданную вами игру, вот несколько идей, которые вы можете реализовать:

  • Добавьте счетчик очков в свою игру, изменив TextMeshPro , когда PackageManager создает новый пакет.
  • Просматривайте информацию о производительности во время работы игры, включив наложение производительности .
  • Используйте Persistent Raycasts, чтобы сначала размещать новые объекты на сцене. Когда в этой области обнаруживается плоскость, этот объект обновляется и привязывается к этой плоскости.