| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | // Animancer // Copyright 2018-2024 Kybernetik //#if UNITY_EDITORusing System;using UnityEditor;using UnityEngine;namespace Animancer.Editor{    /// <summary>[Editor-Only]    /// A <see cref="SerializedDataEditorWindow{TObject, TData}"/> for <see cref="Component"/>s.    /// </summary>    /// https://kybernetik.com.au/animancer/api/Animancer.Editor/SerializedComponentDataEditorWindow_2    public abstract class SerializedComponentDataEditorWindow<TObject, TData> :        SerializedDataEditorWindow<TObject, TData>        where TObject : Component        where TData : class, ICopyable<TData>, IEquatable<TData>, new()    {        /************************************************************************************************************************/        [SerializeField] private GameObject _SourceGameObject;        [SerializeField] private int _SourceComponentInstanceID;        /************************************************************************************************************************/        /// <inheritdoc/>        public override TObject SourceObject        {            get            {                // For whatever reason, component references in an EditorWindow can't survive entering Play Mode but                // a GameObject or Transform reference can so we use that to recover the component.                // Storing the Instance ID also works, but seems to also survive restarting the Unity Editor which is                // bad because the scene references inside the data don't survive that which would leave us                // with an open window full of empty references. Working around that isn't worth the effort.                // So if the GameObject still exists, we use the Component's Instance ID to find it.                var source = base.SourceObject;                if (source == null && _SourceGameObject != null)                    source = base.SourceObject = EditorUtility.InstanceIDToObject(_SourceComponentInstanceID) as TObject;                return source;            }        }        /************************************************************************************************************************/        /// <inheritdoc/>        public override bool SourceObjectMightBePrefab            => true;        /************************************************************************************************************************/        /// <inheritdoc/>        protected override void CaptureData()        {            base.CaptureData();            if (SourceObject != null)            {                _SourceGameObject = SourceObject.gameObject;                _SourceComponentInstanceID = SourceObject.GetInstanceID();            }        }        /************************************************************************************************************************/    }}#endif
 |