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);