うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】インスタンスID から Object を探す

Editor 上でなら EditorUtility.InstanceIDToObject を利用すれば インスタンスID から Object を取得することができる

が Editor 上じゃない場合は上記メソッドは利用できないので

全 Object を見てインスタンスIDを探すような処理を記述する必要がある

なにか無いかと探してみると UnityEngine.Object が internal なメソッドを持っていた

namespace UnityEngine
{
  public class Object
  {
    [FreeFunction("UnityEngineObjectBindings::FindObjectFromInstanceID")]
    [VisibleToOtherModules]
    [MethodImpl(MethodImplOptions.InternalCall)]
    internal static extern Object FindObjectFromInstanceID(int instanceID);
  }
}

ということで リフレクションを利用して作成したのがこちら

using System;
using System.Reflection;
using UnityEngine;

public static class Util
{

    public static Object FindObjectFromInstanceID(int instanceId)
    {
        try
        {
            var type = typeof(Object);
            var flags = BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod;
            var ret = type.InvokeMember("FindObjectFromInstanceID", flags, null, null, new object[] {instanceId});

            return (Object) ret;
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
        }

        return null;
    }
}

これを 使うと Editor 上でなくともインスタンスIDから検索することができる

※内部的には全検索している可能性はあるので、遅くても問題ない箇所で利用ください

       var id = gameObject.GetInstanceID();
        var obj = FindObjectFromInstanceID(id);
        Debug.Log(obj.name);