注意

Mixed Reality Academy チュートリアルでは、HoloLens として設計された (第 1 世代) と混在の現実イマーシブ ヘッドセットに注意してください。The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. そのため、これらのデバイス向けの開発にガイダンスがまだ必要な開発者のための場所でこれらのチュートリアルのままにすることが重要と思われます。As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. これらのチュートリアルは いない 最新のツールセットや相互作用が使用されている HoloLens 2 で更新されます。These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. サポートされているデバイスで作業を続行するが保持されます。They will be maintained to continue working on the supported devices. 一連の新しい HoloLens 2 を開発する方法を示すチュートリアルは、今後投稿があります。There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. この通知が投稿されるときにこれらのチュートリアルへのリンクが更新されます。This notice will be updated with a link to those tutorials when they are posted.


MR が 250 の共有:HoloLens とイマーシブ ヘッドセットMR Sharing 250: HoloLens and immersive headsets

柔軟性のユニバーサル Windows プラットフォーム (UWP) により、複数のデバイスにまたがるアプリケーションを作成する簡単です。With the flexibility of Universal Windows Platform (UWP), it is easy to create an application that spans multiple devices. この柔軟性により、各デバイスの長所を活用するエクスペリエンスを生み出すことができます。With this flexibility, we can create experiences that leverage the strengths of each device. このチュートリアルでは、イマーシブ ヘッドセットを HoloLens と Windows Mixed Reality の両方で実行されている基本の共有エクスペリエンスを説明します。This tutorial will cover a basic shared experience that runs on both HoloLens and Windows Mixed Reality immersive headsets. このコンテンツは、Microsoft Build 2017 カンファレンス、ワシントン州シアトルで配信元でした。This content was originally delivered at the Microsoft Build 2017 conference in Seattle, WA.

このチュートリアルでご紹介します。In this tutorial, we will:

  • UNET を使用してネットワークをセットアップします。Setup a network using UNET.
  • 複合現実デバイス間でホログラムを共有します。Share holograms across mixed reality devices.
  • 複合現実デバイスが使用されているに応じてアプリケーションの別のビューを確立します。Establish a different view of the application depending on which mixed reality device is being used.
  • HoloLens のユーザーがいくつかの簡単なパズルを使用してイマーシブ ヘッドセット ユーザーをガイドする共有エクスペリエンスを作成します。Create a shared experience where HoloLens users guide immersive headsets users through some simple puzzles.

デバイスのサポートDevice support

コースCourse HoloLensHoloLens イマーシブ ヘッドセットImmersive headsets
MR が 250 の共有:HoloLens とイマーシブ ヘッドセットMR Sharing 250: HoloLens and immersive headsets ✔️✔️ ✔️✔️

開始前の作業Before you start

前提条件Prerequisites

プロジェクト ファイルProject files

注意

をダウンロードする前に、ソース コードを検索する場合があるGitHub で入手できますします。If you want to look through the source code before downloading, it's available on GitHub.

第 1 章 - Holo 世界Chapter 1 - Holo World

目標Objectives

開発環境が単純なプロジェクトに対応することを確認します。Make sure the development environment is ready to go with a simple project.

構築します。What we will build

HoloLens と Windows Mixed Reality ヘッドセット没入型のいずれかでホログラムを表示するアプリケーション。An application that shows a hologram on either HoloLens or a Windows Mixed Reality immersive headset.

