Поделиться через


HoloLens (1-го поколения) и Azure 308: уведомления на нескольких устройствах


Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при их публикации.


конечный продукт -start

В этом курсе вы узнаете, как добавить возможности Центров уведомлений в приложение смешанной реальности с помощью Центров уведомлений Azure, таблиц Azure и Функции Azure.

Центры уведомлений Azure — это служба Майкрософт, которая позволяет разработчикам отправлять целевые и персонализированные push-уведомления на любую платформу на базе облака. Это позволяет разработчикам общаться с конечными пользователями или даже взаимодействовать между различными приложениями в зависимости от сценария. Дополнительные сведения см. на страницеЦентров уведомлений Azure.

Функции Azure — это служба Майкрософт, которая позволяет разработчикам выполнять небольшие фрагменты кода (функции) в Azure. Это позволяет делегировать работу в облако, а не в локальное приложение, что может иметь множество преимуществ. Функции Azure поддерживает несколько языков разработки, включая C#, F#, Node.js, Java и PHP. Дополнительные сведения см. на Функции Azureстраницах.

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

После прохождения этого курса вы получите приложение для иммерсивной гарнитуры смешанной реальности и приложение для настольных компьютеров, которое сможет выполнять следующие действия:

  1. Приложение для настольных компьютеров позволит пользователю перемещать объект в двухd пространстве (X и Y) с помощью мыши.

  2. Перемещение объектов в приложении для ПК будет отправлено в облако с помощью JSON, который будет иметь вид строки, содержащей идентификатор объекта, тип и сведения о преобразовании (координаты X и Y).

  3. Приложение смешанной реальности, которое имеет идентичную сцену классическому приложению, будет получать уведомления о перемещении объектов из службы Центров уведомлений (которая только что была обновлена классическим приложением для пк).

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

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

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
308. Смешанная реальность и Azure: уведомления на разных устройствах ✔️ ✔️

Примечание

Хотя в этом курсе основное внимание уделяется Windows Mixed Reality иммерсивным гарнитурам ( VR), вы также можете применить то, что вы узнали в этом курсе, для Microsoft HoloLens. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки HoloLens. При использовании HoloLens вы можете заметить некоторое эхо во время захвата голоса.

Предварительные требования

Примечание

Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было проверено и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.

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

Перед началом работы

  • Чтобы избежать проблем при сборке этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
  • Вы должны быть владельцем портала разработчика Майкрософт и портала регистрации приложений, в противном случае у вас не будет разрешения на доступ к приложению в главе 2.

Глава 1. Создание приложения на портале разработчика Майкрософт

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

  1. Войдите на портал разработчика Майкрософт.

    Вам потребуется войти в учетную запись Майкрософт.

  2. На панели мониторинга щелкните Создать новое приложение.

    Создание приложения

  3. Появится всплывающее окно, в котором необходимо зарезервировать имя для нового приложения. В текстовое поле вставьте соответствующее имя; Если выбранное имя доступно, справа от текстового поля появится галочка. Вставив доступное имя, нажмите кнопку Зарезервировать название продукта в левом нижнем углу всплывающего окна.

    обратное имя

  4. Теперь, когда приложение создано, вы можете перейти к следующей главе.

Глава 2. Получение учетных данных новых приложений

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

  1. Перейдите на портал регистрации приложений.

    портал регистрации приложений

    Предупреждение

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

  2. Приложение можно найти в разделе Мои приложения . После того как вы найдете его, щелкните его, и вы перейдете на новую страницу с именем приложения и регистрацией.

    только что зарегистрированное приложение

  3. Прокрутите страницу регистрации вниз, чтобы найти раздел Секреты приложения и идентификатор безопасности пакета для вашего приложения. Скопируйте оба параметра для использования при настройке службы Центров уведомлений Azure в следующей главе.

    секреты приложения

Глава 3. Настройка портала Azure: создание службы центров уведомлений

После получения учетных данных приложений необходимо перейти на портал Azure, где вы создадите службу Центров уведомлений Azure.

  1. Войдите на портал Azure.

    Примечание

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

  2. Выполнив вход, щелкните Создать в левом верхнем углу, найдите центр уведомлений и нажмите клавишу ВВОД.

    Поиск центра уведомлений

    Примечание

    Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).

  3. На новой странице будет представлено описание службы Центров уведомлений . В левом нижнем углу этого запроса нажмите кнопку Создать , чтобы создать связь с этой службой.

    Создание экземпляра центров уведомлений

  4. После нажатия кнопки Создать:

    1. Вставьте нужное имя для этого экземпляра службы.

    2. Укажите пространство имен , которое можно будет связать с этим приложением.

    3. Выберите расположение.

    4. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.

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

    5. Выберите соответствующую подписку.

    6. Вам также потребуется подтвердить, что вы поняли условия, применяемые к этой Службе.

    7. Нажмите кнопку создания.

      укажите сведения о службе

  5. После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.

  6. После создания экземпляра службы на портале появится уведомление.

    Уведомления

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

    Снимок экрана: кнопка

  8. На странице обзора на полпути страницы щелкните Windows (WNS). На панели справа будут отображаться два текстовых поля, для которых требуются идентификатор безопасности пакета и ключ безопасности, из приложения, настроенного ранее.

    только что созданная служба концентраторов

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

    копирование сведений о безопасности

Глава 4. Настройка портала Azure: создание службы таблиц

После создания экземпляра службы Центров уведомлений вернитесь на портал Azure, где создадите службу таблиц Azure, создав ресурс хранилища.

  1. Если он еще не выполнен, войдите на портал Azure.

  2. После входа щелкните Создать в левом верхнем углу, найдите учетную запись хранения и нажмите клавишу ВВОД.

    Примечание

    Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).

  3. В списке выберите Учетная запись хранения — BLOB-объект, файл, таблица, очередь .

    поиск учетной записи хранения

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

    создание экземпляра хранилища

  5. После нажатия кнопки Создать появится панель:

    1. Вставьте нужное имя для этого экземпляра службы (должно быть в нижнем регистре).

    2. Для параметра Модель развертывания щелкните Resource Manager.

    3. В поле Тип учетной записи в раскрывающемся меню выберите Хранилище (общего назначения версии 1).

    4. Выберите подходящее расположение.

    5. В раскрывающемся меню Репликация выберите Геоизбыточное хранилище с доступом на чтение (RA-GRS).

    6. Для параметра Производительность щелкните Стандартный.

    7. В разделе Требуется безопасное перемещение выберите Отключено.

    8. В раскрывающемся меню Подписка выберите соответствующую подписку.

    9. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.

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

    10. Если это вариант, оставьте значение Виртуальные сетиотключенными .

    11. Нажмите кнопку Создать.

      введите сведения о хранилище

  6. После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.

  7. После создания экземпляра службы на портале появится уведомление. Щелкните уведомления, чтобы просмотреть новый экземпляр службы.

    Уведомление о новом хранилище

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

    Снимок экрана: кнопка

  9. На странице обзора справа щелкните Таблицы.

    Снимок экрана, на котором показано, где выбрать таблицы.

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

    открытие таблиц

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

    Создание новой таблицы

  12. После создания новой таблицы вы сможете увидеть ее на странице службы таблиц (внизу).

    создана новая таблица

