250. Общий доступ в смешанной реальности: HoloLens и иммерсивные гарнитуры

Примечание

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

Благодаря гибкости универсальная платформа Windows (UWP) можно легко создать приложение, охватывающее несколько устройств. Благодаря такой гибкости мы можем создавать возможности, которые используют преимущества каждого устройства. В этом руководстве рассматривается базовый общий интерфейс, который работает как на HoloLens, так и на Windows Mixed Reality иммерсивных гарнитурах. Это содержимое было первоначально доставлено на конференции Microsoft Build 2017 в Сиэтле, штат Вашингтон.

В этом учебнике мы выполним следующее:

  • Настройте сеть с помощью UNET.
  • Совместное использование голограмм на устройствах смешанной реальности.
  • Определите другое представление приложения в зависимости от того, какое устройство смешанной реальности используется.
  • Создайте общий интерфейс, в котором пользователи HoloLens будут направлять пользователей иммерсивных гарнитур с помощью простых головоломок.

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

Курс HoloLens Иммерсивные гарнитуры
250. Общий доступ в смешанной реальности: HoloLens и иммерсивные гарнитуры ✔️ ✔️

Прежде чем начать

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

Файлы проекта

Примечание

Если вы хотите просмотреть исходный код перед скачиванием, он доступен на GitHub.

Глава 1. Holo World

Задачи

Убедитесь, что среда разработки готова к работе с простым проектом.

Что мы создадим

Приложение, отображающее голограмму на HoloLens или Windows Mixed Reality иммерсивной гарнитуре.

Этапы

  • Откройте Unity.
    • Выберите Открыть.
    • Перейдите к папке, в которой были извлечены файлы проекта.
    • Щелкните элемент Выбор папки.
    • Для первой обработки проекта в Unity потребуется некоторое время.
  • Убедитесь, что в Unity включена Смешанная реальность.
    • Откройте диалоговое окно параметров сборки (CONTROL+SHIFT+B или Параметры сборки файла > ...).
    • Выберите универсальная платформа Windows затем щелкните Переключить платформу.
    • Выберите Изменить>параметры проигрывателя.
    • На панели Инспектор справа разверните узел Параметры XR.
    • Установите флажок Виртуальная реальность поддерживается .
    • Windows Mixed Reality должен быть пакетом SDK для виртуальной реальности.
  • Создайте сцену.
    • В иерархии щелкните правой кнопкой мыши Основная камера выберите Удалить.
    • Из входных > заготовок HoloToolkit > перетащите MixedRealityCameraParent в иерархию.
  • Добавление голограмм в сцену
    • Из AppPrefabs перетащите Skybox в представление сцены.
    • Из AppPrefabs перетащите Диспетчеры в иерархию.
    • Из AppPrefabs перетащите Island в иерархию.
  • Сохранение и сборка
    • Сохранить ( control+S или file > save scene)
    • Так как это новая сцена, необходимо присвоить ей имя. Имя не имеет значения, но мы используем SharedMixedReality.
  • Экспорт в Visual Studio
    • Откройте меню сборки (CONTROL+SHIFT+B или Параметры сборки файла>)
    • Щелкните Добавить открытые сцены.
    • Проверка проектов C# в Unity
    • Щелкните Построить.
    • В появившемся окне проводника создайте новую папку с именем App.
    • Щелкните папку App одним щелчком.
    • Нажмите кнопку Выбрать папку.
    • Дождитесь завершения сборки
    • В появившемся окне проводника перейдите в папку Приложение .
    • Дважды щелкните Файл SharedMixedReality.sln , чтобы запустить Visual Studio.
  • Сборка из Visual Studio
    • С помощью верхней панели инструментов измените целевой объект на Выпуск и x86.
    • Щелкните стрелку рядом с пунктом Локальный компьютер и выберите Устройство для развертывания в HoloLens.
    • Щелкните стрелку рядом с элементом Устройство и выберите Локальный компьютер , чтобы развернуть гарнитуру смешанной реальности.
    • Щелкните Debug-Start Without Debugging (Отладка—> запуск без отладки ) или CONTROL+F5 , чтобы запустить приложение.

Копания в коде

На панели проекта перейдите к Assets\HoloToolkit\Input\Scripts\Utilities и дважды щелкните MixedRealityCameraManager.cs , чтобы открыть его.

