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"
Завершив этот курс, вы получите иммерсивное приложение гарнитуры смешанной реальности и классическое приложение пк, которое сможет сделать следующее:
Классическое приложение пк позволит пользователю перемещать объект в 2D-пространстве (X и Y), используя мышь.
Перемещение объектов в приложении ПК будет отправлено в облако с помощью JSON, который будет находиться в виде строки, содержащей идентификатор объекта, тип и сведения о преобразовании (координаты X и Y).
Приложение смешанной реальности, которое имеет идентичную сцену классическому приложению, получит уведомления о перемещении объектов из службы Центров уведомлений (которая только что была обновлена приложением классического компьютера).
Получив уведомление, которое будет содержать идентификатор объекта, тип и преобразование информации, приложение смешанной реальности будет применять полученную информацию к собственной сцене.
В приложении вы узнаете, как интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша задача использовать знания, полученные от этого курса, чтобы улучшить ваше приложение смешанной реальности. Этот курс является автономным учебником, который не напрямую включает другие Смешанная реальность Лаборатории.
Поддержка устройств
Курс | HoloLens | Иммерсивные гарнитуры |
---|---|---|
MR и Azure 308: уведомления между устройствами | ✔️ | ✔️ |
Примечание.
Хотя этот курс в основном ориентирован на гарнитуры Windows Смешанная реальность иммерсивные (VR), вы также можете применить то, что вы узнаете в этом курсе к Microsoft HoloLens. При выполнении курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки HoloLens. При использовании HoloLens вы можете заметить некоторое эхо во время записи голоса.
Предварительные требования
Примечание.
Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Также помните, что предварительные требования и письменные инструкции в этом документе представляют тестируемые и проверенные на момент написания статьи (май 2018 г.). Вы можете использовать последнее программное обеспечение, как указано в статье об установке инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в новом программном обеспечении, чем указано ниже.
Для этого курса рекомендуется использовать следующее оборудование и программное обеспечение:
- Компьютер разработки, совместимый с Windows Смешанная реальность для разработки иммерсивной гарнитуры (VR)
- Windows 10 Fall Creators Update (или более поздней версии) с включенным режимом разработчика
- Последний пакет SDK для Windows 10
- Unity 2017.4
- Visual Studio 2017
- Гарнитура Windows Смешанная реальность иммерсивной (VR) или Microsoft HoloLens с включенным режимом разработчика
- Доступ к Интернету для настройки Azure и доступа к центрам уведомлений
Перед началом работы
- Чтобы избежать проблем с сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
- Вы должны быть владельцем портала разработчика Майкрософт и портала регистрации приложений, в противном случае у вас не будет разрешения на доступ к приложению в главе 2.
Глава 1. Создание приложения на портале разработчиков Майкрософт
Чтобы использовать службу Центров уведомлений Azure, вам потребуется создать приложение на портале разработчика Майкрософт, так как приложение должно быть зарегистрировано, чтобы оно могли отправлять и получать уведомления.
Войдите на портал разработчика Майкрософт.
Вам потребуется войти в учетную запись Майкрософт.
На панели мониторинга нажмите кнопку "Создать приложение".
Появится всплывающее окно, в котором необходимо зарезервировать имя нового приложения. В текстовое поле вставьте соответствующее имя; Если выбранное имя доступно, справа от текстового поля появится галочку. После вставки доступного имени нажмите кнопку "Зарезервировать имя продукта" в нижней левой части всплывающего окна.
После создания приложения вы можете перейти к следующей главе.
Глава 2. Получение учетных данных для новых приложений
Войдите на портал регистрации приложений, где будет указано новое приложение, и получите учетные данные, которые будут использоваться для настройки службы Центров уведомлений на портале Azure.
Перейдите на портал регистрации приложений.
Предупреждение
Вам потребуется использовать учетную запись Майкрософт для входа.
Это должна быть учетная запись Майкрософт, используемая в предыдущей главе, с порталом разработчика Магазина Windows.Приложение будет находиться в разделе "Мои приложения ". Когда вы нашли его, щелкните его, и вы перейдете на новую страницу с именем приложения и регистрацией.
Прокрутите страницу регистрации, чтобы найти раздел "Секреты приложения" и идентификатор безопасности пакета для приложения. Скопируйте оба варианта для использования с настройкой службы Центров уведомлений Azure в следующей главе.
Глава 3. Настройка портала Azure: создание службы Центров уведомлений
При получении учетных данных приложений вам потребуется перейти на портал Azure, где вы создадите службу Центров уведомлений Azure.
Войдите на портале Azure.
Примечание.
Если у вас еще нет учетной записи Azure, необходимо создать ее. Если вы используете это руководство в классе или лаборатории, попросите преподавателя или одного из прокторов, чтобы помочь настроить новую учетную запись.
После входа нажмите кнопку "Создать" в левом верхнем углу и найдите Центр уведомлений и нажмите клавишу ВВОД.
Примечание.
Возможно, слово New было заменено на создание ресурса на более новых порталах.
Новая страница предоставит описание службы Центров уведомлений. В нижней левой части этого запроса нажмите кнопку "Создать ", чтобы создать связь с этой службой.
После нажатия кнопки "Создать":
Вставьте требуемое имя для этого экземпляра службы.
Укажите пространство имен, которое вы сможете связать с этим приложением.
Выберите расположение.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, такими, как эти лаборатории), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, следуйте этой ссылке, чтобы управлять группой ресурсов.
Выберите соответствующую подписку.
Вам также потребуется подтвердить, что вы поняли условия, примененные к этой службе.
Нажмите кнопку создания.
После нажатия кнопки "Создать" вам придется ждать создания службы, это может занять минуту.
Уведомление появится на портале после создания экземпляра службы.
Нажмите кнопку "Перейти к ресурсу " в уведомлении, чтобы изучить новый экземпляр службы. Вы перейдете в новый экземпляр службы Концентратора уведомлений.
На странице обзора на полпути вниз по странице щелкните Windows (WNS). Панель справа изменится, чтобы отобразить два текстовых поля, которые требуют идентификатора безопасности пакета и ключа безопасности из приложения, настроенного ранее.
После копирования сведений в правильные поля нажмите кнопку "Сохранить" и вы получите уведомление при успешном обновлении Центра уведомлений.
Глава 4. Настройка портала Azure. Создание службы таблиц
После создания экземпляра службы Центров уведомлений вернитесь на портал Azure, где вы создадите службу таблиц Azure, создав ресурс хранилища.
Если вы еще не вошли, войдите на портал Azure.
После входа нажмите кнопку "Создать " в левом верхнем углу и найдите учетную запись хранения и нажмите клавишу ВВОД.
Примечание.
Возможно, слово New было заменено на создание ресурса на более новых порталах.
Выберите учетную запись хранения — большой двоичный объект, файл, таблицу, очередь из списка.
Новая страница предоставит описание службы учетной записи хранения. В нижней левой части этого запроса нажмите кнопку "Создать ", чтобы создать экземпляр этой службы.
После нажатия кнопки "Создать" появится панель:
Вставьте нужное имя для этого экземпляра службы (должно быть всеми строчными регистрами).
Для модели развертывания щелкните Resource Manager.
Для типа учетной записи, используя раскрывающееся меню, выберите хранилище (общего назначения версии 1).
Выберите соответствующее расположение.
В раскрывающемся меню репликации выберите геоизбыточное хранилище для чтения (RA-GRS).
Для повышения производительности нажмите кнопку "Стандартный".
В разделе "Безопасная передача" выберите "Отключено".
В раскрывающемся меню подписки выберите соответствующую подписку.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, такими, как эти лаборатории), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, следуйте этой ссылке, чтобы управлять группой ресурсов.
Оставьте виртуальные сети отключенными , если это вариант.
Нажмите кнопку Создать.
После нажатия кнопки "Создать" вам придется ждать создания службы, это может занять минуту.
Уведомление появится на портале после создания экземпляра службы. Щелкните уведомления, чтобы изучить новый экземпляр службы.
Нажмите кнопку "Перейти к ресурсу " в уведомлении, чтобы изучить новый экземпляр службы. Вы перейдете на страницу обзора нового экземпляра службы хранилища.
На странице обзора в правой части щелкните "Таблицы".
Панель справа изменится, чтобы отобразить сведения о службе таблиц, где необходимо добавить новую таблицу. Для этого нажмите кнопку "Таблица" + в левом верхнем углу.
Откроется новая страница, в которой необходимо ввести имя таблицы. Это имя, которое будет использоваться для ссылки на данные в приложении в последующих главах. Вставьте соответствующее имя и нажмите кнопку "ОК".
После создания новой таблицы вы сможете увидеть ее на странице службы таблиц (в нижней части).
Глава 5. Завершение таблицы Azure в Visual Studio
Теперь, когда учетная запись хранения службы таблиц настроена, пришло время добавить в нее данные, которые будут использоваться для хранения и извлечения информации. Редактирование таблиц можно сделать с помощью Visual Studio.
Откройте Visual Studio.
В меню выберите команду View>Cloud Explorer.
Cloud Explorer откроется как закрепленный элемент (быть терпеливым, так как загрузка может занять некоторое время).
Примечание.
Если подписка, используемая для создания учетных записей хранения, не отображается, убедитесь, что у вас есть:
Войдите в ту же учетную запись, что и для портала Azure.
Выберите подписку на странице управления учетными записями (возможно, потребуется применить фильтр из параметров учетной записи):
Будут показаны облачные службы Azure. Найдите учетные записи хранения и щелкните стрелку слева от него, чтобы развернуть учетные записи.
После развертывания будет доступна только что созданная учетная запись хранения. Щелкните стрелку слева от хранилища, а затем после развертывания найдите таблицы и щелкните стрелку рядом с этим, чтобы открыть таблицу , созданную в последней главе. Дважды щелкните таблицу.
Таблица откроется в центре окна Visual Studio. Щелкните значок таблицы со значком + (плюс) на нем.
Откроется окно с запросом на добавление сущности. Вы создадите три сущности в общей сложности, каждый из которых имеет несколько свойств. Вы заметите, что partitionKey и RowKey уже предоставлены, так как они используются таблицей для поиска данных.
Обновите значение Секционирования и 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 было заменено на создание ресурса на более новых порталах.
Новая страница предоставит описание службы приложений-функций. В нижней левой части этого запроса нажмите кнопку "Создать ", чтобы создать связь с этой службой.
После нажатия кнопки "Создать" введите следующее:
Для имени приложения вставьте требуемое имя для этого экземпляра службы.
Выберите подписку.
Выберите ценовую категорию, подходящую для вас, если это первый раз при создании функции Служба приложений, для вас должен быть доступен бесплатный уровень.
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов 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, службе таблиц.
Подключение учетной записи хранения: щелкните новое, которое отображается вместе с раскрывающимся меню, а панель появится справа от окна.
Выберите учетную запись хранения, созданную ранее для размещения приложений-функций.
Вы заметите, что было создано значение подключения учетной записи хранения.
Не забудьте нажать клавишу Save после завершения.
Теперь страница "Входные данные" должна соответствовать приведенной ниже информации.
Затем щелкните Центр уведомлений Azure (уведомление) в разделе "Выходные данные". Убедитесь, что следующие данные соответствуют вашим данным, так как они могут отличаться (ниже приведено изображение ниже):
Имя концентратора уведомлений: это имя экземпляра службы Центра уведомлений, созданного ранее.
Подключение к пространству имен Центров уведомлений: щелкните новое, которое отображается вместе с раскрывающимся меню.
Появится всплывающее окно подключения (см. изображение ниже), где необходимо выбрать пространство имен Центра уведомлений, которое вы настроили ранее.
Выберите имя центра уведомлений в раскрывающемся меню среднего списка.
Задайте раскрывающееся меню политики значение DefaultFullSharedAccessSignature.
Нажмите кнопку "Выбрать", чтобы вернуться.
Теперь страница "Выходные данные" должна соответствовать приведенной ниже, но с вашей информацией. Не забудьте нажать клавишу SAVE.
Предупреждение
Не изменяйте имя концентратора уведомлений напрямую (все это необходимо сделать с помощью Расширенный редактор, если вы выполнили предыдущие шаги правильно.
На этом этапе необходимо протестировать функцию, чтобы убедиться, что она работает. Для этого:
Перейдите на страницу функции еще раз:
Вернитесь на страницу функции, щелкните вкладку "Тест" в правой части страницы, чтобы открыть колонку "Тест" :
В текстовое поле "Запрос " колонки вставьте приведенный ниже код:
{ "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 Смешанная реальность.
Откройте Unity и нажмите кнопку "Создать".
Необходимо указать имя проекта Unity, вставить UnityDesktopNotifHub. Убедитесь, что для типа проекта задано значение 3D. Задайте расположение в нужном месте (помните, что ближе к корневым каталогам лучше). Затем нажмите кнопку "Создать проект".
При открытии Unity стоит проверить, установлен ли редактор скриптов по умолчанию в Visual Studio. Перейдите к разделу "Изменить>параметры", а затем в новом окне перейдите к внешним средствам. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно параметров.
Затем перейдите к параметрам сборки файлов>и выберите универсальная платформа Windows, а затем нажмите кнопку "Переключить платформу", чтобы применить выбранный вариант.
Хотя все еще в параметрах сборки файлов>убедитесь, что:
Целевое устройство имеет значение Any Device
Это приложение будет для вашего рабочего стола, поэтому должно быть любое устройство
Тип сборки имеет значение D3D
Для пакета SDK установлено значение "Последняя версия"
Версия Visual Studio установлена в качестве последней версии
Для сборки и запуска задано значение Local Machine
В то время как здесь, стоит сохранить сцену и добавить ее в сборку.
Для этого выберите "Добавить открытые сцены". Откроется окно сохранения.
Создайте новую папку для этого, а также любую будущую сцену, а затем нажмите кнопку "Создать папку", чтобы создать новую папку, присвойте ей имя "Сцены".
Откройте только что созданную папку "Сцены" , а затем в поле "Файл": текстовое поле, введите 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.
Чтобы создать этот класс, выполните указанные ниже действия.
Щелкните правой кнопкой мыши папку ресурса , расположенную на панели проекта, создайте>папку. Назовите скрипты папок.
Дважды щелкните только что созданную папку, чтобы открыть ее.
Щелкните правой кнопкой мыши в папке "Скрипты", нажмите кнопку "Создать>скрипт 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() добавьте следующий код, который будет обнаруживать входные данные мыши и перетаскивать, что, в свою очередь, приведет к перемещению GameObjects в сцене. Если пользователь перетаскивал и удалял объект, он передает имя и координаты объекта методу 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 на главную камеру.
Щелкните главную камеру на панели иерархии, чтобы его свойства отображались в инспекторе.
Открыв папку "Скрипты", выберите скрипт 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, нажав кнопку "Переключить платформу".
Перейдите к параметрам сборки файлов>и убедитесь, что:
Целевое устройство имеет значение Any Device
Для Microsoft HoloLens задайте для целевого устройства значение HoloLens.
Тип сборки имеет значение D3D
Для пакета SDK установлено значение "Последняя версия"
Версия Visual Studio установлена в качестве последней версии
Для сборки и запуска задано значение Local Machine
В то время как здесь, стоит сохранить сцену и добавить ее в сборку.
Для этого выберите "Добавить открытые сцены". Откроется окно сохранения.
Создайте новую папку для этого, а также любую будущую сцену, а затем нажмите кнопку "Создать папку", чтобы создать новую папку, присвойте ей имя "Сцены".
Откройте только что созданную папку "Сцены" , а затем в поле "Файл": текстовое поле, введите NH_MR_Scene, а затем нажмите кнопку "Сохранить".
Остальные параметры в параметрах сборки должны оставаться по умолчанию.
В том же окне нажмите кнопку "Параметры проигрывателя", откроется связанная панель в пространстве, где находится инспектор .
На этой панели необходимо проверить несколько параметров:
На вкладке "Другие параметры" :
Версия среды выполнения сценариев должна быть экспериментальной (эквивалентно .NET 4.6)
Серверная часть скриптов должна быть .NET
Уровень совместимости API должен быть .NET 4.6
Далее вниз по панели в параметрах XR (приведенных ниже параметров публикации), установите флажок "Поддержка виртуальной реальности", убедитесь, что пакет SDK для Windows Смешанная реальность добавлен.
На вкладке "Параметры публикации" в разделе "Возможности" проверьте:
InternetClient;
Вернувшись в параметры сборки, проекты C# Unity больше не серые: установите флажок рядом с этим.
После внесения этих изменений закройте окно параметров сборки.
Сохраните сцену и файл файла>проекта, сохраните сцену или проект сохранения файлов.>
Внимание
Если вы хотите пропустить компонент настройки 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, который отвечает за следующее:
- Регистрация приложения в Центре уведомлений при инициализации.
- Прослушивание уведомлений, поступающих из Центра уведомлений.
- Десериализация данных объекта из полученных уведомлений.
- Переместите gameObjects в сцену на основе десериализованных данных.
Чтобы создать скрипт 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 в сцене MR в ту же позицию.
Внимание
Код закомментирован, так как код ссылается на библиотеку обмена сообщениями 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.
Перейдите к параметрам сборки (параметры сборки файлов>).
В меню "Параметры сборки" убедитесь, что проекты C# Unity* (что позволит редактировать скрипты в этом проекте после сборки).
После этого нажмите кнопку "Сборка".
Появится всплывающее окно проводник, запрашивающее расположение для сборки. Создайте новую папку (нажав кнопку "Создать папку " в левом верхнем углу) и присвойте ей имя 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. Это библиотека, используемая для получения уведомлений из Центра уведомлений.
Чтобы импортировать пакет NuGet, выполните следующие действия.
В Обозреватель решений щелкните правой кнопкой мыши решение
Щелкните "Управление пакетами 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
Теперь необходимо связать проект смешанной реальности с приложением Store, созданным в начале лаборатории.
Откройте решение.
Щелкните правой кнопкой мыши проект приложения UWP на панели Обозреватель решений, перейдите в Магазин и свяжите приложение с Магазином....
Откроется новое окно с именем "Связать приложение с Магазином Windows". Нажмите кнопку Далее.
Он загрузит все приложения, связанные с учетной записью, вошедшего в систему. Если вы не вошли в учетную запись, вы можете войти на этой странице.
Найдите имя приложения Store, созданное в начале этого руководства, и выберите его. Затем нажмите Далее.
Щелкните Связать.
Теперь приложение связано с приложением Store. Это необходимо для включения уведомлений.
Глава 20. Развертывание приложений UnityMRNotifHub и UnityDesktopNotifHub
Эта глава может быть проще с двумя людьми, так как в результате будут работать оба приложения, один работает на компьютере Desktop, а другой — в иммерсивной гарнитуре.
Приложение иммерсивной гарнитуры ожидает получения изменений в сцене (изменения положения локальных GameObjects), а классическое приложение будет вносить изменения в локальную сцену (изменения положения), которое будет предоставлено приложению MR. Сначала необходимо развернуть приложение MR, а затем классическое приложение, чтобы получатель начал прослушивать.
Чтобы развернуть приложение UnityMRNotifHub на локальном компьютере, выполните следующие действия.
Откройте файл решения приложения UnityMRNotifHub в Visual Studio 2017.
На платформе решения выберите x86, Локальный компьютер.
В разделе "Конфигурация решения" выберите "Отладка".
Перейдите в меню "Сборка" и щелкните "Развернуть решение ", чтобы загрузить неопубликованное приложение на компьютер.
Теперь приложение должно отображаться в списке установленных приложений, готовых к запуску.
Чтобы развернуть приложение UnityDesktopNotifHub на локальном компьютере, выполните следующие действия.
Откройте файл решения приложения UnityDesktopNotifHub в Visual Studio 2017.
На платформе решения выберите x86, Локальный компьютер.
В разделе "Конфигурация решения" выберите "Отладка".
Перейдите в меню "Сборка" и щелкните "Развернуть решение ", чтобы загрузить неопубликованное приложение на компьютер.
Теперь приложение должно отображаться в списке установленных приложений, готовых к запуску.
Запустите приложение смешанной реальности, за которым следует классическое приложение.
При выполнении обоих приложений переместите объект на рабочем столе (с помощью левой кнопки мыши). Эти позиционные изменения будут сделаны локально, сериализованы и отправлены в службу приложений-функций. Затем служба приложений-функций обновит таблицу вместе с Центром уведомлений. Получив обновление, Центр уведомлений отправит обновленные данные непосредственно всем зарегистрированным приложениям (в этом случае иммерсивное приложение гарнитуры), которое затем десериализирует входящие данные и применит новые позиционные данные к локальным объектам, перемещая их на сцене.
Готовое приложение Центров уведомлений Azure
Поздравляем, вы создали приложение смешанной реальности, которое использует службу Центров уведомлений Azure и разрешает обмен данными между приложениями.
Дополнительные упражнения
Упражнение 1
Вы можете узнать, как изменить цвет GameObjects и отправить это уведомление другим приложениям, просматривающим сцену?
Упражнение 2
Можно ли добавить перемещение GameObjects в приложение MR и просмотреть обновленную сцену в классическом приложении?