Глава 5. Завершение работы с таблицей Azure в Visual Studio

Теперь, когда учетная запись хранения службы таблиц настроена, пора добавить в нее данные, которые будут использоваться для хранения и извлечения информации. Редактирование таблиц можно выполнить с помощью Visual Studio.

  1. Откройте Visual Studio.

  2. В меню выберите команду Просмотреть>облачные Обозреватель.

    Открыть облачный обозреватель

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

    Примечание

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

    • Войдите в ту же учетную запись, что и для портала Azure.

    • Выберите подписку на странице управление учетными записями (возможно, потребуется применить фильтр из параметров учетной записи):

      Найти подписку

  4. Будут показаны облачные службы Azure. Найдите Учетные записи хранения и щелкните стрелку слева от нее, чтобы развернуть свои учетные записи.

    открытие учетных записей хранения

  5. После развертывания только что созданная учетная запись хранения станет доступной. Щелкните стрелку слева от хранилища, а затем после развертывания найдите Таблицы и щелкните стрелку рядом с ней, чтобы отобразить таблицу , созданную в последней главе. Дважды щелкните таблицу.

    Открытая таблица объектов сцены

  6. Таблица будет открыта в центре окна Visual Studio. Щелкните значок таблицы с элементом + (плюс).

    Добавление новой таблицы

  7. Появится окно с предложением Добавить сущность. Всего вы создадите три сущности, каждая из которых имеет несколько свойств. Вы заметите, что PartitionKey и RowKey уже предоставлены, так как они используются таблицей для поиска данных.

    раздел и ключ строки

  8. Обновите значенияPartitionKey и RowKey следующим образом (не забудьте сделать это для каждого добавляемого свойства строки, хотя каждый раз увеличивать значение RowKey):

    добавление правильных значений

  9. Щелкните Добавить свойство , чтобы добавить дополнительные строки данных. Сделайте первую пустую таблицу соответствующей таблице ниже.

  10. По завершении нажмите кнопку ОК .

    По завершении нажмите кнопку ОК.

    Предупреждение

    Убедитесь, что вы изменили тип записей X, Y и Z на Double.

  11. Вы заметите, что таблица теперь содержит строку данных. + Щелкните значок (плюс) еще раз, чтобы добавить другую сущность.

    первая строка

  12. Создайте дополнительное свойство, а затем задайте значения новой сущности в соответствии с приведенными ниже.

    Добавление куба

  13. Повторите последний шаг, чтобы добавить другую сущность. Задайте для этой сущности значения, показанные ниже.

    Добавить цилиндр

  14. Теперь таблица должна выглядеть так, как показано ниже.

    таблица завершена

  15. Вы завершили работу с этой главой. Обязательно сохраните.

