之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢?
万变不离其宗, 仍然是围绕UnityEditor.Editor.CreateEditor 这个函数来实现:
- /// <summary>
- /// decorate Unity's built-in inspector Editor.
- /// </summary>
- public class DecoratorEditor<T> : UnityEditor.Editor
- {
- protected T _target;
- protected UnityEditor.Editor _nativeEditor;
- public void OnEnable()
- {
- _target = (T)System.Convert.ChangeType(target, typeof(T));
- Type targetEditorType = null;
- foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
- {
- var tempT = assembly.GetType("UnityEditor." + typeof(T).Name + "Inspector");
- if(tempT != null)
- {
- targetEditorType = tempT;
- break;
- }
- }
- if(targetEditorType != null)
- {
- _nativeEditor = UnityEditor.Editor.CreateEditor(serializedObject.targetObject, targetEditorType);
- }
- else
- {
- _nativeEditor = UnityEditor.Editor.CreateEditor(serializedObject.targetObject);
- }
- }
- public override void OnInspectorGUI()
- {
- if(_nativeEditor != null)
- {
- _nativeEditor.OnInspectorGUI();
- }
- }
- }
这里对于内置Unity Inspector的类型查找几乎是在走钢丝, 也只能碰运气了, 好在我只用来修改了一下TextureImporter的检视面板, 因为Unity2019里面没有显示spritePackingTag这个设置了, 可是这个序列化仍然存在.
- #if UNITY_2019_1_OR_NEWER
- [CustomEditor(typeof(TextureImporter))]
- public class TextureImporterCustomEditor : DecoratorEditor<TextureImporter>
- {
- public override void OnInspectorGUI()
- {
- if(_target.textureType == TextureImporterType.Sprite)
- {
- _target.spritePackingTag = EditorGUILayout.TextField("Packing Tag", _target.spritePackingTag);
- }
- base.OnInspectorGUI();
- }
- }
- #endif
这样我的设置又回来了.