Обзор: MixedRealityCameraManager.cs — это простой сценарий, который настраивает уровень качества и параметры фона на основе устройства. Здесь ключом является HolographicSettings.IsDisplayOpaque, который позволяет скрипту определить, является ли устройство HoloLens (IsDisplayOpaque возвращает значение false) или иммерсивной гарнитурой (IsDisplayOpaque возвращает значение true).

Наслаждайтесь своим прогрессом

На этом этапе приложение просто отрисовывает голограмму. Мы добавим взаимодействие в голограмму позже. Оба устройства будут отображать голограмму одинаково. Иммерсивная гарнитура также отрисовывает фон синего неба и облаков.

Глава 2. Взаимодействие

Задачи

Показать, как обрабатывать входные данные для приложения Windows Mixed Reality.

Что мы создадим

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

Средство обновления входных данных: На HoloLens жест выбора — это касание воздуха. На иммерсивных гарнитурах мы будем использовать кнопку A на геймпаде Xbox. Дополнительные сведения проверка в обзоре модели взаимодействия.

Этапы

  • Добавление диспетчера входных данных
    • Из входных > заготовок HoloToolkit > перетащите InputManager в иерархию как дочерний элемент Manager.
    • От входных > заготовок > HoloToolkit > Курсорперетащите курсор в иерархию.
  • Добавление пространственного сопоставления
    • Из префабов HoloToolkit > SpatialMapping >перетащите SpatialMapping в иерархию.
  • Добавление виртуального пространства воспроизведения
    • В разделе Иерархия разверните Узел MixedRealityCameraParent выберите Boundary (Граница).
    • На панели инспектора проверка поле для включения границы
    • Из AppPrefabs перетащите VRRoom в иерархию.
  • Добавление WorldAnchorManager
    • В разделе Иерархия выберите Менеджеры.
    • В инспекторе щелкните Добавить компонент.
    • Введите World Anchor Manager.
    • Выберите World Anchor Manager , чтобы добавить его.
  • Добавление TapToPlace на остров
    • В разделе Иерархия разверните узел Остров.
    • Выберите MixedRealityLand.
    • В инспекторе щелкните Добавить компонент.
    • Введите Tap To Place (Коснитесь места) и выберите его.
    • Установите флажок Разместить родительский при касании.
    • Задайте для параметра Смещение размещениязначение (0, 0,1, 0).
  • Сохранение и сборка как раньше

Копаться в коде

Сценарий 1 — GamepadInput.cs

На панели проекта перейдите в раздел Assets\HoloToolkit\Input\Scripts\InputSources и дважды щелкните GamepadInput.cs , чтобы открыть его. В том же пути на панели проекта также дважды щелкните InteractionSourceInputSource.cs.

Обратите внимание, что оба скрипта имеют общий базовый класс BaseInputSource.

BaseInputSource сохраняет ссылку на InputManager, что позволяет скрипту активировать события. В этом случае релевантно событие InputClicked. Это важно помнить, когда мы получим сценарий 2 TapToPlace. В случае GamePadInput мы опрашим на нажатие кнопки A на контроллере, а затем создадим событие InputClicked. В случае InteractionSourceInputSource мы создаем событие InputClicked в ответ на tappedEvent.

Сценарий 2. TapToPlace.cs

На панели проекта перейдите в раздел Assets\HoloToolkit\SpatialMapping\Scripts и дважды щелкните TapToPlace.cs , чтобы открыть его.

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

Во-первых, обратите внимание, что TapToPlace реализует IInputClickHandler. IInputClickHandler предоставляет функции, обрабатывающие событие InputClicked, вызванное GamePadInput.cs или InteractionSourceInputSource.cs. OnInputClicked вызывается, когда BaseInputSource обнаруживает щелчок, когда объект с TapToPlace находится в фокусе. Трансляция на HoloLens или нажатие кнопки A на геймпаде Xbox вызовет событие.

Во-вторых, код выполняется в обновлении, чтобы увидеть, просматривается ли поверхность, чтобы мы могли разместить игровой объект на поверхности, например в таблице. Иммерсивная гарнитура не имеет понятия реальных поверхностей, поэтому объект, представляющий верхнюю часть таблицы (Vroom > TableThingy > Cube), был помечен физическим слоем SpatialMapping, поэтому луч, отбрасываемый в Update, столкнется с верхней виртуальной таблицей.

Наслаждайтесь своим прогрессом

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

Глава 3. Общий доступ

Задачи

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