Глава 6. Создание приложения-функции Azure

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

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

  1. Откройте Блокнот (нажмите клавишу Windows и введите Блокнот).

    Открыть Блокнот

  2. Открыв Блокнот, вставьте в него структуру JSON ниже. После этого сохраните его на рабочем столе как project.json. Важно, чтобы имя было правильным: убедитесь, что у него нет расширения файла .txt . Этот файл определяет библиотеки, которые будет использовать функция. Если вы использовали NuGet, он будет выглядеть знакомо.

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "7.0.0",
            "Microsoft.Azure.NotificationHubs" : "1.0.9",
            "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0"
        }
        }
    }
    }
    
  3. Войдите на портал Azure.

  4. После входа щелкните Создать в левом верхнем углу и найдите приложение-функцию, нажмите клавишу ВВОД.

    поиск приложения-функции

    Примечание

    Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).

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

    Экземпляр приложения-функции

  6. После нажатия кнопки Создать заполните следующее:

    1. В поле Имя приложения вставьте нужное имя для этого экземпляра службы.

    2. Выберите подписку.

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

    4. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.

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

    5. Для ОС выберите Windows, так как это предназначенная платформа.

    6. Выберите план размещения (в этом руководстве используется план потребления).

    7. Выберите расположение(выберите то же расположение, что и хранилище, созданное на предыдущем шаге)

    8. В разделе Хранилищенеобходимо выбрать службу хранилища, созданную на предыдущем шаге.

    9. Вам не потребуется Application Insights в этом приложении, поэтому не стесняйтесь оставить его отключенным.

    10. Нажмите кнопку Создать.

      создание нового экземпляра

  7. После нажатия кнопки Создать вам придется дождаться создания службы. Это может занять минуту.

  8. После создания экземпляра службы на портале появится уведомление.

    Новое уведомление

  9. Щелкните уведомления, чтобы просмотреть новый экземпляр службы.

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

    Снимок экрана:

  11. + Щелкните значок (плюс) рядом с элементом Функции, чтобы создать.

    Добавить новую функцию

  12. На центральной панели появится окно создания функции . Игнорируйте сведения в верхней части панели и щелкните Пользовательская функция, расположенная в нижней части (в синей области, как показано ниже).

    пользовательская функция

  13. На новой странице в окне будут отображаться различные типы функций. Прокрутите вниз, чтобы просмотреть фиолетовые типы, и щелкните элемент HTTP PUT .

    ссылка http put

    Важно!

    Возможно, вам придется прокрутить страницу вниз (и это изображение может не выглядеть точно так же, если произошли обновления на портале Azure), однако вы ищете элемент с именем HTTP PUT.

  14. Откроется окно HTTP PUT , в котором необходимо настроить функцию (изображение см. ниже).

    1. В поле Язык в раскрывающемся меню выберите C#.

    2. В поле Имя введите соответствующее имя.

    3. В раскрывающемся меню Уровень проверки подлинности выберите Функция.

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

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

      Снимок экрана: раздел подключения к учетной записи хранения с выбранной гиперссылкой

  15. Нажмите кнопку Создать, и вы получите уведомление о том, что параметры успешно обновлены.

    Функция create

  16. После нажатия кнопки Создать вы будете перенаправлены в редактор функций.

    Обновление кода функции

  17. Вставьте следующий код в редактор функций (заменив код в функции):

    #r "Microsoft.WindowsAzure.Storage"
    
    using System;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Table;
    using Microsoft.Azure.NotificationHubs;
    using Newtonsoft.Json;
    
    public static async Task Run(UnityGameObject gameObj, CloudTable table, IAsyncCollector<Notification> notification, TraceWriter log)
    {
        //RowKey of the table object to be changed
        string rowKey = gameObj.RowKey;
    
        //Retrieve the table object by its RowKey
        TableOperation operation = TableOperation.Retrieve<UnityGameObject>("UnityPartitionKey", rowKey); 
    
        TableResult result = table.Execute(operation);
    
        //Create a UnityGameObject so to set its parameters
        UnityGameObject existingGameObj = (UnityGameObject)result.Result; 
    
        existingGameObj.RowKey = rowKey;
        existingGameObj.X = gameObj.X;
        existingGameObj.Y = gameObj.Y;
        existingGameObj.Z = gameObj.Z;
    
        //Replace the table appropriate table Entity with the value of the UnityGameObject
        operation = TableOperation.Replace(existingGameObj); 
    
        table.Execute(operation);
    
        log.Verbose($"Updated object position");
    
        //Serialize the UnityGameObject
        string wnsNotificationPayload = JsonConvert.SerializeObject(existingGameObj);
    
        log.Info($"{wnsNotificationPayload}");
    
        var headers = new Dictionary<string, string>();
    
        headers["X-WNS-Type"] = @"wns/raw";
    
        //Send the raw notification to subscribed devices
        await notification.AddAsync(new WindowsNotification(wnsNotificationPayload, headers)); 
    
        log.Verbose($"Sent notification");
    }
    
    // This UnityGameObject represent a Table Entity
    public class UnityGameObject : TableEntity
    {
        public string Type { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
        public string RowKey { get; set; }
    }
    

    Примечание

    Используя включенные библиотеки, функция получает имя и расположение объекта, который был перемещен в сцене Unity (в виде объекта C# с именем UnityGameObject). Затем этот объект используется для обновления параметров объекта в созданной таблице. После этого функция вызывает созданную службу центра уведомлений, которая уведомляет все подписанные приложения.

  18. Указав код, нажмите кнопку Сохранить.

  19. Затем щелкните < значок (стрелка) в правой части страницы.

    открыть панель отправки

  20. Панель будет скользить справа. На этой панели нажмите кнопку Отправить, и откроется окно Обозреватель файлов.

  21. Перейдите к файлу project.json , созданному ранее в Блокноте , и нажмите кнопку Открыть . Этот файл определяет библиотеки, которые будет использовать функция.

    отправка json

  22. После отправки файла он появится на панели справа. Щелкнув его, он откроется в редакторе функций . Он должен выглядеть точно так же, как и на следующем рисунке (ниже шаг 23).

  23. Затем на панели слева в разделе Функции щелкните ссылку Интегрировать .

    Функция интеграции

  24. На следующей странице в правом верхнем углу щелкните Расширенный редактор (как показано ниже).

    Открыть расширенный редактор

  25. На центральной панели откроется файл function.json , который необходимо заменить следующим фрагментом кода. Это определяет создаваемую функцию и параметры, передаваемые в функцию.

    {
    "bindings": [
        {
        "authLevel": "function",
        "type": "httpTrigger",
        "methods": [
            "get",
            "post"
        ],
        "name": "gameObj",
        "direction": "in"
        },
        {
        "type": "table",
        "name": "table",
        "tableName": "SceneObjectsTable",
        "connection": "mrnothubstorage_STORAGE",
        "direction": "in"
        },
        {
        "type": "notificationHub",
        "direction": "out",
        "name": "notification",
        "hubName": "MR_NotHub_ServiceInstance",
        "connection": "MRNotHubNS_DefaultFullSharedAccessSignature_NH",
        "platform": "wns"
        }
    ]
    }
    
  26. Теперь редактор должен выглядеть так, как показано на рисунке ниже:

    Вернуться к стандартному редактору

  27. Вы можете заметить, что только что вставленные входные параметры могут не соответствовать сведениям о таблице и хранилище, поэтому их потребуется обновить. Не делайте этого здесь, так как это рассматривается далее. Просто щелкните ссылку Стандартный редактор в правом верхнем углу страницы, чтобы вернуться назад.

  28. Вернитесь в стандартный редактор и щелкните Хранилище таблиц Azure (таблица) в разделе Входные данные.

    Входные данные таблицы

  29. Убедитесь, что приведенные ниже данные соответствуют вашим данным, так как они могут отличаться (ниже приведено изображение):

    1. Имя таблицы: имя таблицы, созданной в службе хранилища Azure.

    2. Подключение к учетной записи хранения: щелкните создать, который появится рядом с раскрывающимся меню, и справа от окна появится панель.

      Снимок экрана: окно учетной записи хранения с выделенным элементом

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

      2. Вы заметите, что значение подключения учетной записи хранения создано.

      3. После завершения нажмите кнопку Сохранить .

    3. Теперь страница Входные данные должна соответствовать приведенной ниже информации.

      входные данные завершены

  30. Затем щелкните Центр уведомлений Azure (уведомление) в разделе Выходные данные. Убедитесь, что следующие данные соответствуют вашим данным, так как они могут отличаться (ниже приведено изображение):

    1. Имя центра уведомлений. Это имя созданного ранее экземпляра службы центра уведомлений .

    2. Подключение к пространству имен Центров уведомлений: нажмите кнопку Создать, которая появится рядом с раскрывающимся меню.

      выходные данные проверка

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

    4. Выберите имя центра уведомлений в среднем раскрывающемся меню.

    5. В раскрывающемся меню Политика задайте значение DefaultFullSharedAccessSignature.

    6. Нажмите кнопку Выбрать , чтобы вернуться.

      обновление выходных данных

  31. Теперь страница Выходные данные должна соответствовать приведенному ниже значению, но с вашими данными. Не забудьте нажать кнопку Сохранить.

Предупреждение

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

Снимок экрана: страница

  1. На этом этапе необходимо протестировать функцию, чтобы убедиться, что она работает. Для этого выполните следующие действия.

    1. Еще раз перейдите на страницу функции:

      Снимок экрана: страница функций с выделенной созданной функцией.

    2. Вернитесь на страницу функции и щелкните вкладку Тест в правой части страницы, чтобы открыть колонку Тест :

      Снимок экрана: страница функций с выделенным элементом

    3. В текстовое поле Текст запроса колонки вставьте следующий код:

      {  
          "Type":null,
          "X":3,
          "Y":0,
          "Z":1,
          "PartitionKey":null,
          "RowKey":"Obj2",
          "Timestamp":"0001-01-01T00:00:00+00:00",
          "ETag":null
      }
      
    4. После размещения тестового кода нажмите кнопку Выполнить в правом нижнем углу, и тест будет выполнен. Журналы выходных данных теста будут отображаться в области консоли под кодом функции.

      Снимок экрана: журналы выходных данных теста в области консоли.

    Предупреждение

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

Глава 7. Настройка проекта Unity для настольных приложений

Важно!

Создаваемое классическое приложение не будет работать в редакторе Unity. Его необходимо запускать вне редактора после сборки приложения с помощью Visual Studio (или развернутого приложения).

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

Настройте и протестируйте иммерсивную гарнитуру смешанной реальности.

Примечание

Контроллеры движения для этого курса не требуются. Если вам нужна поддержка по настройке иммерсивной гарнитуры, перейдите по этой ссылке, чтобы узнать, как настроить Windows Mixed Reality.

  1. Откройте Unity и нажмите кнопку Создать.

    Снимок экрана: окно

  2. Необходимо указать имя проекта Unity, вставьте UnityDesktopNotifHub. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.

    создание проекта

  3. При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение>параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .

    Настройка внешних средств VS

  4. Затем перейдите враздел Параметры сборкифайла> и выберите универсальная платформа Windows, а затем нажмите кнопку Переключить платформу, чтобы применить выбранный вариант.

    переключение платформ

  5. Оставаясь впараметрах сборкифайла>, убедитесь, что:

    1. Для целевого устройства задано значение Любое устройство.

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

    2. Для параметра Тип сборки задано значение D3D.

    3. Для пакета SDK задано значение Последняя установленная

    4. Для версии Visual Studio задано значение Последняя установленная версия

    5. Для сборки и запуска задано значение Локальный компьютер.

    6. Здесь стоит сохранить сцену и добавить ее в сборку.

      1. Для этого выберите Добавить открытые сцены. Появится окно сохранения.

        Снимок экрана: выделенный элемент

      2. Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку, назовите ее Scenes.

        Снимок экрана: новая папка Scenes, созданная с выделенным элементом

      3. Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла введитеNH_Desktop_Scene, а затем нажмите кнопку Сохранить.

        новые NH_Desktop_Scene

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

  6. В том же окне нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке Другие параметры :

      1. Версия среды выполнения сценариев должна быть экспериментальной (эквивалент .NET 4.6)

      2. Серверная часть сценариев должна быть .NET

      3. Уровень совместимости API должен быть .NET 4.6

        Версия 4.6 net

    2. На вкладке Параметры публикации в разделе Возможности проверка:

      • InternetClient;

        Снимок экрана: internetClient, выбранный в разделе

  8. Вернувшись в параметры сборки, проекты C# Unity больше не выделены серым цветом; Установите флажок рядом с этим.

  9. Закройте окно Build Settings (Параметры сборки).

  10. Сохраните сцену и файл> проекта, сохраните сцену или файл>сохранить проект.

    Важно!

    Если вы хотите пропустить компонент настройки Unity для этого проекта (классическое приложение) и перейти непосредственно к коду, скачайте этот файл .unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем перейдите к главе 9. Вам по-прежнему потребуется добавить компоненты скрипта.

Глава 8. Импорт библиотек DLL в Unity

Вы будете использовать службу хранилища Azure для Unity (которая сама использует пакет SDK для .NET для Azure). Дополнительные сведения см. по этой ссылке о службе хранилища Azure для Unity.

В настоящее время в Unity существует известная проблема, которая требует перенастройки подключаемых модулей после импорта. Эти действия (4–7 в этом разделе) больше не требуются после устранения ошибки.

Чтобы импортировать пакет SDK в собственный проект, убедитесь, что вы скачали последнюю версию .unitypackage из GitHub. Затем сделайте следующее.

  1. Добавьте .unitypackage в Unity с помощью параметра меню Пользовательский пакет импорта пакета > ресурсов>.

  2. В появившемся окне Импорт пакета Unity можно выбрать все в разделе Хранилищеподключаемого модуля>. Снимите все остальные флажки, так как это не требуется для этого курса.

    импорт в пакет

  3. Нажмите кнопку Импорт , чтобы добавить элементы в проект.

  4. Перейдите в папку Хранилище в разделе Подключаемые модули в представлении проекта и выберите только следующие подключаемые модули:

    • Microsoft.Data.Edm
    • Microsoft.Data.OData
    • Microsoft.WindowsAzure.Storage
    • Newtonsoft.Json.
    • System.Spatial

Снимите флажок Любая платформа

  1. Выбрав эти подключаемые модули , снимите флажокЛюбая платформаиWSAPlayer , а затем нажмите кнопку Применить.

    Применение библиотек DLL платформы

    Примечание

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

  2. В папке Подключаемого модуля хранилища выберите только:

    • Microsoft.Data.Services.Client

      set не обрабатывать для библиотек DLL

  3. Установите флажок Не обрабатывать в разделе Параметры платформы и нажмите кнопку Применить.

    применение без обработки

    Примечание

    Мы помечаем этот подключаемый модуль как "Не обрабатывать", так как средство исправления сборки Unity испытывает трудности при обработке этого подключаемого модуля. Подключаемый модуль по-прежнему будет работать, даже если он не обрабатывается.

Глава 9. Создание класса TableToScene в проекте Desktop Unity

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

Первым скриптом, который необходимо создать, является TableToScene, который отвечает за:

  • Чтение сущностей в таблице Azure.
  • С помощью данных таблицы определите, какие объекты следует порождать и в какой позиции.

Второй скрипт, который необходимо создать, — CloudScene, который отвечает за:

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

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Щелкните правой кнопкой мыши папку asset , расположенную на панели проектов, в разделе Создать>папку. Назовите папку Scripts.

    Папка create scripts

    Папка создания скриптов 2

  2. Дважды щелкните только что созданную папку, чтобы открыть ее.

  3. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать>скрипт C#. Назовите скрипт TableToScene.

    Снимок экрана: создание скрипта TableToScene.Переименование TableToScene

  4. Дважды щелкните скрипт, чтобы открыть его в Visual Studio 2017.

  5. Добавьте приведенные ниже пространства имен.

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Table;
    using UnityEngine;
    
  6. В классе вставьте следующие переменные:

        /// <summary>    
        /// allows this class to behave like a singleton
        /// </summary>    
        public static TableToScene instance;
    
        /// <summary>    
        /// Insert here you Azure Storage name     
        /// </summary>    
        private string accountName = " -- Insert your Azure Storage name -- ";
    
        /// <summary>    
        /// Insert here you Azure Storage key    
        /// </summary>    
        private string accountKey = " -- Insert your Azure Storage key -- ";
    

    Примечание

    Замените значение accountName именем службы хранилища Azure, а значение accountKey — значением ключа в службе хранилища Azure на портале Azure (см. рисунок ниже).

    Получение ключа учетной записи

  7. Теперь добавьте методы Start() и Awake() для инициализации класса .

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {  
            // Call method to populate the scene with new objects as 
            // pecified in the Azure Table
            PopulateSceneFromTableAsync();
        }
    
  8. В классе TableToScene добавьте метод , который будет извлекать значения из таблицы Azure и использовать их для создания соответствующих примитивов в сцене.

        /// <summary>    
        /// Populate the scene with new objects as specified in the Azure Table    
        /// </summary>    
        private async void PopulateSceneFromTableAsync()
        {
            // Obtain credentials for the Azure Storage
            StorageCredentials creds = new StorageCredentials(accountName, accountKey);
    
            // Storage account
            CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);
    
            // Storage client
            CloudTableClient client = account.CreateCloudTableClient(); 
    
            // Table reference
            CloudTable table = client.GetTableReference("SceneObjectsTable");
    
            TableContinuationToken token = null;
    
            // Query the table for every existing Entity
            do
            {
                // Queries the whole table by breaking it into segments
                // (would happen only if the table had huge number of Entities)
                TableQuerySegment<AzureTableEntity> queryResult = await table.ExecuteQuerySegmentedAsync(new TableQuery<AzureTableEntity>(), token); 
    
                foreach (AzureTableEntity entity in queryResult.Results)
                {
                    GameObject newSceneGameObject = null;
                    Color newColor;
    
                    // check for the Entity Type and spawn in the scene the appropriate Primitive
                    switch (entity.Type)
                    {
                        case "Cube":
                            // Create a Cube in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
                            newColor = Color.blue;
                            break;
    
                        case "Sphere":
                            // Create a Sphere in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                            newColor = Color.red;
                            break;
    
                        case "Cylinder":
                            // Create a Cylinder in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                            newColor = Color.yellow;
                            break;
                        default:
                            newColor = Color.white;
                            break;
                    }
    
                    newSceneGameObject.name = entity.RowKey;
    
                    newSceneGameObject.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse"))
                    {
                        color = newColor
                    };
    
                    //check for the Entity X,Y,Z and move the Primitive at those coordinates
                    newSceneGameObject.transform.position = new Vector3((float)entity.X, (float)entity.Y, (float)entity.Z);
                }
    
                // if the token is null, it means there are no more segments left to query
                token = queryResult.ContinuationToken;
            }
    
            while (token != null);
        }
    
  9. За пределами класса TableToScene необходимо определить класс, используемый приложением для сериализации и десериализации сущностей таблицы.

        /// <summary>
        /// This objects is used to serialize and deserialize the Azure Table Entity
        /// </summary>
        [System.Serializable]
        public class AzureTableEntity : TableEntity
        {
            public AzureTableEntity(string partitionKey, string rowKey)
                : base(partitionKey, rowKey) { }
    
            public AzureTableEntity() { }
            public string Type { get; set; }
            public double X { get; set; }
            public double Y { get; set; }
            public double Z { get; set; }
        }
    
  10. Перед возвращением в редактор Unity убедитесь, что вы сохранили его.

  11. Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.

  12. Открыв папку Скрипты , выберите файл скрипта TableToScene и перетащите его на главную камеру. Результат должен выглядеть следующим образом:

    Добавление скрипта в камеру main

Глава 10. Создание класса CloudScene в проекте Desktop Unity

Второй скрипт, который необходимо создать, — CloudScene, который отвечает за:

  • Регистрация события щелчка левой кнопкой мыши, чтобы разрешить пользователю перетаскивать объекты вокруг сцены.

  • Сериализация данных объекта из этой сцены Unity и их отправка в приложение-функцию Azure.

Чтобы создать второй скрипт, выполните следующие действия.

  1. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать, Скрипт C#. Присвойт скрипту имя CloudScene

    Снимок экрана: создание скрипта CloudScene.переименование CloudScene

  2. Добавьте приведенные ниже пространства имен.

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.Networking;
    
  3. Вставьте следующие переменные:

        /// <summary>
        /// Allows this class to behave like a singleton
        /// </summary>
        public static CloudScene instance;
    
        /// <summary>
        /// Insert here you Azure Function Url
        /// </summary>
        private string azureFunctionEndpoint = "--Insert here you Azure Function Endpoint--";
    
        /// <summary>
        /// Flag for object being moved
        /// </summary>
        private bool gameObjHasMoved;
    
        /// <summary>
        /// Transform of the object being dragged by the mouse
        /// </summary>
        private Transform gameObjHeld;
    
        /// <summary>
        /// Class hosted in the TableToScene script
        /// </summary>
        private AzureTableEntity azureTableEntity;
    
  4. Замените значение azureFunctionEndpoint URL-адресом приложения-функции Azure в Служба приложений Функции Azure на портале Azure, как показано на рисунке ниже.

    Получение URL-адреса функции

  5. Теперь добавьте методы Start() и Awake() для инициализации класса .

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // initialise an AzureTableEntity
            azureTableEntity = new AzureTableEntity();
        }
    
  6. В метод Update() добавьте следующий код, который будет обнаруживать входные данные с помощью мыши и перетаскивать их, что, в свою очередь, приведет к перемещению Объектов GameObject в сцене. Если пользователь перетаскивает объект, он передает имя и координаты объекта методу UpdateCloudScene(), который вызовет службу приложения-функции Azure, которая обновит таблицу Azure и запустит уведомление.

        /// <summary>
        /// Update is called once per frame
        /// </summary>
        void Update()
        {
            //Enable Drag if button is held down
            if (Input.GetMouseButton(0))
            {
                // Get the mouse position
                Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
    
                Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePosition);
    
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    
                RaycastHit hit;
    
                // Raycast from the current mouse position to the object overlapped by the mouse
                if (Physics.Raycast(ray, out hit))
                {
                    // update the position of the object "hit" by the mouse
                    hit.transform.position = objPos;
    
                    gameObjHasMoved = true;
    
                    gameObjHeld = hit.transform;
                }
            }
    
            // check if the left button mouse is released while holding an object
            if (Input.GetMouseButtonUp(0) && gameObjHasMoved)
            {
                gameObjHasMoved = false;
    
                // Call the Azure Function that will update the appropriate Entity in the Azure Table
                // and send a Notification to all subscribed Apps
                Debug.Log("Calling Azure Function");
    
                StartCoroutine(UpdateCloudScene(gameObjHeld.name, gameObjHeld.position.x, gameObjHeld.position.y, gameObjHeld.position.z));
            }
        }
    
  7. Теперь добавьте метод UpdateCloudScene(), как показано ниже:

        private IEnumerator UpdateCloudScene(string objName, double xPos, double yPos, double zPos)
        {
            WWWForm form = new WWWForm();
    
            // set the properties of the AzureTableEntity
            azureTableEntity.RowKey = objName;
    
            azureTableEntity.X = xPos;
    
            azureTableEntity.Y = yPos;
    
            azureTableEntity.Z = zPos;
    
            // Serialize the AzureTableEntity object to be sent to Azure
            string jsonObject = JsonConvert.SerializeObject(azureTableEntity);
    
            using (UnityWebRequest www = UnityWebRequest.Post(azureFunctionEndpoint, jsonObject))
            {
                byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonObject);
    
                www.uploadHandler = new UploadHandlerRaw(jsonToSend);
    
                www.uploadHandler.contentType = "application/json";
    
                www.downloadHandler = new DownloadHandlerBuffer();
    
                www.SetRequestHeader("Content-Type", "application/json");
    
                yield return www.SendWebRequest();
    
                string response = www.responseCode.ToString();
            }
        }
    
  8. Сохраните код и вернитесь в Unity

  9. Перетащите скрипт CloudScene на главную камеру.

    1. Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.

    2. Открыв папку Scripts , выберите скрипт CloudScene и перетащите его на главную камеру. Результат должен выглядеть следующим образом:

      перетащите облачный скрипт на main камеру