手順Steps

  • Unity を開きます。Open Unity.
    • [開く] を選択します。Select Open.
    • プロジェクト ファイルを抽出した場所に移動します。Navigate to where you extracted the project files.
    • [フォルダーの選択] をクリックします。Click Select Folder.
    • 少し、初めてのプロジェクトを処理する Unity の中にかかります。It will take a little while for Unity to process the project the first time.
  • Unity で Mixed Reality が有効になっていることを確認します。Check that Mixed Reality is enabled in Unity.
    • ビルドの設定 ダイアログを開きます (コントロール + Shift + Bまたはファイル > Build Settings...).Open the build settings dialog (Control+Shift+B or File > Build Settings...).
    • 選択ユニバーサル Windows プラットフォームクリックしてスイッチ プラットフォームします。Select Universal Windows Platform then click Switch Platform.
    • 選択編集 > プレーヤー設定します。Select Edit>Player Settings.
    • インスペクター 、右側にパネルで、展開XR 設定します。In the Inspector panel on the right hand side, expand XR Settings.
    • チェック、仮想現実サポートボックス。Check the Virtual Reality Supported box.
    • Windows Mixed Reality 仮想現実 SDK があります。Windows Mixed Reality should be the Virtual Reality SDK.
  • シーンを作成します。Create a scene.
    • 階層を右クリックしてMain Camera選択削除します。In the Hierarchy right click Main Camera select Delete.
    • HoloToolkit > の入力 > プレハブドラッグMixedRealityCameraParent階層します。From HoloToolkit > Input > Prefabs drag MixedRealityCameraParent to the Hierarchy.
  • ホログラムをシーンに追加します。Add Holograms to the scene
    • AppPrefabsドラッグスカイ ボックスシーン ビューします。From AppPrefabs drag Skybox to the Scene View.
    • AppPrefabsドラッグマネージャー階層します。From AppPrefabs drag Managers to the Hierarchy.
    • AppPrefabsドラッグ階層します。From AppPrefabs drag Island to the Hierarchy.
  • 保存し、ビルドSave And build
    • 保存 (かコントロール + Sまたはファイル > シーンを保存)Save (either Control+S or File > Save Scene)
    • これは、新しいシーンであるために名前を付ける必要があります。Since this is a new scene, you'll need to name it. 名前は関係ありませんが、SharedMixedReality を使用します。Name doesn't matter, but we use SharedMixedReality.
  • Visual Studio へのエクスポートします。Export To Visual Studio
    • [ビルド] メニューを開きます (コントロール + Shift + Bまたはファイル > Build Settings)Open the build menu (Control+Shift+B or File > Build Settings)
    • クリックして開くシーンを追加します。Click Add Open Scenes.
    • 確認UnityC#プロジェクトCheck Unity C# Projects
    • [Build] をクリックします。Click Build.
    • ファイル エクスプ ローラー ウィンドウが表示されますでという名前の新しいフォルダーを作成アプリします。In the file explorer window that appears, create a New Folder named App.
    • 1 回のクリック、アプリフォルダー。Single click the App folder.
    • キーを押してフォルダーを選択します。Press Select Folder.
    • ビルドが完了するまで待ちますWait for the build to complete
    • ファイル エクスプ ローラー ウィンドウが表示されますに移動します、アプリフォルダー。In the file explorer window that appears, navigate into the App folder.
    • ダブルクリックSharedMixedReality.sln Visual Studio を起動するにはDouble-click SharedMixedReality.sln to launch Visual Studio
  • Visual Studio からビルドします。Build From Visual Studio
    • ターゲットを上部のツールバーを使用して変更リリースx86します。Using the top toolbar change target to Release and x86.
    • 矢印をクリックしてローカル マシン選択とデバイスHoloLens にデプロイするにはClick the arrow next to Local Machine and select Device to deploy to HoloLens
    • 矢印をクリックしてデバイス選択ローカル マシンmixed reality ヘッドセットをデプロイします。Click the arrow next to Device and select Local Machine to deploy for the mixed reality headset.
    • クリックしてデバッグ]、[デバッグなしで開始またはコントロール + f5 キーを押してアプリケーションを起動します。Click Debug->Start Without Debugging or Control+F5 to start the application.

コードをについてください。Digging into the code

[プロジェクト] パネルに移動しますAssets\HoloToolkit\Input\Scripts\UtilitiesをダブルクリックしてMixedRealityCameraManager.csを開きます。In the project panel, navigate to Assets\HoloToolkit\Input\Scripts\Utilities and double click MixedRealityCameraManager.cs to open it.

概要: MixedRealityCameraManager.cs は、デバイスに基づいて、品質のレベルとバック グラウンドの設定を調整する単純なスクリプトです。Overview: MixedRealityCameraManager.cs is a simple script that adjusts quality level and background settings based on the device. キー HolographicSettings.IsDisplayOpaque、これにより、デバイスが、HoloLens を検出するスクリプトを次に示します (IsDisplayOpaque false を返す) または (IsDisplayOpaque true を返す)、イマーシブ ヘッドセット。Key here is HolographicSettings.IsDisplayOpaque, which allows a script to detect if the device is a HoloLens (IsDisplayOpaque returns false) or an immersive headset (IsDisplayOpaque returns true).

進行状況をお楽しみください。Enjoy your progress

この時点で、アプリケーションはホログラムだけを表示します。At this point the application will just render a hologram. 後で、ホログラムに相互作用を追加します。We will add interaction to the hologram later. 両方のデバイスは、レンダリング、ホログラム同じ。Both devices will render the hologram the same. イマーシブ ヘッドセットは青色空とクラウドのバック グラウンドにも表示します。The immersive headset will also render a blue sky and clouds background.

第 2 章 – 相互作用Chapter 2 - Interaction

目標Objectives

Windows Mixed Reality アプリケーションの入力を処理する方法を示します。Show how to handle input for a Windows Mixed Reality application.

構築します。What we will build

第 1 章からアプリケーションを構築して、ユーザーが、ホログラムを選択し、HoloLens で現実世界の画面で、または、イマーシブ ヘッドセットの仮想テーブルに配置できるようにする機能を追加します。Building on the application from chapter 1, we will add functionality to allow the user to pick up the hologram and place it on a real world surface in HoloLens or on a virtual table in an immersive headset.

入力リフレッシャーは: HoloLens 選択ジェスチャは、エア タップします。Input Refresher: On HoloLens the select gesture is the air tap. イマーシブ ヘッドセットでの使用、 A Xbox コント ローラー上のボタンをクリックします。On immersive headsets, we will use the A button on the Xbox controller. 入力の詳細についてはここから始めてします。For more information on input start here.

手順Steps

  • 入力マネージャーを追加します。Add Input manager
    • HoloToolkit > の入力 > プレハブドラッグInputManager階層の子としてマネージャーします。From HoloToolkit > Input > Prefabs drag InputManager to Hierarchy as a child of Managers.
    • HoloToolkit > の入力 > プレハブ > カーソルドラッグカーソル階層します。From HoloToolkit > Input > Prefabs > Cursor drag Cursor to Hierarchy.
  • 空間マッピングを追加します。Add Spatial Mapping
    • HoloToolkit > SpatialMapping > プレハブドラッグSpatialMapping階層します。From HoloToolkit > SpatialMapping > Prefabs drag SpatialMapping to Hierarchy.
  • 仮想 Playspace を追加します。Add Virtual Playspace
    • 階層展開MixedRealityCameraParent選択境界In Hierarchy expand MixedRealityCameraParent select Boundary
    • インスペクターパネルのチェック ボックスを有効にするを境界In Inspector panel check the box to enable Boundary
    • AppPrefabsドラッグVRRoom階層します。From AppPrefabs drag VRRoom to Hierarchy.
  • WorldAnchorManager を追加します。Add WorldAnchorManager
    • 階層マネージャーします。In Hierarchy, Select Managers.
    • インスペクター、 をクリックしてコンポーネントの追加します。In Inspector, click Add Component.
    • World アンカー Managerします。Type World Anchor Manager.
    • 選択World アンカー Managerに追加します。Select World Anchor Manager to add it.
  • TapToPlace を島に追加します。Add TapToPlace to the Island
    • 階層、展開します。In Hierarchy, expand Island.
    • 選択MixedRealityLandします。Select MixedRealityLand.
    • インスペクター、 をクリックしてコンポーネントの追加します。In Inspector, click Add Component.
    • の場所をタップしてして選択します。Type Tap To Place and select it.
    • 確認Tap に親を配置します。Check Place Parent On Tap.
    • 設定配置オフセット(0, 0.1, 0) します。Set Placement Offset to (0, 0.1, 0).
  • 保存し、以前とビルドSave and Build as before

コードをについてください。Digging into the code

スクリプト 1 - GamepadInput.csScript 1 - GamepadInput.cs

[プロジェクト] パネルに移動しますAssets\HoloToolkit\Input\Scripts\InputSourcesをダブルクリックしてGamepadInput.csを開きます。In the project panel navigate to Assets\HoloToolkit\Input\Scripts\InputSources and double click GamepadInput.cs to open it. [プロジェクト] パネルで同じパスにもダブルクリックInteractionSourceInputSource.csします。From the same path in the project panel, also double click InteractionSourceInputSource.cs.

両方のスクリプトが共通の基本クラス BaseInputSource を持つことに注意してください。Note that both scripts have a common base class, BaseInputSource.

BaseInputSource、InputManager では、により、スクリプトでイベントをトリガーへの参照を保持します。BaseInputSource keeps a reference to an InputManager, which allows a script to trigger events. この場合、InputClicked イベントが関連します。In this case, the InputClicked event is relevant. これは、スクリプト 2、TapToPlace を取得する際に重要になります。This will be important to remember when we get to script 2, TapToPlace. GamePadInput の場合は、A ボタンを押す、コント ローラーでのポーリングし、InputClicked イベントが発生しました。In the case of GamePadInput, we poll for the A button on the controller to be pressed, then we raise the InputClicked event. InteractionSourceInputSource の場合は、TappedEvent への応答で InputClicked イベントを発生します。In the case of InteractionSourceInputSource, we raise the InputClicked event in response to the TappedEvent.

2 - TapToPlace.cs スクリプトScript 2 - TapToPlace.cs

[プロジェクト] パネルに移動しますAssets\HoloToolkit\SpatialMapping\ScriptsをダブルクリックしてTapToPlace.csを開きます。In the project panel navigate to Assets\HoloToolkit\SpatialMapping\Scripts and double click TapToPlace.cs to open it.

まず、多くの開発者が Holographic アプリケーションを作成するときに実装するには、ジェスチャ入力ホログラムは移動です。The first thing many developers want to implement when creating a Holographic application is moving Holograms with gesture input. そのため、このスクリプトを十分にコメントするよう努めていますしました。As such, we've endeavored to thoroughly comment this script. いくつかの点では、このチュートリアルでは注目すべきです。A few things are worth highlighting for this tutorial.

まず、TapToPlace IInputClickHandler を実装することに注意してください。First, note that TapToPlace implements IInputClickHandler. IInputClickHandler は、GamePadInput.cs または InteractionSourceInputSource.cs によって発生する InputClicked イベントを処理する関数を公開します。IInputClickHandler exposes the functions that handle the InputClicked event raised by GamePadInput.cs or InteractionSourceInputSource.cs. BaseInputSource TapToPlace のオブジェクトにフォーカスが中に、クリックを検出する OnInputClicked が呼び出されます。OnInputClicked is called when a BaseInputSource detects a click while the object with TapToPlace is in focus. HoloLens で airtapping または Xbox コント ローラーで、[A] ボタンを押してのいずれかは、イベントをトリガーします。Either airtapping on HoloLens or pressing the A button on the Xbox controller will trigger the event.

2 つ目は、参照テーブルのように、サーフェイス ゲーム オブジェクトを配置できるように、サーフェスがで参照されるかどうかの更新で、コードを実行します。Second is the code be executed in update to see if a surface is being looked at so we can place the game object on a surface, like a table. イマーシブ ヘッドセットは実際のサーフェスの概念をこれがないテーブルの一番上を表すオブジェクト (Vroom > TableThingy > キューブ) 更新プログラムでキャスト射線は仮想テーブルの上部と競合するので、SpatialMapping 物理層がマークされています。The immersive headset doesn't have a concept of real surfaces, so the object that represents the table top (Vroom > TableThingy > Cube) has been marked with the SpatialMapping physics layer, so the ray cast in Update will collide with the virtual table top.

進行状況をお楽しみください。Enjoy your progress

この時間に移動島を選択できます。This time you can select the island to move it. HoloLens の島を実際の画面に移動できます。On HoloLens you can move the island to a real surface. イマーシブ ヘッドセットには、仮想テーブルを追加しましたに島を移動できます。In the immersive headset you can move the island to the virtual table we added.

第 3 章 - 共有Chapter 3 - Sharing

目標Objectives

ネットワークが正しく構成されていることを確認し、詳細空間アンカーは、デバイス間で共有される方法です。Ensure that the network is correctly configured and detail how spatial anchors are shared between devices.

構築します。What we will build

このプロジェクトはマルチプレイヤー プロジェクトに変換します。We will convert our project to a multiplayer project. ホストまたは結合のセッションに UI とロジックを追加します。We will add UI and logic to host or join sessions. HoloLens のユーザーが互いを見るとクラウドのセッションで、頭の上、イマーシブ ヘッドセット ユーザーがクラウド アンカーが近くにあります。HoloLens users will see each other in the session with clouds over their heads, and immersive headset users have clouds near to where the anchor is. イマーシブ ヘッドセット内のユーザーは、シーンの原点 HoloLens のユーザーに表示されます。Users in the immersive headsets will see the HoloLens users relative to the origin of the scene. HoloLens のユーザーの同じ場所に島ホログラムがすべて参照してください。HoloLens users will all see the hologram of the island in the same place. キー、イマーシブ ヘッドセット内のユーザーがこの章では、中に、島にされませんが、アイランドの鳥アイ ビューで、HoloLens を非常によく似た動作をすることをお勧めします。It is key to note that the users in the immersive headsets will not be on the island during this chapter, but will behave very similarly to HoloLens, with a birds eye view of the island.

手順Steps

  • 削除島と VRRoomRemove Island and VRRoom
    • 階層選択削除In Hierarchy right-click Island select Delete
    • 階層VRRoom選択削除In Hierarchy right-click VRRoom select Delete
  • Usland を追加します。Add Usland
    • AppPrefabsドラッグUsland階層します。From AppPrefabs drag Usland to Hierarchy.
  • AppPrefabsドラッグするには、次の各階層:From AppPrefabs drag each of the following to Hierarchy:
    • UNETSharingStageUNETSharingStage
    • UNetAnchorRootUNetAnchorRoot
    • UIContainerUIContainer
    • DebugPanelButtonDebugPanelButton
  • 保存し、以前とビルドSave and Build as before

コードをについてください。Digging into the code

[プロジェクト] パネルに移動しますAssets\AppPrefabs\Support\SharingWithUnet\ScriptsダブルクリックしてUnetAnchorManager.csします。In the project panel, navigate to Assets\AppPrefabs\Support\SharingWithUnet\Scripts and double-click on UnetAnchorManager.cs. デバイスの両方で同じスペースを共有できるように、別の HoloLens と追跡情報を共有する 1 つの HoloLens の機能は、魔法の近くです。The ability for one HoloLens to share tracking information with another HoloLens such that both devices can share the same space is near magical. 複合現実の電源がアライブの場合は、2 つ、またはより多くの人が同じデジタル データを使用して共同作業できます。The power of mixed reality comes alive when two or more people can collaborate using the same digital data.

このスクリプトで指摘していくつかの点。A few things to point out in this script:

Start 関数のチェックに注意してください。 IsDisplayOpaqueします。In the start function, notice the check for IsDisplayOpaque. この場合、アンカーが確立されている見かけ上します。In this case, we pretend that the Anchor is established. これは、イマーシブ ヘッドセットはインポートまたはアンカーをエクスポートする方法を公開しないためにです。This is because the immersive headsets do not expose a way to import or export anchors. 私たちは、HoloLens で実行している場合、ただし、このスクリプトはデバイス間で共有のアンカーを実装します。If we are running on a HoloLens, however, this script implements sharing anchors between the devices. セッションを開始するデバイスでは、エクスポートするためのアンカーを作成します。The device that starts the session will create an anchor for exporting. セッションを開始したデバイスからは、セッションに参加するデバイスは、アンカーを要求します。The device that joins a session will request the anchor from the device that started the session.

エクスポートするには。Exporting:

ユーザーは、セッションを作成するときに、NetworkDiscoveryWithAnchors は UNETAnchorManagers CreateAnchor 関数を呼び出します。When a user creates a session, NetworkDiscoveryWithAnchors will call UNETAnchorManagers’ CreateAnchor function. CreateAnchor フローを追いかけてみましょう。Let's follow CreateAnchor flow.

まず、前の基準の収集された可能性がありますがデータを消去する、いくつかのハウスキーピングを実行します。We start by doing some housekeeping, clearing out any data we may have collected for previous anchors. キャッシュのアンカーを読み込むかどうかは確認します。Then we check if there is a cached anchor to load. アンカーのデータは、キャッシュされた表現のアンカーを再利用で、ネットワーク経由で転送する必要。 データの量に保存できるようにの 5 ~ 20 mb にする傾向があります。The anchor data tends to be between 5 and 20 MB, so reusing cached anchors can save on the amount of data we need to transfer over the network. 後で少し動作が表示されます。We'll see how this works a bit later. アンカーを再利用しますが、場合でも、新しいクライアントを結合する場合にデータの準備がないアンカーのアンカーを取得する必要があります。Even if we are reusing the anchor, we need to get the anchor data ready in case a new client joins that doesn't have the anchor.

アンカーのデータの準備と言えば、WorldAnchorTransferBatch クラスは、アンカーのデータをインポートするには、別のデバイスまたはアプリケーションと機能に送信するためのアンカーのデータを準備するための機能を公開します。Speaking of getting the anchor data ready, the WorldAnchorTransferBatch class exposes the functionality to prepare anchor data for sending to another device or application and the functionality to import the anchor data. エクスポート パスに対するだから私たち、WorldAnchorTransferBatch に、アンカーを追加し、ExportAsync 関数を呼び出します。Since we're on the export path, we will add our anchor to the WorldAnchorTransferBatch and call the ExportAsync function. エクスポートのデータを生成し、ExportAsync は WriteBuffer コールバックを呼び出します。ExportAsync will then call the WriteBuffer callback as it generates data for export. すべてのデータがエクスポートされると ExportComplete が呼び出されます。When all of the data has been exported ExportComplete will be called. WriteBuffer では、エクスポートはあと保存リストにデータのチャンクを追加します。In WriteBuffer we add the chunk of data to a list we keep for exporting. ExportComplete で、配列にリストを変換します。In ExportComplete we convert the list to an array. AnchorName 変数も設定されます、その他のデバイスを起動することがあるない場合、アンカーを要求します。The AnchorName variable is also set, which will trigger other devices to request the anchor if they don't have it.

いくつかの場合、アンカーをエクスポートしませんまたはデータが少量は作成私たちはもう一度やり直してください。In some cases the anchor won't export or will create so little data that we will try again. ここでだけ呼び出して CreateAnchor もう一度です。Here we just call CreateAnchor again.

エクスポート パスに最終的な関数では、AnchorFoundRemotely です。A final function in the export path is AnchorFoundRemotely. 別のデバイスには、アンカーが検出されると、そのデバイスをホストに通知され、ホスト アンカーが「良いアンカー」シグナルとしてを使用してキャッシュできます。When another device finds the anchor, that device will tell the host, and the host will use that as a signal that the anchor is a "good anchor" and can be cached.

インポート。Importing:

HoloLens は、セッションに参加する場合は、アンカーのインポートが必要です。When a HoloLens joins a session, it needs to import an anchor. UNETAnchorManager の更新プログラムの関数で、AnchorName にポーリングされます。In UNETAnchorManager's Update function, the AnchorName is polled. アンカーの名前が変更されたときに、インポート プロセスを開始します。When the anchor name changes, the import process begins. まず、アンカーのローカル ストアから、指定した名前のアンカーを読み込むとします。First, we try to load the anchor with the specified name from the local anchor store. 既にがある場合に、そのデータをもう一度ダウンロードしなくても使用できます。If we already have it, we can use it without downloading the data again. これがなければ、ダウンロードを開始する WaitForAnchor を呼び出します。If we don't have it, then we call WaitForAnchor which will initiate the download.

ダウンロードが完了したら、NetworkTransmitter_dataReadyEvent が呼び出されます。When the download is completed, NetworkTransmitter_dataReadyEvent is called. これは、ダウンロードされたデータで ImportAsync を呼び出すための更新ループでは通知します。This will signal the Update loop to call ImportAsync with the downloaded data. インポート処理が完了すると、ImportAsync は ImportComplete を呼び出します。ImportAsync will call ImportComplete when the import process is complete. インポートが成功した場合は、アンカーは、プレーヤーのローカル ストアに保存されます。If the import is successful, the anchor will be saved in the local player store. により、PlayerController.cs は、実際には、ホストに適切なアンカーが確立されたことを認識させる AnchorFoundRemotely に呼び出しを行います。PlayerController.cs actually makes the call to AnchorFoundRemotely to let the host know that a good anchor has been established.

進行状況をお楽しみください。Enjoy your progress

今回、HoloLens を持つユーザーをホストするセッションを使用して、セッションを開始UI のボタンをクリックします。This time a user with a HoloLens will host a session using the start session button in the UI. 他のユーザー両方 HoloLens や、イマーシブ ヘッドセットは、セッションを選択し、選択、セッションに参加するUI のボタンをクリックします。Other users, both on HoloLens or an immersive headset, will select the session and then select the join session button in the UI. HoloLens デバイスで複数の人がある場合は、頭に赤のクラウドがあります。If you have multiple people with HoloLens devices, they will have red clouds over their heads. ありますの各イマーシブ ヘッドセット、青色の雲が青色の雲とは、ヘッドセット上、ヘッドセットは HoloLens デバイスとして同じワールド座標空間を検索していないようです。There will also be a blue cloud for each immersive headset, but the blue clouds will not be above the headsets, as the headsets are not trying to find the same world coordinate space as the HoloLens devices.

プロジェクトのこのポイントが含まれている共有アプリケーションです。非常にほとんど意味がありませんし、ベースラインとして機能する可能性があります。This point in the project is a contained sharing application; it doesn't do very much, and could act as a baseline. [次へ] の章では、まず、ご利用いただくにユーザー エクスペリエンスを構築します。In the next chapters, we will start building an experience for people to enjoy. 共有のエクスペリエンスの設計に関するガイダンスを入手さらに、移動します。To get further guidance on shared experience design, go here.

第 4 章 - Immersion と teleportingChapter 4 - Immersion and teleporting

目標Objectives

複合現実デバイスの種類ごとにエクスペリエンスを提供します。Cater the experience to each type of mixed reality device.

構築します。What we will build

没入型の表示、南の島でイマーシブ ヘッドセット ユーザーを配置するアプリケーションを更新します。We will update the application to put immersive headset users on the island with an immersive view. HoloLens のユーザーには、アイランドのバード アイ ビューがあります。HoloLens users will still have the bird's eye view of the island. 各デバイスの種類のユーザーは、世界中に表示される他のユーザーを確認できます。Users of each device type can see other users as they appear in the world. たとえば、HoloLens ユーザー島上の巨大なクラウドとして表示し、イマーシブ ヘッドセット ユーザーでは、島、上の他のパスに他のアバターがわかります。For instance, immersive headset users can see the other avatars on other paths on the island, and they see the HoloLens users as giant clouds above the island. イマーシブ ヘッドセット ユーザーは、HoloLens のユーザーが、島で探している場合にも、HoloLens のユーザーの視線の先光線のカーソルに表示されます。Immersive headset users will also see the cursor of the HoloLens user's gaze ray if the HoloLens user is looking at the island. HoloLens のユーザーは、各イマーシブ ヘッドセット ユーザーを表す島にアバターが表示されます。HoloLens users will see an avatar on the island to represent each immersive headset user.

没入型のデバイスの更新の入力:Updated Input for the Immersive device:

  • Xbox コント ローラーの左側のエンジンとエンジンの右ボタンが、プレーヤーを回転させるThe left bumper and right bumper buttons on the Xbox controller rotate the player
  • Xbox コント ローラーで、[Y] ボタンを保持しているが有効になります、テレポートカーソル。Holding the Y button on the Xbox controller will enable a teleport cursor. カーソルが矢印インジケーターが回転 Y ボタンを離したときに、カーソルの場所に波及ができます。If the cursor has a spinning arrow indicator when you release the Y button, you will be teleported to the cursor's location.

手順Steps

  • MixedRealityCameraParent MixedRealityTeleport に追加します。Add MixedRealityTeleport to MixedRealityCameraParent
    • 階層Uslandします。In Hierarchy, select Usland.
    • インスペクター、有効にするレベルの制御します。In Inspector, enable Level Control.
    • 階層MixedRealityCameraParentします。In Hierarchy, select MixedRealityCameraParent.
    • インスペクター、 をクリックしてコンポーネントの追加します。In Inspector, click Add Component.
    • Mixed Reality テレポートして選択します。Type Mixed Reality Teleport and select it.

コードをについてください。Digging into the code

イマーシブ ヘッドセット ユーザーは、ケーブルで自分の Pc にテザリングされたされますが、アイランドは、ケーブルが長よりも大きい。Immersive headset users will be tethered to their PCs with a cable, but our island is larger than the cable is long. 補正するために、ユーザーの動きとは無関係にカメラを移動できる必要があります。To compensate, we need the ability to move the camera independently of the user's motion. 参照してください、元気の出るページ複合現実のアプリケーションの (特に自己モーション センサーと locomotion) 設計の詳細についてはします。Please see the comfort page for more information about designing your mixed reality application (in particular self motion and locomotion).

このプロセスを説明するために 2 つの用語を定義すると便利ですがあります。In order to describe this process it will be useful to define two terms. まず、けん引ユーザーからしないカメラを個別に移動するオブジェクトになります。First, dolly will be the object that moves the camera independently from the user. 子ゲーム オブジェクト、けん引なります、メイン カメラします。A child game object of the dolly will be the main camera. メイン カメラは、ユーザーの頭にアタッチされます。The main camera is attached to the user's head.

[プロジェクト] パネルに移動しますAssets\AppPrefabs\Support\Scripts\GameLogicダブルクリックしてMixedRealityTeleport.csします。In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on MixedRealityTeleport.cs.

MixedRealityTeleport には、2 つのジョブがあります。MixedRealityTeleport has two jobs. 最初に、エンジンを使用して回転を処理します。First, it handles rotation using the bumpers. Update 関数で 'ButtonUp' LeftBumper と RightBumper のポーリングします。In the update function we poll for 'ButtonUp' on LeftBumper and RightBumper. GetButtonUp のみ true を返すボタンがアップ ダウンになった後は、最初のフレームでします。GetButtonUp only returns true on the first frame a button is up after having been down. わかった場合は、いずれかのボタンが発生し、ユーザーは、回転する必要があります。If either button had been raised, then we know the user needs to rotate.

私たちを回転フェードの操作を行います、フェード 'フェード コントロール' という名前の単純なスクリプトを使用しています。When we rotate we do a fade out and fade in using a simple script called 'fade control'. これをユーザーが不安を招く可能性がある不自然の移動を確認するを防ぐために行います。We do this to prevent the user from seeing an unnatural movement which could lead to discomfort. フェードとフェードアウト効果は非常に単純です。The fade in and out effect is fairly simple. ある分岐の前でブラック クアッド、メイン カメラします。We have a black quad hanging in front of the main camera. フェードアウトとアルファ値は 0 から 1 に移行します。When fading out we transition the alpha value from 0 to 1. これは、黒のピクセルをレンダリングし、それらの背後にある何かがわかりにくくなる 4 つの段階的にによりします。This gradually causes the black pixels of the quad to render and obscure anything behind them. フェードに戻るときに、アルファ値を 0 に移行します。When fading back in we transition the alpha value back to zero.

回転角度を計算します 回転していることに注意してください、けん引周りの回転角度を計算するが、メイン カメラします。When we calculate the rotation, note that we are rotating our dolly but calculating the rotation around the main camera. これは、遠いとして重要、メイン カメラ0,0,0 から正確な少なく、けん引周りの回転角度になるユーザーの観点からは、します。This is important as the farther the main camera is away from 0,0,0, the less accurate a rotation around the dolly would become from the point of view of the user. 実際には、カメラの位置を回転しない場合、ユーザーは、円弧の周囲に移動は、けん引回転ではなく。In fact, if you do not rotate around the camera position, the user will move on an arc around the dolly rather than rotating.

MixedRealityTeleport の 2 つ目のジョブは移動を処理するためには、けん引します。The second job for MixedRealityTeleport is to handle moving the dolly. これは、SetWorldPosition で行われます。This is done in SetWorldPosition. SetWorldPosition は必要なワールド位置を占めます。 したがって、percieve にユーザーが必要がある位置を受け取ります。SetWorldPosition takes the desired world position, the position where the user wants to percieve that they inhabit. 配置する必要があります、けん引マイナスのローカルの位置には、その位置にある、メイン カメラ、フレームごとに、そのオフセットが追加されます。We need to put our dolly at that position minus the local position of the main camera, as that offset will be added each frame.

2 番目のスクリプトでは、SetWorldPosition を呼び出します。A second script calls SetWorldPosition. そのスクリプトを見てみましょう。Let's look at that script. [プロジェクト] パネルに移動しますAssets\AppPrefabs\Support\Scripts\GameLogicダブルクリックしてTeleportScript.csします。In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on TeleportScript.cs.

このスクリプトは MixedRealityTeleport よりも少し複雑です。This script is a little more involved than MixedRealityTeleport. スクリプトは、Y のボタン保持する Xbox コント ローラーを確認しています。The script is checking for the Y Button on the Xbox controller to be held down. ボタンが保持されている間は、カーソルが表示されます、テレポート ダウンし、スクリプトが視線の先のユーザーの位置から伸びる射線をキャストします。While the button is held down a teleport cursor is rendered and the script casts a ray from the user's gaze position. その光線が多いか少ないは画面と競合している場合は、上向き、画面は、テレポートに適切な画面に検討され、テレポート カーソル上でアニメーションが有効になります。If that ray collides with a surface that is more or less pointing up, the surface will be considered a good surface to teleport to, and the animation on the teleport cursor will be enabled. 射線が多いか少ない上向きサーフェイスと衝突しない場合、カーソル上でアニメーションを無効化されます。If the ray does not collide with a surface more or less pointing up, then the animation on the cursor will be disabled. Y ボタンが解放され、光線の計算されるポイントは有効な位置をスクリプトは、射線が交差する位置を SetWorldPosition を呼び出します。When the Y button is released and the calculated point of the ray is a valid position, the script calls SetWorldPosition with the position the ray intersected.

進行状況をお楽しみください。Enjoy your progress

この時間を友人を検索する必要があります。This time you'll need to find a friend.

もう一度、HoloLens を持つユーザーは、セッションをホストします。Once again, a user with the HoloLens will host a session. 他のユーザーはセッションに参加します。Other users will join the session. アプリケーションには、最初の 3 つのユーザーに、島に 3 つのパスのいずれかで没入型のヘッドセットから参加が配置されます。The application will place the first three users to join from an immersive headset on one of the three paths on the island. このセクションの島を探索してもかまいません。Feel free to explore the island in this section.

詳細に注意してください:Details to notice:

  1. HoloLens のユーザーを検索する方向を参照してください。 immersed のユーザーに役立ちますクラウド内の顔を確認できます。You can see faces in the clouds, which helps an immersed user see which direction a HoloLens user is looking.
  2. 島アバターは、回転突き止めるがあります。The avatars on the island have necks that rotate. ユーザーが何に従うことはありません (その情報はありません) 実際には実際は、優れたエクスペリエンスのためです。They won't follow what the user is doing is real reality (we don't have that information) but it makes for a nice experience.
  3. HoloLens のユーザーは、島を見て、immersed ユーザーにカーソルが表示されます。If the HoloLens user is looking at the Island, the immersed users can see their cursor.
  4. HoloLens のユーザーを表すクラウドは、シャドウをキャストします。The clouds that represent the HoloLens users cast shadows.