Что мы будем строить

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

Этапы

  • Удаление island и VRRoom
    • В иерархии щелкните правой кнопкой мыши Остров , выберите Удалить.
    • В иерархии щелкните правой кнопкой мыши VRRoom выберитеУдалить.
  • Добавить Usland
    • Из AppPrefabs перетащите Usland в иерархию.
  • Из AppPrefabs перетащите каждый из следующих элементов в раздел Иерархия:
    • UNETSharingStage
    • UNetAnchorRoot
    • UIContainer
    • DebugPanelButton
  • Сохранение и сборка как раньше

Копаться в коде

На панели проекта перейдите в раздел Активы\AppPrefabs\Support\SharingWithUnet\Scripts и дважды щелкните Файл UnetAnchorManager.cs. Возможность одного Устройства HoloLens обмениваться данными отслеживания с другим Устройством HoloLens таким образом, чтобы оба устройства могли совместно использовать одно и то же пространство, почти волшебная. Сила смешанной реальности оживает, когда два или более человека могут совместно работать, используя одни и те же цифровые данные.

В этом сценарии необходимо указать на несколько моментов:

В функции start обратите внимание на проверка для IsDisplayOpaque. В этом случае мы делаем вид, что привязка установлена. Это связано с тем, что иммерсивные гарнитуры не предоставляют способ импорта или экспорта привязок. Однако если мы выполняем на HoloLens, этот скрипт реализует совместное использование привязок между устройствами. Устройство, которое запускает сеанс, создаст привязку для экспорта. Устройство, присоединяющееся к сеансу, запросит привязку у устройства, запустив его.

Экспорт:

Когда пользователь создает сеанс, NetworkDiscoveryWithAnchors вызывает функцию UNETAnchorManagers CreateAnchor. Давайте перейдем к потоку CreateAnchor.

Для начала мы выполняем некоторые действия по обслуживанию, очищая все данные, собранные для предыдущих привязок. Затем мы проверка, есть ли кэшированные привязки для загрузки. Объем данных привязки обычно составляет от 5 до 20 МБ, поэтому повторное использованием кэшированных привязок можно сэкономить на объеме данных, необходимых для передачи по сети. Как это работает, мы увидим чуть позже. Даже при повторном использовании привязки необходимо подготовить данные привязки на случай, если присоединяется новый клиент, у которых нет привязки.

Говоря о подготовке данных привязки, класс WorldAnchorTransferBatch предоставляет функциональные возможности для подготовки данных привязки для отправки на другое устройство или приложение, а также функции для импорта данных привязки. Так как мы на пути экспорта, мы добавим нашу привязку в WorldAnchorTransferBatch и вызовем функцию ExportAsync. Затем ExportAsync вызовет обратный вызов WriteBuffer при создании данных для экспорта. После экспорта всех данных вызывается ExportComplete. В WriteBuffer мы добавляем блок данных в список, который мы сохраняем для экспорта. В разделе ExportComplete мы преобразуем список в массив. Также задана переменная AnchorName, которая активирует другие устройства для запроса привязки, если у них ее нет.

В некоторых случаях привязка не экспортирует или создает настолько мало данных, что мы попытаемся повторить попытку. Здесь мы просто снова вызываем CreateAnchor.

Последняя функция в пути экспорта — AnchorFoundRemotely. Когда другое устройство находит привязку, это устройство сообщит узлу, и узел будет использовать ее в качестве сигнала о том, что привязка является "хорошей привязкой" и может быть кэширована.

Импорт:

Когда HoloLens присоединяется к сеансу, необходимо импортировать привязку. В функции UPDATE UNETAnchorManager опрашивается anchorName. При изменении имени привязки начинается процесс импорта. Сначала мы пытаемся загрузить привязку с указанным именем из локального хранилища привязок. Если у нас уже есть, мы можем использовать его без повторного скачивания данных. Если у нас его нет, мы вызываем WaitForAnchor, который инициирует скачивание.

После завершения скачивания вызывается NetworkTransmitter_dataReadyEvent. Это сигнализирует циклу Обновления о вызове ImportAsync с загруженными данными. ImportAsync вызовет ImportComplete по завершении процесса импорта. Если импорт выполнен успешно, привязка будет сохранена в локальном хранилище проигрывателя. Файл PlayerController.cs фактически вызывает AnchorFoundRemotely, чтобы сообщить узлу о том, что установлена хорошая привязка.