Глава 11. Сборка классического проекта в UWP

Все необходимое для раздела Unity этого проекта завершено.

  1. Перейдите в раздел Параметры сборки (Параметры сборкифайла>).

  2. В окне Параметры сборки щелкните Сборка.

    Снимок экрана: окно

  3. Появится всплывающее окно проводник с запросом на выбор расположения для сборки. Создайте новую папку (щелкнув Создать папку в левом верхнем углу) и назовите ее BUILDS.

    новая папка для сборки

    1. Откройте новую папку BUILDS , создайте другую папку (с помощью команды Создать папку еще раз) и назовите ее NH_Desktop_App.

      имя папки NH_Desktop_App

    2. С выбранным NH_Desktop_App . Щелкните Выбрать папку. Сборка проекта займет около минуты.

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

Глава 12. Настройка Смешанная реальность проекта Unity

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

  1. Откройте Unity и нажмите кнопку Создать.

    Снимок экрана: окно

  2. Теперь необходимо указать имя проекта Unity, вставьте UnityMRNotifHub. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.

    name UnityMRNotifHub

  3. При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение>параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .

    Присвойте внешнему редактору значение VS

  4. Затем перейдите враздел Параметры сборкифайлов> и переключите платформу на универсальная платформа Windows, нажав кнопку Переключить платформу.

    переключение платформ на UWP

  5. Перейдите враздел Параметры сборкифайлов> и убедитесь, что:

    1. Для целевого устройства задано значение Любое устройство.

      Для Microsoft HoloLens задайте для параметра Целевое устройство значение HoloLens.

    2. Для параметра Тип сборки задано значение D3D.

    3. Для пакета SDK задано значение Последняя установленная версия.

    4. Версия Visual Studio имеет значение Последняя установленная

    5. Для сборки и запуска задано значение Локальный компьютер.

    6. Здесь стоит сохранить сцену и добавить ее в сборку.

      1. Для этого выберите Добавить открытые сцены. Откроется окно сохранения.

        Снимок экрана: окно

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

        Снимок экрана: выделенный элемент

      3. Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла: введите NH_MR_Scene, а затем нажмите кнопку Сохранить.

        новая сцена — NH_MR_Scene

    7. Остальные параметры в разделе Параметры сборки пока следует оставить по умолчанию.

  6. В том же окне нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .

    Открытие параметров проигрывателя

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке Другие параметры :

      1. Версия среды выполнения скриптов должна быть экспериментальной (эквивалент .NET 4.6)

      2. Серверная часть сценариев должна быть .NET

      3. Уровень совместимости API должен быть .NET 4.6

        Совместимость с API

    2. Далее вниз по панели в разделе Параметры XR (см. раздел Параметры публикации) установите флажок Виртуальная реальность Поддерживается, убедитесь, что пакет SDK для Windows Mixed Reality добавлен.

      обновление параметров xr

    3. На вкладке Параметры публикации в разделе Возможности проверка:

      • InternetClient;

        Снимок экрана: вкладка

  8. Вернитесь в параметры сборки, проекты Unity C# больше не выделены серым цветом: установите флажок рядом с этим.

  9. После внесения этих изменений закройте окно Параметры сборки.

  10. Сохраните сцену и файл> проекта, сохраните сцену илипроект сохранения файла>.

    Важно!

    Если вы хотите пропустить компонент настройки Unity для этого проекта (приложение смешанной реальности) и перейти непосредственно к коду, скачайте этот пакет unitypackage, импортируйте его в проект в виде пользовательского пакета, а затем перейдите к главе 14. Вам по-прежнему потребуется добавить компоненты скрипта.

