Chapter 3 - Sharing
目標
ネットワークが正しく構成されていること,及びデバイス間で空間アンカーがどのように共有されているかを詳しく確認する
ビルドするもの
プロジェクトをマルチプレイヤープロジェクトに変換します。ホストや参加者にUIとロジックの追加をします。HoloLensユーザは頭上にある雲でセッション内にいるお互いを確認でき,Immersiveデバイスユーザは,アンカー付近に雲を持っています。Immersiveデバイス内のユーザはシーンの原点から相対的な場所にいるHoloLensユーザを見ることができます。HoloLensユーザは全て同じ場所にあるHologramの島を見ることができます。気を付けるべき重要な点は,この章ではImmersiveデバイスユーザーは島の中におらず,島を俯瞰するHoloLensと同様にふるまいます。
Steps
- IslandとVRRoomの除去
- Hierarchy で Isaland を右クリックし,削除
- Hierarchy で VRRoom を右クリックし,削除
- Uslandの追加
- AppPrefabsからUslandをHierarchyに置く
- AppPrefabsから下記をHierarchyに置く
- UNETSharingStage
- UNetAnchorRoot
- UIContainer
- DebugPanelButton
- HoloToolkit->Configure->Applied Mixed Reality Capability Settingsを開く
- Internet Client にチェックを入れて,Applyを押す
- 前回同様にSaveしてBuildする
コードを理解する
Assets\AppPrefabs\Support\SharingWithUnet\Scriptsを開き,UnetAnchorManager.csをダブルクリックする。HoloLensが別のHoloLensとトラッキング情報をシェアし両デバイスが同じ空間を共有できるようにする能力は,魔法のようです。2人以上で同じデジタルデータを利用して共同作業をする時,Mixed Realityのパワーが発揮されます。
このスクリプトで注目する点はいくつかあります
Start関数では,IsDisplayOpaqueをチェックしていることに注目してください。ここで,Anchorが確立されているフリをします。これは,ImmersiveデバイスにAnchorをImport/Exportする方法が公開されていないためです。一方,HoloLens側ではこのスクリプトはデバイス間のAnchorのシェアリングを実装しています。
セッションを開始したデバイスはExportするためにAnchorを生成します。セッションに参加したデバイスは,セッションを開始したデバイスにAnchorを要求します。
Exporting
ユーザーがセッションを生成すると,NetworkDiscoveryWithAnchors は UNETAnchorManagers内のCreateAnchor関数を呼び出します。CreateAnchorの流れを追ってみましょう。
まずいくつかのハウスキーピングを行い,以前に収集したであろうAnchorのデータを全て除去します。そして,次にロード用にキャッシュされたAnchorがあるかチェックします。Anchorデータはだいたい5~20MBほどでなので,キャッシュされたAnchorを再利用することで,ネットワーク経由で転送する必要のあるデータ量を省くことができます。後にこれがどのように動作するか確認します。Anchorを再利用している場合でも,新しい参加者がAnchorを持っていない場合に備えて,Anchorデータを準備する必要があります。
Anchorデータを準備する段階で,WorldAnchorTransferBatch Class は 他のデバイスやアプリに送信するAnchorデータを準備する機能と,AnchorデータをImportする機能を公開しています。Exportパスから,WorldAnchorTransferBatch へAnchorを追加し,ExportAsync 関数を呼び出します。
ExportAsync関数はExport向けのデータを生成する時にWriteBuffer callbackを呼び出します。
全てのデータがExportされると,ExportComplete が呼び出されます。WriteBuffer では,Export用に保持するリストデータチャンクを追加します。ExportComplete では,リストを配列に変換します。AnchorName 変数も同様に設定され,Anchorがない場合は,他のデバイスがAnchorを要求するようにTriggerします。
場合によっては,AnchorはExportされないか,極小のデータを生成するので,再度試みられます。ここではCreateAnchor が再度呼び出されます。
Exportパスの最後の機能は,AnchorFoundRemotelyです。他のデバイスがAnchorを見つけた時,デバイスはホストに通知し,ホストはそのAnchorが"good anchor"であり,キャッシュし得る信号であるとして扱います。
Importing
HoloLensがセッションに参加すると,AnchorのImportが必要になります。UNETAnchorManagerのUpdate関数では,AnchorName がポーリングされます。
Anchorの名前が変更されると,Importプロセスが開始されます。まず,Local Anchor Storeから指定された名前でAnchorをロードします。もし既にAnchorを持っていれば,データの再ダウンロードをせずにそれを利用します。もしなければ,Downloadを開始するWaitForAnchor を呼び出します。
Downloadが終了すると,NetworkTransmitter_dataReadyEvent が呼び出されます。これはダウンロードされたデータを用いて,ImportAsync を呼び出すようUpdate Loopに通知します。
ImportAsync はImportプロセスが終了するとImportComplete を呼び出します。
もしImportが成功していれば,AnchorはLocal player storeに保存されます。
PlayerController.csは実際にAnchorFoundRemotelyを呼び出して,良いAnchorが確率されたことをホストに通知します。
PlayerController内で,Anchorが確立すると呼び出される
進捗を楽しむ
今回,HoloLensユーザはStart settion button を用いてセッションを開始します。HoloLensまたはImmersiveデバイスを利用する他のユーザーは,セッションを選択し,join session buttonを押します。もし複数のHoloLensデバイスユーザーがいる場合,彼らの頭上には赤い雲が浮かびます。また,青い雲が各Immersiveデバイスユーザに現れますが,HoloLensデバイスと同じ作業空間を見つけようとしないため雲は頭上にはありません。
このプロジェクトのポイントは,シェアリングアプリケーションを包括することです。それほど多くはありませんし,ベースラインとして機能し得ます。次の章では,楽しめる体験を構築します。共有体験デザインの更なるガイダンスはここにあります。