第 5 章「おChapter 5 - Finale

目標Objectives

2 つのデバイスの種類間のコラボレーション対話型環境を作成します。Create a collaborative interactive experience between the two device types.

構築します。What we will build

第 4 章に基づき島、パズルの近く、イマーシブ ヘッドセットを持つユーザーを取得すると、HoloLens ユーザーでは、パズルへの手掛かりのツールヒントが表示されます。Building on chapter 4, when a user with an immersive headset gets near a puzzle on the island, the HoloLens users will get a tool tip with a clue to the puzzle. ロケット部屋にそのパズル過去と"準備完了"パッド上を取得のすべてのイマーシブ ヘッドセット ユーザー、ロケットが起動されます。Once all of the immersive headset users get past their puzzles and onto the "ready pad" in the rocket room, the rocket will launch.

手順Steps

  • 階層Uslandします。In Hierarchy, select Usland.
  • インスペクターで、レベルの制御、確認を有効にするコラボレーションします。In Inspector, in Level Control, check Enable Collaboration.

コードをについてください。Digging into the code

ここで見て LevelControl.cs します。Now let us look at LevelControl.cs. このスクリプトでは、ゲーム ロジックの中核となるはし、ゲームの状態を保持します。This script is the core of the game logic and maintains the game state. これは UNET を使用して、マルチ プレーヤー ゲームからデータの流れも、少なくともこのチュートリアルを変更するかを理解する必要があります。Since this is a multiplayer game using UNET we need to understand how data flows, at least well enough to modify this tutorial. UNET のより詳細な概要については、Unity のドキュメントを参照してください。For a more complete overview of UNET, please refer to Unity's documentation.