Глава 13. Импорт библиотек DLL в проект Смешанная реальность Unity

Вы будете использовать библиотеку службы хранилища Azure для Unity (которая использует пакет SDK для .Net для Azure). Перейдите по этой ссылке, чтобы узнать, как использовать службу хранилища Azure с Unity. В настоящее время в Unity существует известная проблема, которая требует перенастройки подключаемых модулей после импорта. Эти действия (4–7 в этом разделе) больше не требуются после устранения ошибки.

Чтобы импортировать пакет SDK в собственный проект, убедитесь, что вы скачали последнюю версию .unitypackage. Затем сделайте следующее.

  1. Добавьте unitypackage, скачанный из выше, в Unity с помощью пункта менюПользовательский пакетимпорта>ресурсов>.

  2. Во всплывающем окне Импорт пакета Unity можно выбрать все в разделеХранилищеподключаемого модуля>.

    импорт пакета

  3. Нажмите кнопку Импорт , чтобы добавить элементы в проект.

  4. Перейдите в папку Хранилище в разделе Подключаемые модули в представлении проекта и выберите только следующие подключаемые модули:

    • Microsoft.Data.Edm
    • Microsoft.Data.OData
    • Microsoft.WindowsAzure.Storage
    • Newtonsoft.Json.
    • System.Spatial

    Выбор подключаемых модулей

  5. Выбрав эти подключаемые модули , снимите флажокЛюбая платформаиWSAPlayer , а затем нажмите кнопку Применить.

    применение изменений платформы

    Примечание

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

  6. В папке Подключаемого модуля хранилища выберите только:

    • Microsoft.Data.Services.Client

      Выбор клиента служб данных

  7. Установите флажок Не обрабатывать в разделе Параметры платформы и нажмите кнопку Применить.

    не обрабатывать

    Примечание

    Вы помечаете этот подключаемый модуль как "Не обрабатывать", так как средство исправления сборки Unity испытывает трудности с обработкой этого подключаемого модуля. Подключаемый модуль по-прежнему будет работать, даже если он не обрабатывается.

