HoloLens (1-го поколения) и Azure 308: уведомления на нескольких устройствах
Примечание
Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при их публикации.
В этом курсе вы узнаете, как добавить возможности Центров уведомлений в приложение смешанной реальности с помощью Центров уведомлений Azure, таблиц Azure и Функции Azure.
Центры уведомлений Azure — это служба Майкрософт, которая позволяет разработчикам отправлять целевые и персонализированные push-уведомления на любую платформу на базе облака. Это позволяет разработчикам общаться с конечными пользователями или даже взаимодействовать между различными приложениями в зависимости от сценария. Дополнительные сведения см. на страницеЦентров уведомлений Azure.
Функции Azure — это служба Майкрософт, которая позволяет разработчикам выполнять небольшие фрагменты кода (функции) в Azure. Это позволяет делегировать работу в облако, а не в локальное приложение, что может иметь множество преимуществ. Функции Azure поддерживает несколько языков разработки, включая C#, F#, Node.js, Java и PHP. Дополнительные сведения см. на Функции Azureстраницах.
Таблицы Azure — это облачная служба Майкрософт, которая позволяет разработчикам хранить структурированные данные, не связанные с SQL, в облаке, что делает их легко доступными в любом месте. Служба может похвастаться бесхемной структурой, что позволяет эволюции таблиц по мере необходимости, и поэтому она очень гибкая. Дополнительные сведения см. на страницеТаблиц Azure.
После прохождения этого курса вы получите приложение для иммерсивной гарнитуры смешанной реальности и приложение для настольных компьютеров, которое сможет выполнять следующие действия:
Приложение для настольных компьютеров позволит пользователю перемещать объект в двухd пространстве (X и Y) с помощью мыши.
Перемещение объектов в приложении для ПК будет отправлено в облако с помощью JSON, который будет иметь вид строки, содержащей идентификатор объекта, тип и сведения о преобразовании (координаты X и Y).
Приложение смешанной реальности, которое имеет идентичную сцену классическому приложению, будет получать уведомления о перемещении объектов из службы Центров уведомлений (которая только что была обновлена классическим приложением для пк).
Получив уведомление, которое будет содержать идентификатор объекта, тип и сведения о преобразовании, приложение смешанной реальности применит полученные сведения к собственной сцене.
В приложении вы можете определить, как вы будете интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша работа, чтобы использовать знания, полученные из этого курса, для улучшения приложения смешанной реальности. Этот курс является автономным учебником, в котором непосредственно не участвуют другие Смешанная реальность Labs.
Поддержка устройств
Курс | HoloLens | Иммерсивные гарнитуры |
---|---|---|
308. Смешанная реальность и Azure: уведомления на разных устройствах | ✔️ | ✔️ |
Примечание
Хотя в этом курсе основное внимание уделяется Windows Mixed Reality иммерсивным гарнитурам ( VR), вы также можете применить то, что вы узнали в этом курсе, для Microsoft HoloLens. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки HoloLens. При использовании HoloLens вы можете заметить некоторое эхо во время захвата голоса.
Предварительные требования
Примечание
Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было проверено и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.
Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:
- Компьютер разработки, совместимый с Windows Mixed Reality для разработки иммерсивных гарнитур (VR)
- Windows 10 Fall Creators Update (или более поздней версии) с включенным режимом разработчика
- Последняя версия пакета SDK для Windows 10
- Unity 2017.4
- Visual Studio 2017
- Windows Mixed Reality иммерсивная гарнитура (VR) или Microsoft HoloLens с включенным режимом разработчика
- Доступ к Интернету для настройки Azure и доступа к Центрам уведомлений
Перед началом работы
- Чтобы избежать проблем при сборке этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
- Вы должны быть владельцем портала разработчика Майкрософт и портала регистрации приложений, в противном случае у вас не будет разрешения на доступ к приложению в главе 2.
Глава 1. Создание приложения на портале разработчика Майкрософт
Чтобы использовать службу Центров уведомлений Azure , необходимо создать приложение на портале разработчика Майкрософт, так как приложение должно быть зарегистрировано для отправки и получения уведомлений.
Войдите на портал разработчика Майкрософт.
Вам потребуется войти в учетную запись Майкрософт.
На панели мониторинга щелкните Создать новое приложение.
Появится всплывающее окно, в котором необходимо зарезервировать имя для нового приложения. В текстовое поле вставьте соответствующее имя; Если выбранное имя доступно, справа от текстового поля появится галочка. Вставив доступное имя, нажмите кнопку Зарезервировать название продукта в левом нижнем углу всплывающего окна.
Теперь, когда приложение создано, вы можете перейти к следующей главе.
Глава 2. Получение учетных данных новых приложений
Войдите на портал регистрации приложений, где будет указано новое приложение, и получите учетные данные, которые будут использоваться для настройки службы Центров уведомлений на портале Azure.
Перейдите на портал регистрации приложений.
Предупреждение
Для входа необходимо использовать учетную запись Майкрософт.
Это должна быть учетная запись Майкрософт, используемая в предыдущей главе на портале разработчика магазина Windows.Приложение можно найти в разделе Мои приложения . После того как вы найдете его, щелкните его, и вы перейдете на новую страницу с именем приложения и регистрацией.
Прокрутите страницу регистрации вниз, чтобы найти раздел Секреты приложения и идентификатор безопасности пакета для вашего приложения. Скопируйте оба параметра для использования при настройке службы Центров уведомлений Azure в следующей главе.
Глава 3. Настройка портала Azure: создание службы центров уведомлений
После получения учетных данных приложений необходимо перейти на портал Azure, где вы создадите службу Центров уведомлений Azure.
Войдите на портал Azure.
Примечание
Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.
Выполнив вход, щелкните Создать в левом верхнем углу, найдите центр уведомлений и нажмите клавишу ВВОД.
Примечание
Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).
На новой странице будет представлено описание службы Центров уведомлений . В левом нижнем углу этого запроса нажмите кнопку Создать , чтобы создать связь с этой службой.
После нажатия кнопки Создать:
Вставьте нужное имя для этого экземпляра службы.
Укажите пространство имен , которое можно будет связать с этим приложением.
Выберите расположение.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, перейдите по этой ссылке, чтобы узнать, как управлять группой ресурсов.
Выберите соответствующую подписку.
Вам также потребуется подтвердить, что вы поняли условия, применяемые к этой Службе.
Нажмите кнопку создания.
После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.
После создания экземпляра службы на портале появится уведомление.
Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете к новому экземпляру службы центра уведомлений .
На странице обзора на полпути страницы щелкните Windows (WNS). На панели справа будут отображаться два текстовых поля, для которых требуются идентификатор безопасности пакета и ключ безопасности, из приложения, настроенного ранее.
После копирования сведений в правильные поля нажмите кнопку Сохранить, и вы получите уведомление, когда центр уведомлений будет успешно обновлен.
Глава 4. Настройка портала Azure: создание службы таблиц
После создания экземпляра службы Центров уведомлений вернитесь на портал Azure, где создадите службу таблиц Azure, создав ресурс хранилища.
Если он еще не выполнен, войдите на портал Azure.
После входа щелкните Создать в левом верхнем углу, найдите учетную запись хранения и нажмите клавишу ВВОД.
Примечание
Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).
В списке выберите Учетная запись хранения — BLOB-объект, файл, таблица, очередь .
На новой странице будет представлено описание службы учетной записи хранения . В левом нижнем углу этого запроса нажмите кнопку Создать , чтобы создать экземпляр этой службы.
После нажатия кнопки Создать появится панель:
Вставьте нужное имя для этого экземпляра службы (должно быть в нижнем регистре).
Для параметра Модель развертывания щелкните Resource Manager.
В поле Тип учетной записи в раскрывающемся меню выберите Хранилище (общего назначения версии 1).
Выберите подходящее расположение.
В раскрывающемся меню Репликация выберите Геоизбыточное хранилище с доступом на чтение (RA-GRS).
Для параметра Производительность щелкните Стандартный.
В разделе Требуется безопасное перемещение выберите Отключено.
В раскрывающемся меню Подписка выберите соответствующую подписку.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, перейдите по этой ссылке, чтобы узнать, как управлять группой ресурсов.
Если это вариант, оставьте значение Виртуальные сетиотключенными .
Нажмите кнопку Создать.
После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.
После создания экземпляра службы на портале появится уведомление. Щелкните уведомления, чтобы просмотреть новый экземпляр службы.
Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете на страницу обзора нового экземпляра службы хранилища.
На странице обзора справа щелкните Таблицы.
Панель справа изменится, чтобы отобразить сведения о службе таблиц , где необходимо добавить новую таблицу. Для этого нажмите кнопку +Таблица в левом верхнем углу.
Появится новая страница, на которой необходимо ввести имя таблицы. Это имя, которое будет использоваться для ссылки на данные в приложении в последующих главах. Вставьте соответствующее имя и нажмите кнопку ОК.
После создания новой таблицы вы сможете увидеть ее на странице службы таблиц (внизу).
Глава 5. Завершение работы с таблицей Azure в Visual Studio
Теперь, когда учетная запись хранения службы таблиц настроена, пора добавить в нее данные, которые будут использоваться для хранения и извлечения информации. Редактирование таблиц можно выполнить с помощью Visual Studio.
Откройте Visual Studio.
В меню выберите команду Просмотреть>облачные Обозреватель.
Облачный Обозреватель откроется как закрепленный элемент (будьте терпеливы, так как загрузка может занять время).
Примечание
Если подписка, используемая для создания учетных записей хранения , не отображается, убедитесь, что у вас есть:
Войдите в ту же учетную запись, что и для портала Azure.
Выберите подписку на странице управление учетными записями (возможно, потребуется применить фильтр из параметров учетной записи):
Будут показаны облачные службы Azure. Найдите Учетные записи хранения и щелкните стрелку слева от нее, чтобы развернуть свои учетные записи.
После развертывания только что созданная учетная запись хранения станет доступной. Щелкните стрелку слева от хранилища, а затем после развертывания найдите Таблицы и щелкните стрелку рядом с ней, чтобы отобразить таблицу , созданную в последней главе. Дважды щелкните таблицу.
Таблица будет открыта в центре окна Visual Studio. Щелкните значок таблицы с элементом + (плюс).
Появится окно с предложением Добавить сущность. Всего вы создадите три сущности, каждая из которых имеет несколько свойств. Вы заметите, что PartitionKey и RowKey уже предоставлены, так как они используются таблицей для поиска данных.
Обновите значенияPartitionKey и RowKey следующим образом (не забудьте сделать это для каждого добавляемого свойства строки, хотя каждый раз увеличивать значение RowKey):
Щелкните Добавить свойство , чтобы добавить дополнительные строки данных. Сделайте первую пустую таблицу соответствующей таблице ниже.
По завершении нажмите кнопку ОК .
Предупреждение
Убедитесь, что вы изменили тип записей X, Y и Z на Double.
Вы заметите, что таблица теперь содержит строку данных. + Щелкните значок (плюс) еще раз, чтобы добавить другую сущность.
Создайте дополнительное свойство, а затем задайте значения новой сущности в соответствии с приведенными ниже.
Повторите последний шаг, чтобы добавить другую сущность. Задайте для этой сущности значения, показанные ниже.
Теперь таблица должна выглядеть так, как показано ниже.
Вы завершили работу с этой главой. Обязательно сохраните.
Глава 6. Создание приложения-функции Azure
Создайте приложение-функцию Azure, которое будет вызываться классическим приложением для обновления службы таблиц и отправки уведомления через Центр уведомлений.
Сначала необходимо создать файл, который позволит функции Azure загружать необходимые библиотеки.
Откройте Блокнот (нажмите клавишу Windows и введите Блокнот).
Открыв Блокнот, вставьте в него структуру 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" } } } }
Войдите на портал Azure.
После входа щелкните Создать в левом верхнем углу и найдите приложение-функцию, нажмите клавишу ВВОД.
Примечание
Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).
На новой странице будет представлено описание службы приложений-функций . В левом нижнем углу этого запроса нажмите кнопку Создать , чтобы создать связь с этой службой.
После нажатия кнопки Создать заполните следующее:
В поле Имя приложения вставьте нужное имя для этого экземпляра службы.
Выберите подписку.
Выберите подходящую ценовую категорию. Если вы создаете Служба приложений функции впервые, вам должна быть доступна бесплатная категория.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, перейдите по этой ссылке, чтобы узнать, как управлять группой ресурсов.
Для ОС выберите Windows, так как это предназначенная платформа.
Выберите план размещения (в этом руководстве используется план потребления).
Выберите расположение(выберите то же расположение, что и хранилище, созданное на предыдущем шаге)
В разделе Хранилищенеобходимо выбрать службу хранилища, созданную на предыдущем шаге.
Вам не потребуется Application Insights в этом приложении, поэтому не стесняйтесь оставить его отключенным.
Нажмите кнопку Создать.
После нажатия кнопки Создать вам придется дождаться создания службы. Это может занять минуту.
После создания экземпляра службы на портале появится уведомление.
Щелкните уведомления, чтобы просмотреть новый экземпляр службы.
Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы.
+ Щелкните значок (плюс) рядом с элементом Функции, чтобы создать.
На центральной панели появится окно создания функции . Игнорируйте сведения в верхней части панели и щелкните Пользовательская функция, расположенная в нижней части (в синей области, как показано ниже).
На новой странице в окне будут отображаться различные типы функций. Прокрутите вниз, чтобы просмотреть фиолетовые типы, и щелкните элемент HTTP PUT .
Важно!
Возможно, вам придется прокрутить страницу вниз (и это изображение может не выглядеть точно так же, если произошли обновления на портале Azure), однако вы ищете элемент с именем HTTP PUT.
Откроется окно HTTP PUT , в котором необходимо настроить функцию (изображение см. ниже).
В поле Язык в раскрывающемся меню выберите C#.
В поле Имя введите соответствующее имя.
В раскрывающемся меню Уровень проверки подлинности выберите Функция.
В разделе Имя таблицы необходимо указать точное имя, которое вы использовали для создания службы таблиц ранее (включая тот же буквенный регистр).
В разделе Подключение к учетной записи хранения используйте раскрывающееся меню и выберите учетную запись хранения. Если ее нет, щелкните гиперссылку Создать рядом с заголовком раздела, чтобы отобразить другую панель, где должна быть указана ваша учетная запись хранения.
Нажмите кнопку Создать, и вы получите уведомление о том, что параметры успешно обновлены.
После нажатия кнопки Создать вы будете перенаправлены в редактор функций.
Вставьте следующий код в редактор функций (заменив код в функции):
#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). Затем этот объект используется для обновления параметров объекта в созданной таблице. После этого функция вызывает созданную службу центра уведомлений, которая уведомляет все подписанные приложения.
Указав код, нажмите кнопку Сохранить.
Затем щелкните < значок (стрелка) в правой части страницы.
Панель будет скользить справа. На этой панели нажмите кнопку Отправить, и откроется окно Обозреватель файлов.
Перейдите к файлу project.json , созданному ранее в Блокноте , и нажмите кнопку Открыть . Этот файл определяет библиотеки, которые будет использовать функция.
После отправки файла он появится на панели справа. Щелкнув его, он откроется в редакторе функций . Он должен выглядеть точно так же, как и на следующем рисунке (ниже шаг 23).
Затем на панели слева в разделе Функции щелкните ссылку Интегрировать .
На следующей странице в правом верхнем углу щелкните Расширенный редактор (как показано ниже).
На центральной панели откроется файл 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" } ] }
Теперь редактор должен выглядеть так, как показано на рисунке ниже:
Вы можете заметить, что только что вставленные входные параметры могут не соответствовать сведениям о таблице и хранилище, поэтому их потребуется обновить. Не делайте этого здесь, так как это рассматривается далее. Просто щелкните ссылку Стандартный редактор в правом верхнем углу страницы, чтобы вернуться назад.
Вернитесь в стандартный редактор и щелкните Хранилище таблиц Azure (таблица) в разделе Входные данные.
Убедитесь, что приведенные ниже данные соответствуют вашим данным, так как они могут отличаться (ниже приведено изображение):
Имя таблицы: имя таблицы, созданной в службе хранилища Azure.
Подключение к учетной записи хранения: щелкните создать, который появится рядом с раскрывающимся меню, и справа от окна появится панель.
Выберите учетную запись хранения, созданную ранее для размещения приложений-функций.
Вы заметите, что значение подключения учетной записи хранения создано.
После завершения нажмите кнопку Сохранить .
Теперь страница Входные данные должна соответствовать приведенной ниже информации.
Затем щелкните Центр уведомлений Azure (уведомление) в разделе Выходные данные. Убедитесь, что следующие данные соответствуют вашим данным, так как они могут отличаться (ниже приведено изображение):
Имя центра уведомлений. Это имя созданного ранее экземпляра службы центра уведомлений .
Подключение к пространству имен Центров уведомлений: нажмите кнопку Создать, которая появится рядом с раскрывающимся меню.
Откроется всплывающее окно Подключение (см. рисунок ниже), где необходимо выбрать пространство именцентра уведомлений, настроенное ранее.
Выберите имя центра уведомлений в среднем раскрывающемся меню.
В раскрывающемся меню Политика задайте значение DefaultFullSharedAccessSignature.
Нажмите кнопку Выбрать , чтобы вернуться.
Теперь страница Выходные данные должна соответствовать приведенному ниже значению, но с вашими данными. Не забудьте нажать кнопку Сохранить.
Предупреждение
Не изменяйте имя центра уведомлений напрямую (все это должно быть сделано с помощью Расширенный редактор, при условии, что вы правильно выполнили предыдущие действия.
На этом этапе необходимо протестировать функцию, чтобы убедиться, что она работает. Для этого выполните следующие действия.
Еще раз перейдите на страницу функции:
Вернитесь на страницу функции и щелкните вкладку Тест в правой части страницы, чтобы открыть колонку Тест :
В текстовое поле Текст запроса колонки вставьте следующий код:
{ "Type":null, "X":3, "Y":0, "Z":1, "PartitionKey":null, "RowKey":"Obj2", "Timestamp":"0001-01-01T00:00:00+00:00", "ETag":null }
После размещения тестового кода нажмите кнопку Выполнить в правом нижнем углу, и тест будет выполнен. Журналы выходных данных теста будут отображаться в области консоли под кодом функции.
Предупреждение
Если приведенный выше тест не пройден, вам потребуется удвоить проверка, что вы точно выполнили описанные выше действия, в частности параметры на панели интеграции.
Глава 7. Настройка проекта Unity для настольных приложений
Важно!
Создаваемое классическое приложение не будет работать в редакторе Unity. Его необходимо запускать вне редактора после сборки приложения с помощью Visual Studio (или развернутого приложения).
Ниже приведена типичная настройка для разработки с использованием Unity и смешанной реальности, а также хороший шаблон для других проектов.
Настройте и протестируйте иммерсивную гарнитуру смешанной реальности.
Примечание
Контроллеры движения для этого курса не требуются. Если вам нужна поддержка по настройке иммерсивной гарнитуры, перейдите по этой ссылке, чтобы узнать, как настроить Windows Mixed Reality.
Откройте Unity и нажмите кнопку Создать.
Необходимо указать имя проекта Unity, вставьте UnityDesktopNotifHub. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.
При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение>параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .
Затем перейдите враздел Параметры сборкифайла> и выберите универсальная платформа Windows, а затем нажмите кнопку Переключить платформу, чтобы применить выбранный вариант.
Оставаясь впараметрах сборкифайла>, убедитесь, что:
Для целевого устройства задано значение Любое устройство.
Это приложение будет использоваться для настольного компьютера, поэтому должно быть любое устройство
Для параметра Тип сборки задано значение D3D.
Для пакета SDK задано значение Последняя установленная
Для версии Visual Studio задано значение Последняя установленная версия
Для сборки и запуска задано значение Локальный компьютер.
Здесь стоит сохранить сцену и добавить ее в сборку.
Для этого выберите Добавить открытые сцены. Появится окно сохранения.
Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку, назовите ее Scenes.
Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла введитеNH_Desktop_Scene, а затем нажмите кнопку Сохранить.
Оставшиеся параметры в разделе Параметры сборки на данный момент следует оставить по умолчанию.
В том же окне нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .
На этой панели необходимо проверить несколько параметров:
На вкладке Другие параметры :
Версия среды выполнения сценариев должна быть экспериментальной (эквивалент .NET 4.6)
Серверная часть сценариев должна быть .NET
Уровень совместимости API должен быть .NET 4.6
На вкладке Параметры публикации в разделе Возможности проверка:
InternetClient;
Вернувшись в параметры сборки, проекты C# Unity больше не выделены серым цветом; Установите флажок рядом с этим.
Закройте окно Build Settings (Параметры сборки).
Сохраните сцену и файл> проекта, сохраните сцену или файл>сохранить проект.
Важно!
Если вы хотите пропустить компонент настройки Unity для этого проекта (классическое приложение) и перейти непосредственно к коду, скачайте этот файл .unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем перейдите к главе 9. Вам по-прежнему потребуется добавить компоненты скрипта.
Глава 8. Импорт библиотек DLL в Unity
Вы будете использовать службу хранилища Azure для Unity (которая сама использует пакет SDK для .NET для Azure). Дополнительные сведения см. по этой ссылке о службе хранилища Azure для Unity.
В настоящее время в Unity существует известная проблема, которая требует перенастройки подключаемых модулей после импорта. Эти действия (4–7 в этом разделе) больше не требуются после устранения ошибки.
Чтобы импортировать пакет SDK в собственный проект, убедитесь, что вы скачали последнюю версию .unitypackage из GitHub. Затем сделайте следующее.
Добавьте .unitypackage в Unity с помощью параметра меню Пользовательский пакет импорта пакета > ресурсов>.
В появившемся окне Импорт пакета Unity можно выбрать все в разделе Хранилищеподключаемого модуля>. Снимите все остальные флажки, так как это не требуется для этого курса.
Нажмите кнопку Импорт , чтобы добавить элементы в проект.
Перейдите в папку Хранилище в разделе Подключаемые модули в представлении проекта и выберите только следующие подключаемые модули:
- Microsoft.Data.Edm
- Microsoft.Data.OData
- Microsoft.WindowsAzure.Storage
- Newtonsoft.Json.
- System.Spatial
Выбрав эти подключаемые модули , снимите флажокЛюбая платформаиWSAPlayer , а затем нажмите кнопку Применить.
Примечание
Мы помечаем эти подключаемые модули только для использования в редакторе Unity. Это связано с тем, что в папке WSA есть разные версии одних и того же подключаемого модуля, которые будут использоваться после экспорта проекта из Unity.
В папке Подключаемого модуля хранилища выберите только:
Microsoft.Data.Services.Client
Установите флажок Не обрабатывать в разделе Параметры платформы и нажмите кнопку Применить.
Примечание
Мы помечаем этот подключаемый модуль как "Не обрабатывать", так как средство исправления сборки Unity испытывает трудности при обработке этого подключаемого модуля. Подключаемый модуль по-прежнему будет работать, даже если он не обрабатывается.
Глава 9. Создание класса TableToScene в проекте Desktop Unity
Теперь необходимо создать скрипты, содержащие код для запуска этого приложения.
Первым скриптом, который необходимо создать, является TableToScene, который отвечает за:
- Чтение сущностей в таблице Azure.
- С помощью данных таблицы определите, какие объекты следует порождать и в какой позиции.
Второй скрипт, который необходимо создать, — CloudScene, который отвечает за:
- Регистрация события щелчка левой кнопкой мыши, чтобы разрешить пользователю перетаскивать объекты вокруг сцены.
- Сериализация данных объекта из этой сцены Unity и их отправка в приложение-функцию Azure.
Чтобы создать этот класс, выполните указанные ниже действия.
Щелкните правой кнопкой мыши папку asset , расположенную на панели проектов, в разделе Создать>папку. Назовите папку Scripts.
Дважды щелкните только что созданную папку, чтобы открыть ее.
Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать>скрипт C#. Назовите скрипт TableToScene.
Дважды щелкните скрипт, чтобы открыть его в Visual Studio 2017.
Добавьте приведенные ниже пространства имен.
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Auth; using Microsoft.WindowsAzure.Storage.Table; using UnityEngine;
В классе вставьте следующие переменные:
/// <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 (см. рисунок ниже).
Теперь добавьте методы 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(); }
В классе 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); }
За пределами класса 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; } }
Перед возвращением в редактор Unity убедитесь, что вы сохранили его.
Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.
Открыв папку Скрипты , выберите файл скрипта TableToScene и перетащите его на главную камеру. Результат должен выглядеть следующим образом:
Глава 10. Создание класса CloudScene в проекте Desktop Unity
Второй скрипт, который необходимо создать, — CloudScene, который отвечает за:
Регистрация события щелчка левой кнопкой мыши, чтобы разрешить пользователю перетаскивать объекты вокруг сцены.
Сериализация данных объекта из этой сцены Unity и их отправка в приложение-функцию Azure.
Чтобы создать второй скрипт, выполните следующие действия.
Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать, Скрипт C#. Присвойт скрипту имя CloudScene
Добавьте приведенные ниже пространства имен.
using Newtonsoft.Json; using System.Collections; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking;
Вставьте следующие переменные:
/// <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;
Замените значение azureFunctionEndpoint URL-адресом приложения-функции Azure в Служба приложений Функции Azure на портале Azure, как показано на рисунке ниже.
Теперь добавьте методы 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(); }
В метод 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)); } }
Теперь добавьте метод 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(); } }
Сохраните код и вернитесь в Unity
Перетащите скрипт CloudScene на главную камеру.
Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.
Открыв папку Scripts , выберите скрипт CloudScene и перетащите его на главную камеру. Результат должен выглядеть следующим образом:
Глава 11. Сборка классического проекта в UWP
Все необходимое для раздела Unity этого проекта завершено.
Перейдите в раздел Параметры сборки (Параметры сборкифайла>).
В окне Параметры сборки щелкните Сборка.
Появится всплывающее окно проводник с запросом на выбор расположения для сборки. Создайте новую папку (щелкнув Создать папку в левом верхнем углу) и назовите ее BUILDS.
Откройте новую папку BUILDS , создайте другую папку (с помощью команды Создать папку еще раз) и назовите ее NH_Desktop_App.
С выбранным NH_Desktop_App . Щелкните Выбрать папку. Сборка проекта займет около минуты.
После сборки появится проводник с расположением нового проекта. Однако его не нужно открывать, так как вам нужно сначала создать другой проект Unity в следующих нескольких главах.
Глава 12. Настройка Смешанная реальность проекта Unity
Ниже приведена типичная настройка для разработки со смешанной реальностью и, таким образом, хороший шаблон для других проектов.
Откройте Unity и нажмите кнопку Создать.
Теперь необходимо указать имя проекта Unity, вставьте UnityMRNotifHub. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.
При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение>параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .
Затем перейдите враздел Параметры сборкифайлов> и переключите платформу на универсальная платформа Windows, нажав кнопку Переключить платформу.
Перейдите враздел Параметры сборкифайлов> и убедитесь, что:
Для целевого устройства задано значение Любое устройство.
Для Microsoft HoloLens задайте для параметра Целевое устройство значение HoloLens.
Для параметра Тип сборки задано значение D3D.
Для пакета SDK задано значение Последняя установленная версия.
Версия Visual Studio имеет значение Последняя установленная
Для сборки и запуска задано значение Локальный компьютер.
Здесь стоит сохранить сцену и добавить ее в сборку.
Для этого выберите Добавить открытые сцены. Откроется окно сохранения.
Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку и назовите ее Сцены.
Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла: введите NH_MR_Scene, а затем нажмите кнопку Сохранить.
Остальные параметры в разделе Параметры сборки пока следует оставить по умолчанию.
В том же окне нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .
На этой панели необходимо проверить несколько параметров:
На вкладке Другие параметры :
Версия среды выполнения скриптов должна быть экспериментальной (эквивалент .NET 4.6)
Серверная часть сценариев должна быть .NET
Уровень совместимости API должен быть .NET 4.6
Далее вниз по панели в разделе Параметры XR (см. раздел Параметры публикации) установите флажок Виртуальная реальность Поддерживается, убедитесь, что пакет SDK для Windows Mixed Reality добавлен.
На вкладке Параметры публикации в разделе Возможности проверка:
InternetClient;
Вернитесь в параметры сборки, проекты Unity C# больше не выделены серым цветом: установите флажок рядом с этим.
После внесения этих изменений закройте окно Параметры сборки.
Сохраните сцену и файл> проекта, сохраните сцену илипроект сохранения файла>.
Важно!
Если вы хотите пропустить компонент настройки Unity для этого проекта (приложение смешанной реальности) и перейти непосредственно к коду, скачайте этот пакет unitypackage, импортируйте его в проект в виде пользовательского пакета, а затем перейдите к главе 14. Вам по-прежнему потребуется добавить компоненты скрипта.
Глава 13. Импорт библиотек DLL в проект Смешанная реальность Unity
Вы будете использовать библиотеку службы хранилища Azure для Unity (которая использует пакет SDK для .Net для Azure). Перейдите по этой ссылке, чтобы узнать, как использовать службу хранилища Azure с Unity. В настоящее время в Unity существует известная проблема, которая требует перенастройки подключаемых модулей после импорта. Эти действия (4–7 в этом разделе) больше не требуются после устранения ошибки.
Чтобы импортировать пакет SDK в собственный проект, убедитесь, что вы скачали последнюю версию .unitypackage. Затем сделайте следующее.
Добавьте unitypackage, скачанный из выше, в Unity с помощью пункта менюПользовательский пакетимпорта>ресурсов>.
Во всплывающем окне Импорт пакета Unity можно выбрать все в разделеХранилищеподключаемого модуля>.
Нажмите кнопку Импорт , чтобы добавить элементы в проект.
Перейдите в папку Хранилище в разделе Подключаемые модули в представлении проекта и выберите только следующие подключаемые модули:
- Microsoft.Data.Edm
- Microsoft.Data.OData
- Microsoft.WindowsAzure.Storage
- Newtonsoft.Json.
- System.Spatial
Выбрав эти подключаемые модули , снимите флажокЛюбая платформаиWSAPlayer , а затем нажмите кнопку Применить.
Примечание
Вы помечаете эти подключаемые модули только для использования в редакторе Unity. Это связано с тем, что в папке WSA есть разные версии одних и того же подключаемого модуля, которые будут использоваться после экспорта проекта из Unity.
В папке Подключаемого модуля хранилища выберите только:
Microsoft.Data.Services.Client
Установите флажок Не обрабатывать в разделе Параметры платформы и нажмите кнопку Применить.
Примечание
Вы помечаете этот подключаемый модуль как "Не обрабатывать", так как средство исправления сборки Unity испытывает трудности с обработкой этого подключаемого модуля. Подключаемый модуль по-прежнему будет работать, даже если он не обрабатывается.
Глава 14. Создание класса TableToScene в проекте Unity смешанной реальности
Класс TableToScene идентичен классу, описанного в главе 9. Создайте тот же класс в проекте Unity смешанной реальности, выполнив ту же процедуру, описанную в главе 9.
После завершения работы с этой главой в обоих проектах Unity этот класс будет настроен на главной камере.
Глава 15. Создание класса NotificationReceiver в проекте Смешанная реальность Unity
Второй скрипт, который необходимо создать, — NotificationReceiver, который отвечает за:
- Регистрация приложения в Центре уведомлений при инициализации.
- Прослушивание уведомлений, поступающих из Центра уведомлений.
- Десериализация данных объекта из полученных уведомлений.
- Переместите объекты GameObject в сцену на основе десериализованных данных.
Чтобы создать скрипт NotificationReceiver , выполните следующие действия.
Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать, Скрипт C#. Назовите скрипт NotificationReceiver.
Дважды щелкните скрипт, чтобы открыть его.
Добавьте приведенные ниже пространства имен.
//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
Вставьте следующие переменные:
/// <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-";
Замените значение hubName именем службы концентратора уведомлений, а значение hubListenEndpoint — значением конечной точки на вкладке Политики доступа Служба центра уведомлений Azure на портале Azure (см. рисунок ниже).
Теперь добавьте методы 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()); }
Добавьте метод 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; } } }
Следующий метод 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; // } }
Следующий обработчик 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; // } //}
Не забудьте сохранить изменения, прежде чем вернуться в редактор Unity.
Щелкните основную камеру на панели Иерархия , чтобы ее свойства отображались в инспекторе.
Открыв папку Скрипты , выберите скрипт NotificationReceiver и перетащите его на главную камеру. Результат должен выглядеть следующим образом:
Примечание
При разработке для Microsoft HoloLens необходимо обновить компонент камеры основной камеры, чтобы:
- Очистить флаги: сплошной цвет
- Фон: черный
Глава 16. Сборка проекта Смешанная реальность в UWP
Эта глава идентична процессу сборки для предыдущего проекта. Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.
Перейдите в раздел Параметры сборки (Параметры сборкифайла> ).
В меню Параметры сборки убедитесь, что Unity C# Projects* установлен флажок (это позволит редактировать скрипты в этом проекте после сборки).
После этого нажмите кнопку Сборка.
Появится проводник окно с предложением ввести расположение для сборки. Создайте новую папку (щелкнув Создать папку в левом верхнем углу) и назовите ее BUILDS.
Откройте новую папку BUILDS , создайте другую папку (еще раз используя команду Создать папку ) и назовите ее NH_MR_App.
С выбранным NH_MR_App . Щелкните Выбрать папку. Сборка проекта займет около минуты.
После сборки откроется окно проводник в расположении нового проекта.
Глава 17. Добавление пакетов NuGet в решение UnityMRNotifHub
Предупреждение
Помните, что после добавления следующих пакетов NuGet (и раскомментировки кода в следующей главе) при повторном открытии кода в проекте Unity будут отображаться ошибки. Если вы хотите вернуться и продолжить редактирование в редакторе Unity, вам потребуется комментарий к некорректному коду, а затем раскомментировать его позже, как только вы вернелись в Visual Studio.
После завершения сборки смешанной реальности перейдите к созданному проекту смешанной реальности и дважды щелкните файл решения (SLN) в этой папке, чтобы открыть решение в Visual Studio 2017. Теперь необходимо добавить пакет NuGet WindowsAzure.Messaging.managed ; это библиотека, которая используется для получения уведомлений из центра уведомлений.
Чтобы импортировать пакет NuGet, выполните следующие действия.
В Обозреватель решений щелкните правой кнопкой мыши свое решение.
Щелкните Manage NuGet Packages (Управление пакетами NuGet).
Перейдите на вкладку Обзор и найдите WindowsAzure.Messaging.managed.
Выберите результат (как показано ниже) и в окне справа установите флажок рядом с пунктом Проект. При этом флажок рядом с пунктом Project будет установлен флажок рядом с проектом Assembly-CSharp и UnityMRNotifHub .
Изначально указанная версия может быть несовместима с этим проектом. Поэтому щелкните раскрывающееся меню рядом с пунктом Версия и выберите Версия 0.1.7.9, а затем нажмите кнопку Установить.
Установка пакета NuGet завершена. Найдите закомментированный код, введенный в классе NotificationReceiver , и удалите комментарии.
Глава 18. Изменение приложения UnityMRNotifHub, класса NotificationReceiver
После добавления пакетов NuGet необходимо раскомментировать часть кода в классе NotificationReceiver .
В том числе:
Пространство имен в верхней части:
using Microsoft.WindowsAzure.Messaging;
Весь код в методе 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; } }
Предупреждение
В приведенном выше коде есть комментарий: убедитесь, что вы случайно не раскомментировали этот комментарий (так как код не будет компилироваться, если у вас есть!).
И, наконец, событие 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, созданным в начале лаборатории.
Откройте решение.
Щелкните правой кнопкой мыши проект приложения UWP на панели Обозреватель решений, перейдите в Магазин и свяжите приложение с Магазином....
Появится новое окно с именем Связывание приложения с Магазином Windows. Щелкните Далее.
Он загрузит все приложения, связанные с учетной записью, в которую вы вошли. Если вы не вошли в свою учетную запись, вы можете войти на этой странице.
Найдите имя приложения Store , созданное в начале работы с этим руководством, и выберите его. Нажмите кнопку Далее.
Щелкните Связать.
Теперь ваше приложение будет связано с приложением Магазина. Это необходимо для включения уведомлений.
Глава 20. Развертывание приложений UnityMRNotifHub и UnityDesktopNotifHub
Эта глава может быть проще с двумя людьми, так как результат будет включать в себя оба приложения, одно работает на компьютере Desktop, а другое в вашей иммерсивной гарнитуре.
Приложение иммерсивной гарнитуры ожидает получения изменений в сцене (изменения позиции локального GameObjects), а классическое приложение будет вносить изменения в локальную сцену (изменения положения), которые будут доступны приложению смешанной реальности. Имеет смысл сначала развернуть приложение смешанной реальности, а затем классическое приложение, чтобы получатель смог начать прослушивание.
Чтобы развернуть приложение UnityMRNotifHub на локальном компьютере, выполните следующие действия.
Откройте файл решения приложения UnityMRNotifHub в Visual Studio 2017.
В окне Платформа решения выберите x86, Локальный компьютер.
В разделе Конфигурация решения выберите Отладка.
Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.
Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.
Чтобы развернуть приложение UnityDesktopNotifHub на локальном компьютере, выполните следующие действия.
Откройте файл решения приложения UnityDesktopNotifHub в Visual Studio 2017.
В окне Платформа решения выберите x86, Локальный компьютер.
В разделе Конфигурация решения выберите Отладка.
Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.
Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.
Запустите приложение смешанной реальности, а затем классическое приложение.
При выполнении обоих приложений переместите объект в сцену рабочего стола (с помощью левой кнопки мыши). Эти позиционные изменения будут вноситься локально, сериализоваться и отправляться в службу приложений-функций. Затем служба приложений-функций обновит таблицу вместе с центром уведомлений. Получив обновление, Центр уведомлений отправит обновленные данные непосредственно во все зарегистрированные приложения (в данном случае иммерсивное приложение гарнитуры), которое затем десериализует входящие данные и применит новые позиционные данные к локальным объектам, перемещая их в сцену.
Готовое приложение Центров уведомлений Azure
Поздравляем! Вы создали приложение смешанной реальности, которое использует службу Центров уведомлений Azure и разрешает обмен данными между приложениями.
Дополнительные упражнения
Упражнение 1.
Можете ли вы поработать, как изменить цвет GameObjects и отправить это уведомление другим приложениям, просматривающим сцену?
Упражнение 2
Можно ли добавить перемещение GameObjects в приложение смешанной реальности и увидеть обновленную сцену в классическом приложении?