| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | // Serialization // Copyright 2018-2024 Kybernetik //#if UNITY_EDITORusing System;using UnityEditor;using UnityEngine;using Object = UnityEngine.Object;// Shared File Last Modified: 2023-08-12.namespace Animancer.Editor// namespace InspectorGadgets.Editor{    /// <summary>[Editor-Only] Various serialization utilities.</summary>    public partial class Serialization    {        /// <summary>[Editor-Only]        /// Directly serializing an <see cref="UnityEngine.Object"/> reference doesn't always work (such as with scene        /// objects when entering Play Mode), so this class also serializes their instance ID and uses that if the        /// direct reference fails.        /// </summary>        [Serializable]        public class ObjectReference        {            /************************************************************************************************************************/            [SerializeField] private Object _Object;            [SerializeField] private int _InstanceID;            /************************************************************************************************************************/            /// <summary>The referenced <see cref="SerializedObject"/>.</summary>            public Object Object            {                get                {                    Initialize();                    return _Object;                }            }            /// <summary>The <see cref="Object.GetInstanceID"/>.</summary>            public int InstanceID => _InstanceID;            /************************************************************************************************************************/            /// <summary>            /// Creates a new <see cref="ObjectReference"/> which wraps the specified            /// <see cref="UnityEngine.Object"/>.            /// </summary>            public ObjectReference(Object obj)            {                _Object = obj;                if (obj != null)                    _InstanceID = obj.GetInstanceID();            }            /************************************************************************************************************************/            private void Initialize()            {                if (_Object == null)                    _Object = EditorUtility.InstanceIDToObject(_InstanceID);                else                    _InstanceID = _Object.GetInstanceID();            }            /************************************************************************************************************************/            /// <summary>            /// Creates a new <see cref="ObjectReference"/> which wraps the specified            /// <see cref="UnityEngine.Object"/>.            /// </summary>            public static implicit operator ObjectReference(Object obj)                => new(obj);            /// <summary>Returns the target <see cref="Object"/>.</summary>            public static implicit operator Object(ObjectReference reference)                => reference.Object;            /************************************************************************************************************************/            /// <summary>Creates a new array of <see cref="ObjectReference"/>s representing the `objects`.</summary>            public static ObjectReference[] Convert(params Object[] objects)            {                var references = new ObjectReference[objects.Length];                for (int i = 0; i < objects.Length; i++)                    references[i] = objects[i];                return references;            }            /// <summary>            /// Creates a new array of <see cref="UnityEngine.Object"/>s containing the target <see cref="Object"/> of each            /// of the `references`.            /// </summary>            public static Object[] Convert(params ObjectReference[] references)            {                var objects = new Object[references.Length];                for (int i = 0; i < references.Length; i++)                    objects[i] = references[i];                return objects;            }            /************************************************************************************************************************/            /// <summary>Indicates whether both arrays refer to the same set of objects.</summary>            public static bool AreSameObjects(ObjectReference[] references, Object[] objects)            {                if (references == null)                    return objects == null;                if (objects == null)                    return false;                if (references.Length != objects.Length)                    return false;                for (int i = 0; i < references.Length; i++)                {                    if (references[i] != objects[i])                        return false;                }                return true;            }            /************************************************************************************************************************/            /// <summary>Returns a string describing this object.</summary>            public override string ToString()                => $"Serialization.ObjectReference [{_InstanceID}] {_Object}";            /************************************************************************************************************************/        }        /************************************************************************************************************************/        /// <summary>Returns true if the `reference` and <see cref="ObjectReference.Object"/> are not null.</summary>        public static bool IsValid(this ObjectReference reference)            => reference?.Object != null;        /************************************************************************************************************************/    }}#endif
 |