Глава 14. Создание класса TableToScene в проекте Unity смешанной реальности

Класс TableToScene идентичен классу, описанного в главе 9. Создайте тот же класс в проекте Unity смешанной реальности, выполнив ту же процедуру, описанную в главе 9.

После завершения работы с этой главой в обоих проектах Unity этот класс будет настроен на главной камере.

Глава 15. Создание класса NotificationReceiver в проекте Смешанная реальность Unity

Второй скрипт, который необходимо создать, — NotificationReceiver, который отвечает за:

  • Регистрация приложения в Центре уведомлений при инициализации.
  • Прослушивание уведомлений, поступающих из Центра уведомлений.
  • Десериализация данных объекта из полученных уведомлений.
  • Переместите объекты GameObject в сцену на основе десериализованных данных.

Чтобы создать скрипт NotificationReceiver , выполните следующие действия.

  1. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать, Скрипт C#. Назовите скрипт NotificationReceiver.

    Создание скрипта c#с именем NotificationReceiver

  2. Дважды щелкните скрипт, чтобы открыть его.

  3. Добавьте приведенные ниже пространства имен.

    //using Microsoft.WindowsAzure.Messaging;
    using Newtonsoft.Json;
    using System;
    using System.Collections;
    using UnityEngine;
    
    #if UNITY_WSA_10_0 && !UNITY_EDITOR
    using Windows.Networking.PushNotifications;
    #endif
    
  4. Вставьте следующие переменные:

        /// <summary>
        /// allows this class to behave like a singleton
        /// </summary>
        public static NotificationReceiver instance;
    
        /// <summary>
        /// Value set by the notification, new object position
        /// </summary>
        Vector3 newObjPosition;
    
        /// <summary>
        /// Value set by the notification, object name
        /// </summary>
        string gameObjectName;
    
        /// <summary>
        /// Value set by the notification, new object position
        /// </summary>
        bool notifReceived;
    
        /// <summary>
        /// Insert here your Notification Hub Service name 
        /// </summary>
        private string hubName = " -- Insert the name of your service -- ";
    
        /// <summary>
        /// Insert here your Notification Hub Service "Listen endpoint"
        /// </summary>
        private string hubListenEndpoint = "-Insert your Notification Hub Service Listen endpoint-";
    
  5. Замените значение hubName именем службы концентратора уведомлений, а значение hubListenEndpoint — значением конечной точки на вкладке Политики доступа Служба центра уведомлений Azure на портале Azure (см. рисунок ниже).

    Вставка конечной точки политики центров уведомлений

  6. Теперь добавьте методы Start() и Awake() для инициализации класса .

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // Register the App at launch
            InitNotificationsAsync();
    
            // Begin listening for notifications
            StartCoroutine(WaitForNotification());
        }
    
  7. Добавьте метод WaitForNotification , чтобы разрешить приложению получать уведомления из библиотеки центра уведомлений без конфликтов с основным потоком:

        /// <summary>
        /// This notification listener is necessary to avoid clashes 
        /// between the notification hub and the main thread   
        /// </summary>
        private IEnumerator WaitForNotification()
        {
            while (true)
            {
                // Checks for notifications each second
                yield return new WaitForSeconds(1f);
    
                if (notifReceived)
                {
                    // If a notification is arrived, moved the appropriate object to the new position
                    GameObject.Find(gameObjectName).transform.position = newObjPosition;
    
                    // Reset the flag
                    notifReceived = false;
                }
            }
        }
    
  8. Следующий метод InitNotificationAsync() регистрирует приложение в службе концентратора уведомлений при инициализации. Код закомментирован, так как Unity не сможет выполнить сборку проекта. При импорте пакета NuGet для обмена сообщениями Azure в Visual Studio примечания будут удалены.

        /// <summary>
        /// Register this application to the Notification Hub Service
        /// </summary>
        private async void InitNotificationsAsync()
        {
            // PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
            // NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint);
    
            // Registration result = await hub.RegisterNativeAsync(channel.Uri);
    
            // If registration was successful, subscribe to Push Notifications
            // if (result.RegistrationId != null)
            // {
            //     Debug.Log($"Registration Successful: {result.RegistrationId}");
            //     channel.PushNotificationReceived += Channel_PushNotificationReceived;
            // }
        }
    
  9. Следующий обработчик Channel_PushNotificationReceived() будет запускаться при каждом получении уведомления. Он десериализует уведомление, которое будет сущностью таблицы Azure, которая была перемещена в классическом приложении, а затем переместит соответствующий GameObject в сцене смешанной реальности в ту же позицию.

    Важно!

    Код закомментирован, так как он ссылается на библиотеку обмена сообщениями Azure, которую вы добавите после сборки проекта Unity с помощью диспетчера пакетов Nuget в Visual Studio. Таким образом, проект Unity не сможет выполнить сборку, если он не будет закомментирован. Имейте в виду, что если вы создадите проект, а затем захотите вернуться в Unity, вам потребуется повторно закомментировать этот код.

        ///// <summary>
        ///// Handler called when a Push Notification is received
        ///// </summary>
        //private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)    
        //{
        //    Debug.Log("New Push Notification Received");
        //
        //    if (args.NotificationType == PushNotificationType.Raw)
        //    {
        //        //  Raw content of the Notification
        //        string jsonContent = args.RawNotification.Content;
        //
        //        // Deserialise the Raw content into an AzureTableEntity object
        //        AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent);
        //
        //        // The name of the Game Object to be moved
        //        gameObjectName = ate.RowKey;          
        //
        //        // The position where the Game Object has to be moved
        //        newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z);
        //
        //        // Flag thats a notification has been received
        //        notifReceived = true;
        //    }
        //}
    
  10. Не забудьте сохранить изменения, прежде чем вернуться в редактор Unity.

  11. Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.

  12. Открыв папку Скрипты , выберите скрипт NotificationReceiver и перетащите его на главную камеру. Результат должен выглядеть следующим образом:

    Перетащите скрипт приемника уведомлений в камеру

    Примечание

    При разработке для Microsoft HoloLens необходимо обновить компонент камеры основной камеры, чтобы:

    • Очистить флаги: сплошной цвет
    • Фон: черный

