1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Animancer // Copyright 2018-2024 Kybernetik //
- #if UNITY_EDITOR
- using 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
|