using UnityEngine; #if UNITY_EDITOR using System.Reflection; using UnityEditor; #endif namespace MCPForUnity.Runtime.Helpers { // Part of MCP for Unity's compat-shim family. See UnityCompatShims.cs in this // folder for the full list of shims, the audit policy, and the reflection pattern. /// /// Version-gated wrappers for the InstanceID ↔ EntityId migration introduced in Unity 6.5 /// and tightened in 6.6. /// Forward (Object → int): /// Reverse (int → Object, Editor-only): /// public static class UnityObjectIdCompat { /// /// Returns a session-scoped int handle for the object. On 6.5+ truncates the /// EntityId's underlying ulong; lossy but stable within a session and preserves /// the int-shaped wire format that older consumers expect. For deserialization /// round-trips on 6.5+, prefer the full entityID field. /// public static int GetInstanceIDCompat(this Object obj) { if (obj == null) { return 0; } #if UNITY_6000_5_OR_NEWER return (int)EntityId.ToULong(obj.GetEntityId()); #else return obj.GetInstanceID(); #endif } #if UNITY_EDITOR #if UNITY_6000_6_OR_NEWER private static MethodInfo _instanceIdToObject; private static bool _instanceIdToObjectInitialized; #endif /// /// Resolves an int instance ID handle back to a UnityEngine.Object. /// Pre-6.0 : EditorUtility.InstanceIDToObject(int) /// 6.0–6.5 : EditorUtility.EntityIdToObject(int) (implicit int→EntityId cast) /// 6.6+ : reflection on InstanceIDToObject(int) — the API still exists at runtime /// but is obsolete-as-error; reflection bypasses CS0619 until the public /// EntityId(int) ctor stabilizes. /// public static Object InstanceIDToObjectCompat(int instanceId) { #if UNITY_6000_6_OR_NEWER if (!_instanceIdToObjectInitialized) { _instanceIdToObject = typeof(EditorUtility).GetMethod( "InstanceIDToObject", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(int) }, null); _instanceIdToObjectInitialized = true; } return _instanceIdToObject?.Invoke(null, new object[] { instanceId }) as Object; #elif UNITY_6000_3_OR_NEWER return EditorUtility.EntityIdToObject(instanceId); #else return EditorUtility.InstanceIDToObject(instanceId); #endif } #endif } }