85 lines
2.1 KiB
C#

using UnityEngine;
using UnityEditor;
public abstract class BaseRetargetingEditor : Editor
{
protected bool isDirty = false;
protected double lastUpdateTime;
protected const double UPDATE_INTERVAL = 0.1f;
protected virtual void OnEnable()
{
EditorApplication.update += OnEditorUpdate;
Undo.undoRedoPerformed += OnUndoRedo;
lastUpdateTime = EditorApplication.timeSinceStartup;
}
protected virtual void OnDisable()
{
EditorApplication.update -= OnEditorUpdate;
Undo.undoRedoPerformed -= OnUndoRedo;
}
protected virtual void OnEditorUpdate()
{
if (EditorApplication.timeSinceStartup - lastUpdateTime < UPDATE_INTERVAL)
return;
if (isDirty)
{
RefreshAllComponents();
isDirty = false;
}
lastUpdateTime = EditorApplication.timeSinceStartup;
}
protected virtual void RefreshAllComponents()
{
if (!serializedObject.targetObject) return;
if (serializedObject.hasModifiedProperties)
{
serializedObject.Update();
}
var targetObj = target as MonoBehaviour;
if (targetObj != null && targetObj.isActiveAndEnabled)
{
EditorUtility.SetDirty(targetObj);
if (!EditorApplication.isPlaying)
{
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
targetObj.gameObject.scene);
}
}
if (Selection.activeObject == target)
{
Repaint();
}
}
protected virtual void OnUndoRedo()
{
isDirty = true;
Repaint();
}
protected void MarkDirty()
{
if (!isDirty)
{
isDirty = true;
if (target != null)
{
EditorUtility.SetDirty(target);
if (serializedObject.hasModifiedProperties)
{
serializedObject.ApplyModifiedProperties();
}
}
}
}
}