1. Обзор
ARCore — это фреймворк от Google для создания приложений дополненной реальности на смартфонах. Вы можете использовать Unity AR Foundation для создания кроссплатформенных приложений дополненной реальности.
Что вы построите
В этом практическом занятии вы создадите простую игру с использованием AR Foundation. Цель игры — собирать посылки, управляя автомобилем с помощью портативного устройства.
Однако это не произойдёт в полностью виртуальном мире! Вы будете смешивать физические атомы и цифровые биты, чтобы создать новый тип игрового опыта, разработав игру, которая понимает окружающую игрока среду.
По завершении этого практического занятия ваша игра сможет:
- Обнаружить реальные самолеты и нарисовать на них игровое поле.
- Излучайте лучи из поля зрения камеры и обнаруживайте пересечения с плоскостями.
- Реагируйте на реальные условия освещения, чтобы придать вашей игре дополнительную реалистичность.

Что вы узнаете
- Как настроить проект, использующий Unity AR Foundation.
- Как использовать
ARPlaneManagerдля подписки на новые самолеты. - Как использовать
Raycastдля поиска пересечений с виртуальной геометрией - Как использовать
ARLightEstimationDataдля освещения сцены.
Что вам понадобится
- Поддерживаемое устройство ARCore , подключенное с помощью USB-кабеля к вашей машине для разработки.
- Сервисы Google Play для AR 1.23 или более поздней версии.
- Установка Unity Hub или Unity 2020 LTS .
2. Настройте среду разработки.
На этом этапе вы подготовите среду разработки с помощью Unity AR Foundation.
Убедитесь, что ваше устройство совместимо с дополненной реальностью.
AR-технологии на устройствах Android работают на основе ARCore, который доступен на устройствах с поддержкой ARCore . Убедитесь, что ваше устройство разработки совместимо с AR. В качестве альтернативы вы можете использовать правильно настроенный экземпляр эмулятора Android, совместимый с AR .
Настройте отладку по USB на вашем устройстве.
Для запуска отладочных приложений вам потребуется включить параметры разработчика на вашем устройстве. Если вы еще этого не сделали, обратитесь к документации Android по включению параметров разработчика и отладке по USB .
Установите Unity (2020.3 LTS)
На вашем рабочем компьютере установите Unity 2020 LTS . В этом практическом задании показаны скриншоты пользовательского интерфейса Unity в версии 2020.3 (LTS) . Другие версии Unity также могут работать, но могут потребовать дополнительных действий. Внешний вид может отличаться от показанных здесь скриншотов.
Создать новый проект
Создайте новый проект, используя шаблон «Универсальный конвейер рендеринга» . Присвойте ему описательное имя и укажите подходящее местоположение, затем нажмите «СОЗДАТЬ» .

Установите необходимые фреймворки.
AR Foundation от Unity можно найти в менеджере пакетов Unity.
- Откройте его, щелкнув «Окно» > «Диспетчер пакетов» .

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

Установите стартовый пакет
Для этого практического занятия мы подготовили стартовый пакет, содержащий префабы и скрипты, которые ускорят выполнение некоторых частей занятия, чтобы вы могли сосредоточиться на использовании AR Foundation.
- Установите стартовый пакет, открыв Assets > Import Package > Custom Package... и открыв
starter-package.unitypackage. - В появившемся окне убедитесь, что все элементы выделены.
- Нажмите «Импорт» .
Изменить параметры сборки
Поскольку приложение будет работать на Android, измените платформу сборки на Android:
- Откройте Файл > Настройки сборки .
- В панели «Платформа» выберите Android .
- При желании можно включить режимы «Разработка» и «Отладка скриптов» , чтобы сохранять отладочную информацию во время работы приложения.
- Нажмите «Переключить платформу» .

Изменить настройки проекта
Необходимо настроить AR Foundation таким образом, чтобы системы XR инициализировались при запуске.
- Откройте меню «Редактировать» > «Настройки проекта...» и перейдите в раздел «Управление плагинами XR» .
- На вкладке Android включите ARCore .

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

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

Добавьте необходимые элементы сцены.
Шаблон Universal Render Pipeline содержит некоторые игровые объекты, которые вы не будете использовать в этом уроке.
- Удалите все игровые объекты в
SampleScene.

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

- Разверните созданный вами объект AR Session Origin в иерархии и выберите объект AR Camera . В инспекторе измените его тег на MainCamera .

Настройка рендеринга
Для обеспечения совместимости с AR Foundation в универсальном конвейере рендеринга Unity необходимо внести одно изменение.
- В панели «Проект» перейдите в раздел «Ресурсы» > «Настройки» , чтобы найти ресурс ForwardRenderer .

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