[プロジェクト] パネルに移動しますAssets\AppPrefabs\Support\Scripts\GameLogicダブルクリックしてLevelControl.csします。In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on LevelControl.cs.

イマーシブ ヘッドセットが、ロケットの準備ができていることを示す方法を説明しましょう。Let us understand how an immersive headset indicates that they are ready for the rocket launch. ロケット起動の準備は、島に 3 つのパスに対応するブールの一覧で次の 3 つのブールのいずれかを設定して伝達されます。Rocket Launch readiness is communicated by setting one of three bools in a list of bools that correspond to the three paths on the island. ロケット ルーム茶色パッド上に、パスに割り当てられたユーザーの場合は、パスのブール値が設定されます。A path's bool will be set when the user assigned to the path is on top of the brown pad inside the rocket room. では、詳細にようになりました。Okay, now to the details.

私たちは、Update() 関数で開始されます。We will start in the Update() function. 'チート' 関数があることに注意してください。You will note that there is a 'cheat' function. 使用してこの開発で、ロケットをテストし、シーケンスをリセットしました。We used this in development to test the rocket launch and reset sequence. マルチ ユーザーのエクスペリエンスでは機能しません。It won't work in the multi user experience. できれば次の情報が内在化時間で行うことができます動作します。Hopefully by the time you internalize the following infromation you can make it work. かどうか、ローカルのプレーヤーが専念した状態を確認します後ずるをかどうかを確認します。After we check to see if we should cheat, we check to see if the local player is immersed. 目標にしていることを探す方法に注目します。We want to focus on how we find that we're at the goal. 場合は、内部で (専念した状態) を確認する CheckGoal の背後にある非表示の呼び出しは、 EnableCollaboration bool。Inside of the if (Immersed) check, there is a call to CheckGoal hiding behind the EnableCollaboration bool. これは、この章の手順を実行中にオンにしたチェック ボックスをオンに対応します。This corresponds to the checkbox you checked while completing the steps for this chapter. 内部 EnableCollaboration CheckGoal() への呼び出しがわかります。Inside of EnableCollaboration we see a call to CheckGoal().

