using System; using System.Reflection; using UnityEngine; using UnityEditor; public abstract class InspectorExt : Editor { protected Editor defaultEditor; protected abstract string defaultEditorName { get; } bool s_MoreInfo = true; static readonly GUIContent more = EditorGUIUtility.TrTextContent("More Information", null, (Texture2D)null); public virtual void OnEnable() { defaultEditor = Editor.CreateEditor(targets, Type.GetType(defaultEditorName)); if(defaultEditor == null) Debug.LogError("No such editor class \""+ defaultEditorName + "\""); TryInvokeDefaultMethod("OnEnable"); } public virtual void OnDisable() { //When OnDisable is called, the default editor we created should be destroyed to avoid memory leakage. //Also, make sure to call any required methods like OnDisable TryInvokeDefaultMethod("OnDisable"); DestroyImmediate(defaultEditor); s_MoreInfo = true; } public override void OnInspectorGUI() { if (defaultEditor) defaultEditor.OnInspectorGUI(); } public virtual void OnSceneGUI () { TryInvokeDefaultMethod("OnSceneGUI"); } protected bool BeginMore() { s_MoreInfo = EditorGUILayout.BeginFoldoutHeaderGroup(s_MoreInfo, more, null, null, null); return s_MoreInfo; } protected void EndMore() { EditorGUILayout.EndFoldoutHeaderGroup(); } protected void TryInvokeDefaultMethod(string method, BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) { MethodInfo disableMethod = defaultEditor.GetType().GetMethod(method, flag); if (disableMethod != null) { disableMethod.Invoke(defaultEditor, null); } } }