Наслаждайтесь своим прогрессом

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

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

Глава 4. Погружение и телепортирование

Задачи

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

Что мы будем строить

Мы обновим приложение, чтобы пользователи иммерсивной гарнитуры размещались на острове с иммерсивным представлением. Пользователи HoloLens по-прежнему будут иметь вид с высоты птичьего полета на остров. Пользователи каждого типа устройства могут видеть других пользователей, как они появляются в мире. Например, пользователи иммерсивной гарнитуры могут видеть другие аватары на других путях на острове, а пользователи HoloLens — как гигантские облака над островом. Пользователи иммерсивной гарнитуры также увидят курсор луча взгляда пользователя HoloLens, если пользователь HoloLens смотрит на остров. Пользователи HoloLens увидят аватар на острове, чтобы представить каждого пользователя иммерсивной гарнитуры.

Обновлены входные данные для иммерсивного устройства:

  • Кнопки левого бампера и правого бампера на геймпаде Xbox повернут проигрыватель.
  • Удерживая кнопку Y на геймпаде Xbox, можно включить курсор телепорта . Если при освобождении кнопки Y курсор имеет индикатор вращающегося стрелка, вы будете телепортированы в расположение курсора.

Этапы

  • Добавление MixedRealityTeleport в MixedRealityCameraParent
    • В разделе Иерархия выберите Usland.
    • В Инспекторе включите управление уровнями.
    • В разделе Иерархия выберите MixedRealityCameraParent.
    • В инспекторе щелкните Добавить компонент.
    • Введите Смешанная реальность Teleport и выберите его.

Копаться в коде

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

Чтобы описать этот процесс, будет полезно определить два термина. Во-первых, dolly будет объектом, который перемещает камеру независимо от пользователя. Детский игровой объект куклы будет main камеры. Камера main прикреплена к голове пользователя.

На панели проекта перейдите в раздел Активы\AppPrefabs\Support\Scripts\GameLogic и дважды щелкните MixedRealityTeleport.cs.

MixedRealityTeleport имеет два задания. Во-первых, он обрабатывает поворот с помощью бамперов. В функции обновления мы опрашим значение ButtonUp в LeftBumper и RightBumper. GetButtonUp возвращает значение true только в первом кадре, после нажатия кнопки. Если была поднята любая из кнопок, мы знаем, что пользователь должен повернуться.

Когда мы вращаемся, мы выцветаем и исчезаем с помощью простого скрипта под названием "управление исчезновением". Мы делаем это, чтобы предотвратить неестественное движение пользователя, которое может привести к дискомфорту. Эффект затухания и выхода довольно прост. Перед main камерой висит черный квадроцикл. При угасания мы переносим альфа-значение с 0 на 1. Это постепенно приводит к тому, что черные пиксели четырехугольника отрисовываются и заслоняют все, что стоит за ними. При обратном переходе к нулю мы переносим альфа-значение обратно в ноль.

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

Вторая задача Для MixedRealityTeleport заключается в том, чтобы справиться с перемещением куклы. Это делается в SetWorldPosition. SetWorldPosition принимает нужное положение в мире, то есть место, в котором пользователь хочет разместиться. Мы должны поставить нашу куклу на эту позицию минус локальное положение main камеры, так как это смещение будет добавляться каждый кадр.

Второй скрипт вызывает SetWorldPosition. Давайте рассмотрим этот сценарий. На панели проекта перейдите в раздел Активы\AppPrefabs\Support\Scripts\GameLogic и дважды щелкните Файл TeleportScript.cs.

Этот скрипт является немного более задействованным, чем MixedRealityTeleport. Сценарий проверяет, не удерживается ли кнопка Y на геймпаде Xbox. Пока кнопка удерживается вниз, отрисовывается курсор телепорта, а скрипт отбрасывает луч из положения взгляда пользователя. Если этот луч сталкивается с поверхностью, которая более или менее указывает вверх, поверхность будет считаться хорошей поверхностью для телепортирования, и анимация на курсоре телепорта будет включена. Если луч не сталкивается с поверхностью, более или менее указывающей вверх, анимация на курсоре будет отключена. Когда кнопка Y отпущена и вычисляемая точка луча является допустимой позицией, скрипт вызывает SetWorldPosition с положением, которое луч пересекается.

Наслаждайтесь своим прогрессом

На этот раз вам нужно найти друга.

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