CheckGoal は、いくつかの数学、パッドを越えますが多いか少ないかどうかを参照してください。CheckGoal does some math to see if we are more or less standing on the pad. ときに Debug.Log「目標に着荷済」し、そこで 'SendAtGoalMessage()' を呼び出します。When we are, we Debug.Log "Arrived at goal" and then we call 'SendAtGoalMessage()'. SendAtGoalMessage で playerController.SendAtGoal と呼んでいます。In SendAtGoalMessage we call playerController.SendAtGoal. いくつかの時間を節約するには、次のコードに示します。To save you some time, here's the code:

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 に戻ります。 これを呼び出すことに注意してください。Note that SendAtGoalMessage calls CmdSendAtGoal, which calls levelState.SetGoalIndex, which is back in LevelControl.cs. これは一見奇妙な見えます。At first glance this seems strange. なぜ呼び出せばこれではなく SetGoalIndex player コント ローラーを介してルーティング奇妙なでしょうか。Why not just call SetGoalIndex rather than this strange routing through the player controller? 理由は、私たちが UNET はデータの同期を保つを使用してデータ モデルに一致します。ずるをしてスラッシングを防ぐには、UNET は、各オブジェクトに同期された変数を変更する権限を持つユーザーが含まれている必要があります。The reason is that we are conforming to the data model UNET uses to keep data in sync. To prevent cheating and thrashing, UNET requires that each object has a user who has authority to change the synchronized variables. さらに、(セッションを開始したユーザー) のホストだけでは、データを直接変更することができます。Further, only the host (the user that started the session) can change data directly. ホストではありませんが、権限を持つユーザーは、変数を変更するホストに 'command' を送信する必要があります。Users who are not the host, but have authority, need to send a 'command' to the host which will change the variable. 既定では、ホストは、ユーザーを表す生成されたオブジェクトを除く、すべてのオブジェクトに対して権限を持ちます。By default the host has authority over all objects, except for the object spawned to represent the user. ここでは、このオブジェクトには、playercontroller スクリプトがあります。In our case this object has the playercontroller script. オブジェクトの権限を要求し、変更する方法がありますが、player コント ローラーは、player コント ローラーを介して自己の機関とルート コマンドであるという事実を利用してを選択します。There is a way to request authority for an object and then make changes, but we choose to leverage the fact that the player controller has self authority and route commands through the player controller.