Глава 16. Сборка проекта Смешанная реальность в UWP

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

  1. Перейдите в раздел Параметры сборки (Параметры сборкифайла> ).

  2. В меню Параметры сборки убедитесь, что Unity C# Projects* установлен флажок (это позволит редактировать скрипты в этом проекте после сборки).

  3. После этого нажмите кнопку Сборка.

    Снимок экрана: окно

  4. Появится проводник окно с предложением ввести расположение для сборки. Создайте новую папку (щелкнув Создать папку в левом верхнем углу) и назовите ее BUILDS.

    создание папки builds

    1. Откройте новую папку BUILDS , создайте другую папку (еще раз используя команду Создать папку ) и назовите ее NH_MR_App.

      создание папки NH_MR_Apps

    2. С выбранным NH_MR_App . Щелкните Выбрать папку. Сборка проекта займет около минуты.

  5. После сборки откроется окно проводник в расположении нового проекта.

Глава 17. Добавление пакетов NuGet в решение UnityMRNotifHub

Предупреждение

Помните, что после добавления следующих пакетов NuGet (и раскомментировки кода в следующей главе) при повторном открытии кода в проекте Unity будут отображаться ошибки. Если вы хотите вернуться и продолжить редактирование в редакторе Unity, вам потребуется комментарий к некорректному коду, а затем раскомментировать его позже, как только вы вернелись в Visual Studio.