Проверьте настройки.
- Убедитесь, что ваше устройство подключено к сети и что отладка ADB включена.
- Нажмите «Файл» > «Собрать и запустить...». Это загрузит приложение на ваше устройство и запустит его после установки.
- На экране вашего устройства должно отображаться изображение с камеры.
На следующем этапе вы начнете добавлять функциональность в свое приложение.
3. Обнаружение самолетов в реальном мире
Теперь, когда базовая сцена создана, вы можете приступить к разработке игры. На этом этапе вы будете обнаруживать плоскости и отрисовывать их на сцене.
Добавьте компонент ARPlaneManager
ARPlaneManager обнаруживает ARPlane и создает, обновляет и удаляет игровые объекты при изменении восприятия устройством окружающей среды.
- В панели «Иерархия» создайте пустой
GameObject. - Переименуйте его в
Driving Surface Manager. Этот компонент будет отображать плоскости до тех пор, пока игрок не выберет одну из них. - Выберите новый игровой объект. В панели «Инспектор» нажмите «Добавить компонент» , чтобы добавить AR Plane Manager .

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

Этот префаб из стартового пакета предоставляет текстуру шероховатого пола, которая будет использоваться в качестве декоративного элемента плоскости.
- Измените
Detection ModeнаHorizontal. Это настроитARPlaneManagerна отображение только горизонтальных плоскостей, что идеально подходит для движения по ним.
Добавьте компонент ARRaycastManager
Объект ARRaycastManager предоставляет функциональность трассировки лучей. На следующем шаге мы будем использовать этот объект для предоставления элементов управления пользователю.
- Убедитесь, что в панели «Иерархия» выбран объект с именем
Driving Surface Manager. - В инспекторе нажмите «Добавить компонент» , чтобы добавить компонент
ARRaycastManagerк вашему игровому объекту.
Для этого компонента дополнительная настройка не требуется.
Добавьте компонент DrivingSurfaceManager
DrivingSurfaceManager — это вспомогательный скрипт из стартового пакета, позволяющий выбрать ARPlane . После выбора ARPlane все остальные плоскости будут скрыты, а новые плоскости будут отключены.
- Убедитесь, что в панели «Иерархия» выбран объект с именем
Driving Surface Manager. - В инспекторе нажмите «Добавить компонент» , чтобы добавить компонент
DrivingSurfaceManagerк вашему игровому объекту.
Для этого компонента дополнительная настройка не требуется.
Запустите приложение
- Чтобы проверить внесенные изменения, нажмите «Файл» > «Сборка и запуск...» .
- Наведите устройство на горизонтальную реальную поверхность и перемещайте его, чтобы улучшить понимание окружающего мира системой ARCore.

- Когда ARCore обнаружит плоскость, вы должны увидеть текстуру грязи, покрывающую реальные поверхности.
ARPlaneManagerсоздаетPlane Prefabдля каждой обнаруженной плоскости. ПрефабDriving Surface Planeимеет компонентARPlaneMeshVisualizer, который создает сетку для заданнойARPlane.
На следующем этапе вы будете использовать обнаруженную плоскость в качестве игрового поля.
4. Проведите проверку попадания по обнаруженным самолетам.
На предыдущем шаге вы запрограммировали приложение, способное обнаруживать самолеты. Эти самолеты отражаются в игровой сцене. Теперь вы добавите интерактивность с этими самолетами, создав прицельную сетку и автомобиль, который будет двигаться по поверхности обнаруженного самолета.
Создайте прицельную сетку
В этом приложении управление осуществляется путем наведения телефона на поверхность. Для обеспечения четкой визуальной индикации заданного местоположения используется прицельная сетка.

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

Добавить прицельную сетку
- В панели «Проект» в нижней части экрана перейдите в раздел «Ресурсы» > «Стартовый пакет» .
- Разместите префаб прицела в сцене, перетащив его в панель «Иерархия» проекта.
- Выберите прицельную сетку в иерархии.
- В инспекторе нажмите «Добавить компонент» . Добавьте скрипт
ReticleBehaviourиз стартового пакета. Этот скрипт содержит некоторый шаблонный код для управления прицельной сеткой. - Скрипт
ReticleBehaviourзависит от созданного вами ранееDriving Surface Manager, поэтому добавьте зависимость, щелкнув по значку выбораDriving Surface Manager. Выберите вкладку «Сцена» и выберитеDriving Surface Manager.

Редактировать ReticleBehaviour
Скрипт ReticleBehavior позиционирует прицельную сетку на плоскости, расположенной в центре окна просмотра устройства.
- Откройте скрипт
ReticleBehaviour.cs, дважды щелкнув по полюScript. - Определите центр экрана, используя
ViewToScreenPointобъекта Camera . Отредактируйте методUpdate(), добавив следующее:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- Используйте эту точку для выполнения трассировки луча. Добавьте следующее:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
Переменная hits будет содержать объекты ARRaycastHit , описывающие точки на отслеживаемых объектах, которые пересекаются ray .
- Определите интересующую вас точку пересечения, запросив список
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);
}
- Если
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);
Проверьте прицельную сетку.
- Чтобы проверить внесенные изменения, нажмите «Файл» > «Сборка и запуск...» .
- Когда вы наводите устройство на самолет, вы должны увидеть, как прицельная сетка следует за движениями вашей камеры.