Сведения, которые следует заметить:

  1. Вы можете видеть лица в облаках, что помогает погруженным пользователям увидеть, в каком направлении смотрит пользователь HoloLens.
  2. Аватары на острове имеют шеи, которые вращаются. Они не будут следовать тому, что делает пользователь, является реальной реальностью (у нас нет этой информации), но это делает для приятного взаимодействия.
  3. Если пользователь HoloLens смотрит на остров, погруженные пользователи могут видеть свой курсор.
  4. Облака, представляющие пользователей HoloLens, отбрасывает тени.

Глава 5. Финал

Задачи

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

Что мы будем строить

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

Этапы

  • В разделе Иерархия выберите Usland.
  • В Инспекторе в разделе Управление уровнями проверка Включить совместную работу.

Копаться в коде

Теперь рассмотрим Файл LevelControl.cs. Этот скрипт является основой логики игры и поддерживает состояние игры. Так как это многопользовательская игра с использованием UNET, мы должны понимать, как потоки данных, по крайней мере достаточно хорошо, чтобы изменить этот учебник. Более полный обзор UNET см. в документации по Unity.

На панели проекта перейдите в раздел Активы\AppPrefabs\Support\Scripts\GameLogic и дважды щелкните LevelControl.cs.

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

Мы начнем с функции Update(). Обратите внимание, что существует функция "чит". Мы использовали его в разработке для тестирования последовательности запуска и сброса ракеты. Он не будет работать в многопользовательском интерфейсе. Надеюсь, к тому времени, когда вы интернализуете следующую инфромацию вы сможете заставить его работать. После того как мы проверка, чтобы узнать, следует ли нам обманывать, мы проверка, чтобы узнать, погружен ли местный игрок. Мы хотим сосредоточиться на том, как мы находимся на цели. Внутри проверка if (Погруженный) есть вызов CheckGoal, скрывающийся за bool EnableCollaboration. Это соответствует флажку, который вы установите при выполнении действий для этой главы. Внутри EnableCollaboration мы видим вызов CheckGoal().

CheckGoal делает некоторые математические вычисления, чтобы увидеть, если мы более или менее стоять на площадке. Когда мы это делаем, мы Debug.Log "Прибыл в цель", а затем мы вызываем SendAtGoalMessage(). В SendAtGoalMessage мы называем playerController.SendAtGoal. Чтобы сэкономить некоторое время, вот код:

private void CmdSendAtGoal(int GoalIndex)
{
    levelState.SetGoalIndex(GoalIndex);
}
public void SendAtGoal(int GoalIndex)
{
    if (isLocalPlayer)
    {
        Debug.Log("sending at goal " + GoalIndex);
        CmdSendAtGoal(GoalIndex);
    }
}

Обратите внимание, что SendAtGoalMessage вызывает CmdSendAtGoal, который вызывает levelState.SetGoalIndex, который находится в Файле LevelControl.cs. На первый взгляд это кажется странным. Почему бы просто не вызвать SetGoalIndex, а не эту странную маршрутизацию через контроллер игрока? Причина заключается в том, что мы соблюдаем модель данных, которую UNET использует для синхронизации данных. Чтобы предотвратить обман и обмотку, UNET требует, чтобы каждый объект был пользователем, обладающим полномочиями изменять синхронизированные переменные. Кроме того, только узел (пользователь, запустив сеанс) может напрямую изменять данные. Пользователи, которые не являются узлом, но имеют полномочия, должны отправить "команду" на узел, которая изменит переменную. По умолчанию узел имеет право на все объекты, за исключением объекта, созданного для представления пользователя. В нашем случае этот объект содержит скрипт playercontroller. Существует способ запросить полномочия для объекта, а затем внести изменения, но мы решили использовать тот факт, что контроллер игрока имеет собственные полномочия и маршрутизировать команды через контроллер проигрывателя.

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

Вернитесь в файл LevelControl.cs и посмотрите на SetGoalIndex. Здесь мы задаем значение в списке синхронизации (AtGoal). Помните, что в то время как мы делаем это, мы в контексте узла. Как и команда, RPC — это то, что может возникнуть у узла, что приведет к тому, что все клиенты будут выполнять некоторый код. Здесь мы называем "RpcCheckAllGoals". Каждый клиент будет по отдельности проверка, чтобы узнать, установлены ли все три AtGoals, и если да, запустить ракету.

Наслаждайтесь своим прогрессом

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

См. также раздел