MRが楽しい

MRやVRについて学習したことを書き残す

UnityでGetInstanceIDを使ってオブジェクトの一意なIDを取得する

本日はUnityの小ネタ枠です。
UnityでGetInstanceIDを使ってオブジェクトの一意なIDを取得する方法です。

Object.GetInstanceID

オブジェクトの InstanceID を返します
InstanceID は常にユニークです。新しく作成されたオブジェクトには負数のインスタンスIDが割り当てられます。
プレハブなどあらかじめ生成されたオブジェクトには正数のインスタンスIDが割り当てられます。
0 の値は設定されません。
docs.unity3d.com

サンプルスクリプト

以下のサンプルスクリプトを作成しました。
あらかじめシーン内に生成されたオブジェクトと動的に生成したオブジェクトのInstanceIDを取得してデバッグログに表示します。
・InstanceIdTest.cs

using UnityEngine;

public class InstanceIdTest : MonoBehaviour
{
    [SerializeField] private GameObject _prefab;
    
    void Start()
    {
        // 現在のオブジェクトのインスタンスIDを取得する
        int instanceId = this.gameObject.GetInstanceID();
        // シーン内で一意のインスタンスIDが割り当てられる
        Debug.Log($"instanceId : {instanceId}");
        
        // オブジェクトをスポーンしてそのインスタンスIDを取得する
        GameObject childObject = new GameObject("ChildObject");
        int childInstanceId = childObject.GetInstanceID();
        // 動的に生成したオブジェクトのインスタンスIDはランタイムまたはエディターのセッションごとに異なる
        Debug.Log($"childInstanceId : {childInstanceId}");
        
        // プレハブのインスタンスIDを取得する
        int prefabInstanceId = _prefab.GetInstanceID();
        // プレハブのインスタンスIDは正の数が割り当てられる
        Debug.Log($"prefabInstanceId : {prefabInstanceId}");
        // プレハブからオブジェクトを生成してそのインスタンスIDを取得する
        GameObject prefabObject = Instantiate(_prefab);
        int prefabObjectInstanceId = prefabObject.GetInstanceID();
        // プレハブから生成したオブジェクトのインスタンスIDは負の数になりランタイムまたはエディターのセッションごとに異なる
        Debug.Log($"prefabObjectInstanceId : {prefabObjectInstanceId}");
    }
}

動的に生成したオブジェクトのインスタンスIDはランタイムまたはエディターのセッションごとに異なります。
このため、シーンを止めて改めて再生すると動的に生成するオブジェクトはインスタンスIDが変わります。