HoloLensのシェアリングで生成したオブジェクトはデフォルトではSharingオブジェクトの子になります。Sharingオブジェクトは実行時にDontDestroyOnLoadに入ってしまうので、シーンからGameObject.Find()などでシェアリングで生成したオブジェクトを取得できません。
解決策としては、「SharingStage」のようなオブジェクトを作って、シェアリングでオブジェクトを生成する際はそれ(「SharingStage」)の子として生成するのが良いでしょう。
HoloLensのシェアリングで生成したオブジェクトはデフォルトではSharingオブジェクトの子になります。Sharingオブジェクトは実行時にDontDestroyOnLoadに入ってしまうので、シーンからGameObject.Find()などでシェアリングで生成したオブジェクトを取得できません。
解決策としては、「SharingStage」のようなオブジェクトを作って、シェアリングでオブジェクトを生成する際はそれ(「SharingStage」)の子として生成するのが良いでしょう。
HoloLensのシェアリングのセッションから退室するとき、自分が生成したオブジェクトをすべて削除したいときがあります。不完全ではありますが、以下のようにすれば削除することができます。
private void DeleteMyMagnets() { var magnets = GameObject.FindGameObjectsWithTag("Magnet"); foreach (var magnet in magnets) { var syncModelAccessor = magnet.GetComponent<DefaultSyncModelAccessor>(); if (syncModelAccessor != null) { var syncSpawnObject = (SyncSpawnedObject)syncModelAccessor.SyncModel; if(syncSpawnObject.OwnerId == SharingStage.Instance.Manager.GetLocalUser().GetID()) { // 磁石のOnDestroyを走らせる Object.DestroyImmediate(magnet); spawnManager.Delete(syncSpawnObject); } } } }
なお、自分のUserIDは以下のように取り出すことができます:
int myUserId = SharingStage.Instance.Manager.GetLocalUser().GetID();
ちなみに、SharingStageにぶら下がっているSyncSpawnedObjectの一覧はUnityのインスペクタで見ることができます。
この記事はHoloLensに関する下記記事を前提にしています。
まず、PrefabSpawnManagerでSpawnするときの最後の引数をtrueにします。
this.spawnManager.Spawn(spawnedObject, position, rotation, null, "SpawnedMagnet", true);
すると、生成したオブジェクトにOwner情報が含められるようになります。これを取り出すには、DefaultSyncModelAccessorコンポーネントを使います。DefaultSyncModelAccessorコンポーネントは、PrefabSpawnManagerで生成したオブジェクトに自動的にアタッチされるスクリプトです。自動的にアタッチされるコンポーネントには、他にもTransform Synchronizerがあります。
このDefaultSyncModelAccessorコンポーネントからオブジェクトの様々なプロパティにアクセスすることができます。
int userId = GetComponent<DefaultSyncModelAccessor>().SyncModel.OwnerId;
あれ、UserIdってlongじゃなかったっけ…
HoloLensのシェアリング用にMRTKにはSyncObjectというモデルクラスが用意されています。PrefabSpawnManager、SyncSpawnedObjectなどのクラスから使用します。今回はそのクラス図を描いてみました。
OwnerIdやSpawnedSyncObjectのTransformは使えそうです。
twitter.com#物欲2018 #SKT5000 #スマートウォッチ の #ガジェット です。約45000円。欲しい…>OSに #AndroidWear 2.0、CPUに #SnapdragonWear 2100を搭載。#Googleアシスタント による音声コマンドに対応する。#Tech pic.twitter.com/LsWpn1yXc6
— 植田達郎@ようやくひと息 (@weed_7777) 2018年5月4日