После завершения сборки смешанной реальности перейдите к созданному проекту смешанной реальности и дважды щелкните файл решения (SLN) в этой папке, чтобы открыть решение в Visual Studio 2017. Теперь необходимо добавить пакет NuGet WindowsAzure.Messaging.managed ; это библиотека, которая используется для получения уведомлений из центра уведомлений.

Чтобы импортировать пакет NuGet, выполните следующие действия.

  1. В Обозреватель решений щелкните правой кнопкой мыши свое решение.

  2. Щелкните Manage NuGet Packages (Управление пакетами NuGet).

    Открытие диспетчера NuGet

  3. Перейдите на вкладку Обзор и найдите WindowsAzure.Messaging.managed.

    Поиск пакета сообщений Windows Azure

  4. Выберите результат (как показано ниже) и в окне справа установите флажок рядом с пунктом Проект. При этом флажок рядом с пунктом Project будет установлен флажок рядом с проектом Assembly-CSharp и UnityMRNotifHub .

    помека всех проектов

  5. Изначально указанная версия может быть несовместима с этим проектом. Поэтому щелкните раскрывающееся меню рядом с пунктом Версия и выберите Версия 0.1.7.9, а затем нажмите кнопку Установить.

  6. Установка пакета NuGet завершена. Найдите закомментированный код, введенный в классе NotificationReceiver , и удалите комментарии.

Глава 18. Изменение приложения UnityMRNotifHub, класса NotificationReceiver

После добавления пакетов NuGet необходимо раскомментировать часть кода в классе NotificationReceiver .

В том числе:

  1. Пространство имен в верхней части:

    using Microsoft.WindowsAzure.Messaging;
    
  2. Весь код в методе InitNotificationsAsync() :

        /// <summary>
        /// Register this application to the Notification Hub Service
        /// </summary>
        private async void InitNotificationsAsync()
        {
            PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
            NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint);
    
            Registration result = await hub.RegisterNativeAsync(channel.Uri);
    
            // If registration was successful, subscribe to Push Notifications
            if (result.RegistrationId != null)
            {
                Debug.Log($"Registration Successful: {result.RegistrationId}");
                channel.PushNotificationReceived += Channel_PushNotificationReceived;
            }
        }
    

Предупреждение

В приведенном выше коде есть комментарий: убедитесь, что вы случайно не раскомментировали этот комментарий (так как код не будет компилироваться, если у вас есть!).

  1. И, наконец, событие Channel_PushNotificationReceived :

        /// <summary>
        /// Handler called when a Push Notification is received
        /// </summary>
        private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)
        {
            Debug.Log("New Push Notification Received");
    
            if (args.NotificationType == PushNotificationType.Raw)
            {
                //  Raw content of the Notification
                string jsonContent = args.RawNotification.Content;
    
                // Deserialize the Raw content into an AzureTableEntity object
                AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent);
    
                // The name of the Game Object to be moved
                gameObjectName = ate.RowKey;
    
                // The position where the Game Object has to be moved
                newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z);
    
                // Flag thats a notification has been received
                notifReceived = true;
            }
        }
    

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

Глава 19. Связывание проекта смешанной реальности с приложением Магазина

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

  1. Откройте решение.

  2. Щелкните правой кнопкой мыши проект приложения UWP на панели Обозреватель решений, перейдите в Магазин и свяжите приложение с Магазином....

    связь с открытым магазином

  3. Появится новое окно с именем Связывание приложения с Магазином Windows. Щелкните Далее.

    Перейти к следующему экрану

  4. Он загрузит все приложения, связанные с учетной записью, в которую вы вошли. Если вы не вошли в свою учетную запись, вы можете войти на этой странице.

  5. Найдите имя приложения Store , созданное в начале работы с этим руководством, и выберите его. Нажмите кнопку Далее.

    Поиск и выбор имени магазина

  6. Щелкните Связать.

    связывание приложения

  7. Теперь ваше приложение будет связано с приложением Магазина. Это необходимо для включения уведомлений.

Глава 20. Развертывание приложений UnityMRNotifHub и UnityDesktopNotifHub

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

Приложение иммерсивной гарнитуры ожидает получения изменений в сцене (изменения позиции локального GameObjects), а классическое приложение будет вносить изменения в локальную сцену (изменения положения), которые будут доступны приложению смешанной реальности. Имеет смысл сначала развернуть приложение смешанной реальности, а затем классическое приложение, чтобы получатель смог начать прослушивание.

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

  1. Откройте файл решения приложения UnityMRNotifHub в Visual Studio 2017.

  2. В окне Платформа решения выберите x86, Локальный компьютер.

  3. В разделе Конфигурация решения выберите Отладка.

    Снимок экрана, на котором показан параметр

  4. Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.

  5. Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.

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

  1. Откройте файл решения приложения UnityDesktopNotifHub в Visual Studio 2017.

  2. В окне Платформа решения выберите x86, Локальный компьютер.

  3. В разделе Конфигурация решения выберите Отладка.

    Снимок экрана, на котором показан параметр

  4. Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.

  5. Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.

  6. Запустите приложение смешанной реальности, а затем классическое приложение.

При выполнении обоих приложений переместите объект в сцену рабочего стола (с помощью левой кнопки мыши). Эти позиционные изменения будут вноситься локально, сериализоваться и отправляться в службу приложений-функций. Затем служба приложений-функций обновит таблицу вместе с центром уведомлений. Получив обновление, Центр уведомлений отправит обновленные данные непосредственно во все зарегистрированные приложения (в данном случае иммерсивное приложение гарнитуры), которое затем десериализует входящие данные и применит новые позиционные данные к локальным объектам, перемещая их в сцену.

Готовое приложение Центров уведомлений Azure

Поздравляем! Вы создали приложение смешанной реальности, которое использует службу Центров уведомлений Azure и разрешает обмен данными между приложениями.

конечный продукт -end

Дополнительные упражнения

Упражнение 1.

Можете ли вы поработать, как изменить цвет GameObjects и отправить это уведомление другим приложениям, просматривающим сцену?

Упражнение 2

Можно ли добавить перемещение GameObjects в приложение смешанной реальности и увидеть обновленную сцену в классическом приложении?