開発-HoloLens磁界学習アプリを操作している様子かねてからHoloLensを使った出張授業で使ってきた磁界学習アプリを、シェアリングに対応させました。以下では、その過程でわかったことや学んだことを説明します。上の動画にあるように、シェアリングに参加しているプレイヤーは各自1つの棒磁石を自由に動かすことができます。それとは別に多数の方位磁針が格子状に並んでおり、すべての棒磁石の影響を反映して方向や明るさが変わります。方位磁針1つ1つはシェアリングしていません。方位磁針を生成する基準点だけをシェアリングしています。具体的には、シェアリングに新たにプレイヤーが参加した時点で、方位磁針を生成する基準点だけを新しいプレイヤーの空間に生成します基準点のStart()メソッドが多数の方位磁針を格子状に生成します各方位磁針には、複数の棒磁石の影響を計算して向きや明るさを決定するUpdate()メソッドが組み込まれていますプレイヤーが棒磁石を動かすと、それぞれのプレイヤーの別個のHoloLens空間の中で方位磁針がUpdate()されますつまり、実際にシェアリングしているのは棒磁石と基準点だけで、しかも基準点は生成するだけなので、動的にシェアリングしているのは棒磁石だけです。PrefabSpawnManagerを設置するHoloLensのシェアリングでプレハブを生成したいときは、MRTKにそのためのスクリプトが入っています。PrefabSpawnManagerスクリプトです(使用はあまり勧めないというアドバイスもd_yama(@dy_karous)さんからいただきましたので、使用にはご注意ください)。このスクリプトを使うと、シェアリングをしている各HoloLensの世界に同時にプレハブを生成することができます。位置・向きは自動的に同期されます。PrefabSpawnManagerスクリプトをアタッチまずSharingStageオブジェクトをつくり、PrefabSpawnManagerスクリプトをにアタッチします。SharingStageオブジェクトにアタッチするのは、シーンが遷移したときにPrefabSpawnManagerへの参照を取れなくなるからです。何も指定しないとプレハブから生成されたオブジェクトはSharingオブジェクトの子オブジェクトになりますが、DontDestoryOnLoadに入るため、シーン内のオブジェクトからGameObject.Find()などができなくなってしまいます。今回は各方位磁針が棒磁石のN極、S極をすべて取得する必要があったため、棒磁石をDontDestroyOnLoadに入れるわけにはいきませんでした。「Magnet」の部分は適宜読み替えて下さい。SyncSpawnedObjectクラスを継承して作成します。正直なところ今回は中身はどうでもいいです。プレハブを生成するときにクラス名が必要になるため、作成しています。SyncSpawnedMagnetクラスの登録PrefabSpawnManagerコンポーネントに、先ほど作成したSyncSpawnedMagnetクラスを登録します。MagnetSpawnerスクリプトの作成コードを書きます。}}どうしてもUserJoinedSessionが複数回起きてしまうため、そのたびに棒磁石を生成すると棒磁石が複数本できてしまいます。そこで、UserJoinedSessionが起きるたびに既存の棒磁石はすべて削除し、新しい棒磁石を1つだけ生成しています。このあたりについては、littlewing(@keshin_sky)さんにアドバイスを頂きました。PrefabSpawnManager.Spawn()の最後の引数はtrueを指定します。することで、生成したオブジェクトにOwner情報が付与されます。ある棒磁石が、自分の棒磁石なのか、他の人の棒磁石なのか、知ることができます。作成したスクリプトは適当なオブジェクト(私はBarMagnetSpawnerと名付けたEmptyObject)にアタッチします。Managerフィールドに、PrefabSpawnManagerスクリプトをアタッチしたオブジェクト(SharingStageなど)をドラッグします。PrefabSpawnManagerスクリプトの中の処理PrefabSpawnManagerスクリプトの中では、どのように処理されているのでしょう?これを、MRTK-ExamplesのSharingSpawnTestシーンを読み解くことで理解しましょう。このシーンは、「One」と発声すると(なぜか15m先に)プレハブが生成されます。その流れをアクティビティ図で追ってみました。PrefabSpawnManager.Spawn()とSyncSourceが重要なポイントです。前者は、プレハブの生成とモデルのSharingStageへの登録を同時にしてくれます。生成したプレハブにはDefaultSyncModelAccessorスクリプトとTransformSynchronizerスクリプトが自動的にアタッチされます。シェアリングのSyncObjectのクラス図PrefabSpawnManagerが扱う最も基本的なクラスがSyncObjectです。PrefabSpawnManager、SyncSpawnedObjectなどのクラスから使用します。そのクラス図も確認しておきましょう。重要なポイントはSyncObjectにOwnerIdというフィールドがあることです。これを使って自分が生成したオブジェクトかどうかを確認することができます。SyncPrimitiveクラスにはUpdateFromRemoteメソッドなどが用意され、他のプレイヤーの世界での変更が伝わるようになっています。SpawnedSyncObjectにはTransform情報があり、シェアリングに参加しているプレイヤー間で自動的に同期されます。PrefabSpawnManagerで生成したオブジェクトのUserIdを取り出すUserIdでなくても良いのですが、オブジェクトに付与された同期されている情報を取り出しましょう。PrefabSpawnManagerでSpawnするときの最後の引数をtrueにします。true);すると、生成したオブジェクトにOwner情報が含められるようになります。これを取り出すには、DefaultSyncModelAccessorコンポーネントを使います。DefaultSyncModelAccessorコンポーネントは、PrefabSpawnManagerで生成したオブジェクトに自動的にアタッチされるスクリプトです。Synchronizerがあります。このDefaultSyncModelAccessorコンポーネントからオブジェクトの様々なプロパティにアクセスすることができます。GetComponent<DefaultSyncModelAccessor>().SyncModel.OwnerId;シェアリングで生成したオブジェクトをGameObject.Find()できないシェアリングで生成したオブジェクトはデフォルトではSharingオブジェクトの子になります。Sharingオブジェクトは実行時にDontDestroyOnLoadに入ってしまうので、シーンからGameObject.Find()などでシェアリングで生成したオブジェクトを取得できません。解決策としては、「SharingStage」のようなオブジェクトを作って、シェアリングでオブジェクトを生成する際はそれ(「SharingStage」)の子として生成するのが良いでしょう。以上、ご参考になれば幸いです。磁界学習アプリをシェアリングに対応させましたTweet関連記事2018-05-09シェアリングで生成したオブジェクトをGameObject.Find()できないHoloLensのシェアリングで生成したオブジェクトはデフォルトで...2018-05-07シェアリングのセッションから退室するとき、自分が生成したオブジェクトをすべて削除するHoloLensのシェアリングのセッションから退室するとき、自分が...2018-05-07シェアリングのPrefabSpawnManagerで生成したオブジェクトのUserIdを取り出すこの記事はHoloLensに関する下記記事を前提にしています。関連記事ケンブリッジ大学内にあるメイカー施設「makespace」に行ってきましたイギリス滞在中、ケンブリッジ大学内にあるメイカーコミュニティースペース「makespace」を2度訪れました。2台のHoloLensでシェアリング(Sharing)ができているかを手軽に確かめる方法ほぼネタです。これだけ😅でも便利です。StudioとXcodeの違いMacを5年使ってきたのですが、昨年の5月からWindowsに乗り換えました。1年間使ってみました。そのあいだに...シェアリングのセッションから退室するとき、自分が生成したオブジェクトをすべて削除するHoloLensのシェアリングのセッションから退室するとき、自分が生成したオブジェクトをすべて削除したいと...シェアリングのPrefabSpawnManagerで生成したオブジェクトのUserIdを取り出すこの記事はHoloLensに関する下記記事を前提にしています。PrefabSpawnManagerでSp...シェアリングのSyncObjectのクラス図HoloLensのシェアリング用にMRTKにはSyncObjectというモデルクラスが用意されています。PrefabSpawnManage...シェアリングのPrefabSpawnManagerの設置のしかたHoloLensのシェアリングでプレハブを生成したいときは、MRTKにそのためのスクリプトが入っています。Prefa...MRTK-ExamplesのSharingSpawnTestシーンを読み解くHoloLensのシェアリングでプレハブを生成するのが思った以上に大変なことがわかったので、「MRTK-Examples...アプリ起動後にシェアリングサーバのアドレスを入力できるようにするManualIpConfigUtilityを自分のアプリに組み込むシェアリング関係を開発していると、サーバのアドレスが変わるたびに設定を変えるのが面倒です。全ての投稿weedのQiita投稿スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。