Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

シェアリングで生成したオブジェクトをGameObject.Find()できない

f:id:weed_7777:20180509182015p:plain

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のインスペクタで見ることができます。

f:id:weed_7777:20180507114036p:plain

シェアリングのPrefabSpawnManagerで生成したオブジェクトのUserIdを取り出す

この記事はHoloLensに関する下記記事を前提にしています。

www.weed.nagoya

まず、PrefabSpawnManagerでSpawnするときの最後の引数をtrueにします。

this.spawnManager.Spawn(spawnedObject, position, rotation, null, "SpawnedMagnet", true);

すると、生成したオブジェクトにOwner情報が含められるようになります。これを取り出すには、DefaultSyncModelAccessorコンポーネントを使います。DefaultSyncModelAccessorコンポーネントは、PrefabSpawnManagerで生成したオブジェクトに自動的にアタッチされるスクリプトです。自動的にアタッチされるコンポーネントには、他にもTransform Synchronizerがあります。

f:id:weed_7777:20180507094550p:plain

このDefaultSyncModelAccessorコンポーネントからオブジェクトの様々なプロパティにアクセスすることができます。

int userId = GetComponent<DefaultSyncModelAccessor>().SyncModel.OwnerId;

あれ、UserIdってlongじゃなかったっけ…