目標で自分たちが見つかった場合は、プレーヤーは、ホストに通知する必要がありますホストには、その他のユーザー通知は、別の方法と言われます。Said another way, when we've found ourselves at our goal, the player needs to tell the host, and the host will tell everyone else.

LevelControl.cs SetGoalIndex 見てに戻るBack in LevelControl.cs look at SetGoalIndex. ここで synclist (AtGoal) に値の値を設定します。Here we are setting the value of a value in a synclist (AtGoal). このような処理中に、ホストのコンテキストでは注意してください。Remember that we are in the context of the host while we do this. コマンドと同様に、RPC は、ホストを発行できますが、いくつかのコードを実行するすべてのクライアントです。Similar to a command, an RPC is something the host can issue that will cause all clients to run some code. ここで 'RpcCheckAllGoals' を呼び出します。Here we call 'RpcCheckAllGoals'. 各クライアントは個別にかどうかは、すべての 3 つ AtGoals が設定されているかを確認してくださいと、そうである場合は、ロケットを起動します。Each client will individually check to see if all three AtGoals are set, and if so, launch the rocket.

進行状況をお楽しみください。Enjoy your progress

前のチャプターに基づき、私たちの前としてセッションが開始されます。Building on the previous chapter, we will start the session as before. この時間を自分のパスで、「ドア」をイマーシブ ヘッドセット get 内のユーザーとして HoloLens ユーザーのみが認識できることツールヒントが表示されます。This time as the users in the immersive headset get to the "door" on their path, a tooltip will appear that only the HoloLens users can see. HoloLens のユーザーは、イマーシブ ヘッドセットのユーザーにこの手掛かりの通信を担当します。The HoloLens users are responsible for communicating this clue to the users in the immersive headset. 火山内の対応する茶色パッドに各アバターがステップ インしたら、ロケットが領域を起動します。The rocket will launch to space once each avatar has stepped on its corresponding brown pad inside the volcano. もう一度行うことができますので、60 秒後に、シーンがリセットされます。The scene will reset after 60 seconds so you can do it again.

関連項目See also