Создать автомобиль
Игрок будет управлять игрушечной машинкой, которая будет двигаться в направлении прицела. Модель и поведение этой машинки предоставляются в стартовом пакете.
Добавьте CarManager в свою сцену.
- В иерархии создайте новый пустой
GameObject. - Переименуйте его в
Car Spawner. - Выберите созданный вами объект. В панели «Иерархия» нажмите «Добавить компонент» , чтобы добавить компонент
CarManager. - Настройте зависимости
CarManager, щелкнув по значку выбора для каждого поля:- Сборный автомобиль : В разделе «Ресурсы» выберите «Сборный автомобиль» .
- Прицел : В разделе «Сцена» выберите «Префаб прицела» .
- Менеджер дорожного покрытия : В меню «Сцена» выберите «Менеджер дорожного покрытия» .
Эта функция CarManager создает игрушечную машинку на плоскости, на которой находится прицел. При желании вы можете ознакомиться со скриптом CarBehaviour , чтобы узнать, как запрограммирована эта машинка.
Тест-драйв
- Чтобы проверить внесенные изменения, нажмите «Файл» > «Сборка и запуск» .
- Когда вы нажмете на самолет, вы увидите, как в этом месте появится небольшой автомобиль. Этот автомобиль будет следовать за прицелом.
Добавьте игровой элемент
Теперь, когда игрок может управлять объектом на сцене, укажите ему пункт назначения, к которому он должен ехать.
- Создайте новый пустой
GameObjectв иерархии. - Переименуйте его в
Package Spawner. - Выберите созданный вами объект. В панели «Иерархия» нажмите «Добавить компонент» , чтобы добавить к нему компонент
PackageSpawner. - Настройте зависимости
PackageSpawner, щелкнув по значку выбора для каждого поля:- Пакет префаба : В разделе «Ресурсы» выберите «Пакет префаба» .
- Менеджер дорожного покрытия. В меню «Сцена» выберите «Менеджер дорожного покрытия» .
Функция PackageSpawner создает новый пакет в случайном месте на заблокированном ARPlane , если пакета еще нет.
Протестируйте игру
- Нажмите «Файл» > «Сборка и запуск» , чтобы проверить изменения. 2. После создания автомобиля должен появиться пакет.
- Подъезжайте на машине к посылке.
- Новый появится в случайном месте.

5. Составьте смету на освещение.
Теперь, когда базовая игра завершена, добавьте немного реализма в вашу сцену дополненной реальности. На этом этапе вы будете использовать API оценки освещения ARCore для определения освещения, присутствующего в реальном мире, на основе поступающих кадров с камеры. Эта информация будет использована для адаптации освещения вашей сцены к освещению реального мира.
Включить расчет освещения
- В разделе «Иерархия» разверните « Источник сеанса дополненной реальности» и выберите объект «Камера дополненной реальности» .
- В окне инспектора разверните скрипт AR Camera Manager .
- Измените значение поля «Оценка освещения» на «Все» .

Измените направленность света.
- В разделе «Иерархия» выберите объект «Направленный свет» .
- Добавьте к нему компонент
LightEstimation. Этот компонент из стартового пакета предоставляет некоторый шаблон для подписки на изменения освещения. - В функцию
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;
}
Проверьте внесенные изменения.
- Чтобы проверить внесенные изменения, нажмите «Файл» > «Сборка и запуск» .
- Рассматривая объекты на сцене, вы можете заметить, что их цвет зависит от освещения окружающей среды.
- Если возможно, попробуйте изменить освещение. Например, выключите свет в комнате, где вы находитесь. Вы должны увидеть, как освещение объектов адаптируется к изменению реального освещения.

6. Подведение итогов
Поздравляем! Вы успешно завершили этот практический урок по Unity AR Foundation.
Что вы уже осветили
- Как настроить базовый проект с использованием Unity AR Foundation и Universal Rendering Pipeline.
- Как использовать
ARPlaneManagerдля подписки на новые самолеты. - Как использовать
Raycastдля поиска пересечений с виртуальной геометрией. - Как использовать
ARLightEstimationDataдля освещения сцены.
Следующие шаги
- Ознакомьтесь с примерами AR Foundation от Unity .
- Ознакомьтесь с документацией AR Foundation .
- Ознакомьтесь с документацией Google по расширениям ARCore для Unity AR Foundation .
Дополнительные задания
Если вы хотите развить созданную вами игру, вот несколько идей, которые вы могли бы реализовать:
- Добавьте в игру счетчик очков, изменив объект
TextMeshPro, который отображается при создании нового пакетаPackageManager. - Чтобы получать информацию о производительности во время игры, включите наложение информации о производительности .
- Используйте Persistent Raycasts для предварительного размещения новых объектов в сцене. Когда в этой области будет обнаружена плоскость, объект обновится и будет привязываться к этой плоскости.