Как разрабатывать приложения смешанной реальности для Microsoft HoloLens: создание проекта Unity 3D

В предыдущей части мы рассмотрели, что из себя представляет Microsoft HoloLens, какие для него существуют приложения, и установили средства разработки. В этой и следующих частях мы создадим простое Holographic-приложение с использованием Unity 3D. 

Начало работы

Создайте проект Unity 3D.  Выберите название и директорию. Вид приложения — 3D:

1-%c2%a6%d0%b1%c2%a6-%c2%a6%c2%ac%c2%a6%c2%a6-%c2%a6-%c2%a6%c2%ac%c2%a6%c2%a6-%c2%a6%c2%act%d0%90%c2%a6-%c2%a6%c2%a6%c2%a6%c2%a6t%d0%92%c2%a6

Откроется главное окно Unity. Первым делом настроим проект для работы на HoloLens. Сохраняем сцену, для простоты назовём её Main.

2-%c2%a6%d0%a3%c2%a6%c2%ac%c2%a6-%c2%a6-%c2%a6-%c2%a6-%c2%a6%c2%a6-%c2%a6%d0%ae%c2%a6%c2%a6%c2%a6-%c2%a6-unity

Главное окно Unity

Зайдите во вкладку File → Build Settings. Добавьте открытую сцену. В качестве целевой платформы укажите Windows Store и следующие настройки:

SDKUniversal 10
UWP Build TypeD3D
Build and Run onLocal Machine

Обязательно выделяем Unity C# Projects.

Build Settings

Build Settings

В разделе Others в Player Settings выделяем две настройки: Use 16-bit depth buffer и Virtual Reality Supported. Последняя настройка автоматически добавит Windows Holographic SDK. Затем в разделе Publishing Settings в Capabilities необходимо выбрать Microphone, Internet Client и Spatial Perception. Зачем это нужно, вы узнаете позже.

Теперь перейдем к настройке графики (в меню: EditProject SettingQuality). Выставляем по умолчанию Fastest. Данная опция рекомендуется, но не является финальной, и в дальнейшем вы можете экспериментировать с настройками. Для примера установим значение Texture Quality в Full Res.

Quality Settings

Quality Settings

Здесь же необходимо сразу прояснить требования к производительности для приложений HoloLens. Так как пользователь активно взаимодействует с окружающим пространством, обновления визуального отображения голограмм должны происходить с минимальной задержкой при максимально высоком качестве картинки. Также надо учесть, что на каждое приложение выделяется не более 900 МБ оперативной памяти. По-хорошему, необходимо достичь стандартных 60 кадров в секунду и поддерживать это состояние на всём жизненном цикле приложения. В противном случае значительно возрастает нагрузка на HPU и увеличивается расход энергии и температура. Это также отражается на качестве голограмм, которые начинают отображаться с задержкой, неправильно взаимодействовать друг с другом и с объектами реального мира, нарушая законы физики и здравого смысла. О способах повышения производительности вы узнаете в следующих статьях нашего цикла. Один из них — использование 16-битного буфера глубины, и соответствующую опцию мы как раз включали в Player Settings.

С настройками проекта мы разобрались. До создания первого приложения остаётся сделать всего пару шагов.

Настройте камеру (Camera main) для работы с HoloLens. То, что видит ваша камера — это то, что видит пользователь. А поскольку пользователь должен видеть реальный мир с добавлением голограмм, то и фон у камеры должен быть прозрачным. Чтобы задать его выберите камеру, в инспекторе поменяйте значение Clear Flag на Solid Color, а в Background задайте #00000000 (черный цвет со значением альфа-канала 0, или RGBA = (0,0,0,0)). Позицию и поворот камеры сбросьте в (0,0,0). Наконец, установите значение Near Clip Plane равным 0.85 для того, чтобы голограммы не рендерились слишком близко от пользователя.

Для удобства тестирования приложения в Unity добавьте скрипт SimpleCameraMover и прикрепите его к камере:

public class CameraSimpleMover : MonoBehaviour {
    private float _yaw = 0.0f;
    private float _pitch = 0.0f;

    public float Speed = 2f;
    public float SpeedH = 2.0f;
    public float SpeedV = 2.0f;

#if UNITY_EDITOR
    void Update() {
        if (Input.GetKey(KeyCode.W))
            transform.position += transform.forward*Speed*Time.deltaTime;
        if (Input.GetKey(KeyCode.S))
            transform.position += transform.forward*Speed*Time.deltaTime*-1f;
        if (Input.GetKey(KeyCode.A))
            transform.position += transform.right*Speed*Time.deltaTime*-1f;
        if (Input.GetKey(KeyCode.D))
            transform.position += transform.right*Speed*Time.deltaTime;
        if (Input.GetKey(KeyCode.E))
            transform.position += transform.up*Speed*Time.deltaTime;
        if (Input.GetKey(KeyCode.Q))
            transform.position += transform.up*Speed*Time.deltaTime*-1f;

        _yaw += SpeedH * Input.GetAxis("Mouse X");
        _pitch -= SpeedV * Input.GetAxis("Mouse Y");
        transform.eulerAngles = new Vector3(_pitch, _yaw, 0.0f);
    }
#endif
}

Теперь можно поворачивать и перемещать камеру — иными словами, имитировать движение пользователя.

Дополнительно необходимо скачать HoloToolkit — набор скриптов и компонентов, созданных для ускорения разработки под HoloLens. Далее копируем репозиторий с GitHub, и, следуя инструкциям, импортируем в Unity. В принципе, вы можете обойтись без него и писать все классы сами. В некоторых случаях это будет оправдано. Но всё же рекомендуем добавлять его во все ваши проекты, так как он значительно упрощает работу.

Напоследок, рекомендуем добавить в папку Assets/Editor скрипт для автоматической сборки проекта:

public class Builder : MonoBehaviour {
    [MenuItem("Build/Fastest")]
    public static void BuildStandalone() {
        string errorMessage = string.Empty;
        try
        {
            var path = "cars_build";
            var levels = new[] { "Assets/Main.unity" };
            PlayerSettings.productName = "Cars Analyzer";
            PlayerSettings.WSA.packageName = "Cars Analyzer";
            PlayerSettings.WSA.tileShortName = "Cars Analyzer";
            QualitySettings.SetQualityLevel(0);
            errorMessage = BuildPipeline.BuildPlayer(levels, path + "/Standalone", BuildTarget.WSAPlayer, BuildOptions.Development);
        }
        catch (Exception e)
        {
            Debug.LogError("Error Building");
            Debug.LogError(e.Message);
            Debug.LogError(errorMessage);
        }
    }
}

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

Всё готово к работе. Текущее состояние проекта можно сохранить отдельно и использовать как «заготовку» на будущее.


Выражаем благодарность Тимуру Ахметову, разработчику из компании HoloGroup и департаменту стратегических технологий Microsoft за предоставленный материал.

Для справки: HoloGroup является одним из первых разработчиков для HoloLens в России и 1 сентября 2016 года выпустила первое русскоязычное приложение HoloStudy.