Unity检视面板的继承方法研究 (二)
之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢?
万变不离其宗, 仍然是围绕UnityEditor.Editor.CreateEditor 这个函数来实现:
/// <summary>
/// decorate Unity's built-in inspector Editor.
/// </summary>
public class DecoratorEditor<T> : UnityEditor.Editor where T : UnityEngine.Object
{
protected T _target;
protected UnityEditor.Editor _nativeEditor;
private static Type _inspectorEditorType = null; public virtual void OnEnable()
{
_target = target as T; if(_inspectorEditorType == null)
{
foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
// get Inspector or Editor
var tagType = assembly.GetType("UnityEditor." + typeof(T).Name + "Inspector")
?? assembly.GetType("UnityEditor." + typeof(T).Name + "Editor");
if(tagType != null)
{
_inspectorEditorType = tagType;
break;
}
}
} if(_inspectorEditorType != null)
{
_nativeEditor = UnityEditor.Editor.CreateEditor(serializedObject.targetObject, _inspectorEditorType);
}
else
{
_nativeEditor = UnityEditor.Editor.CreateEditor(serializedObject.targetObject);
}
} public override void OnInspectorGUI()
{
if(_nativeEditor)
{
_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
这样我的设置又回来了.
补充 : 在重写 TextureImporter 的时候, 有一些东西是没有显示出来或是显示错乱的, 比如修改属性后的 Apply, Revert 按钮没有出现, 这就要自己去找它的原始基类里面的方法了...
#if UNITY_2019_1_OR_NEWER
[CustomEditor(typeof(TextureImporter))]
[CanEditMultipleObjects]
public class TextureImporterCustomEditor : DecoratorEditor<TextureImporter>
{
private static readonly BindingFlags MethodFlag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod; private bool _changed = false;
private MethodInfo _apply = null;
private MethodInfo _resetValues = null; #region Mono Funcs
public override void OnEnable()
{
base.OnEnable(); _apply = _nativeEditor.GetType().GetMethod("Apply", MethodFlag);
_resetValues = _nativeEditor.GetType().GetMethod("ResetValues", MethodFlag);
}
public override void OnInspectorGUI()
{
if(_target.textureType == TextureImporterType.Sprite)
{
_target.spritePackingTag = EditorGUILayout.TextField("Packing Tag", _target.spritePackingTag);
} base.OnInspectorGUI(); if(GUI.changed)
{
_changed = true;
} if(_changed)
{
ChangedButtonGUI();
}
}
private void OnDestroy()
{
if(_changed)
{
if(CommonEditorUtils.MessageBox("Apply Changes ?"))
{
ApplyChanges();
}
else
{
RevertChanges(true);
}
}
}
#endregion #region GUI
protected void ChangedButtonGUI()
{
if(GUILayout.Button("Revert", GUILayout.MaxWidth(50.0f)))
{
RevertChanges();
}
if(GUILayout.Button("Apply", GUILayout.MaxWidth(50.0f)))
{
ApplyChanges();
}
}
#endregion #region Main Funcs
protected void ApplyChanges()
{
if(_changed)
{
_changed = false;
EditorUtility.SetDirty(_target);
if(_apply != null)
{
_apply.Invoke(_nativeEditor, null);
}
_target.SaveAndReimport();
}
}
protected void RevertChanges(bool unselectSelf = false)
{
if(_changed)
{
_changed = false;
_resetValues.Invoke(_nativeEditor, null);
}
if (unselectSelf)
{
Selection.activeObject = null;
}
}
#endregion
}
#endif
省略了一些公共代码, 用反射的方式找到基类方法去实现.
Unity检视面板的继承方法研究 (二)的更多相关文章
- Unity检视面板的继承方法研究 (一)
对于检视面板 Inspector 的面板继承方式对项目来说是很有必要的, 比如一个基类, 写了一个很好看的检视面板[CustomEditor(typeof(XXX))], 可是所有子类的面板无法直接继 ...
- 继承ViewGroup研究(汇总) 一、二、三
转载过来:为一.二.三版本. 仅供参考: 继承ViewGroup研究(1) --简介和一个小Demo 又翻开一个新篇章了,哈哈,上一回学习的是继承View,关于继承View个人感觉不是那么完美,做技术 ...
- 自定义Inspector检视面板
Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...
- Unity检测面板旋转值超过180度成负数的离奇bug
问题描述: 无意中在检视面板上对游戏物体的tansform进行旋转,结果发现旋转超过180度成负数的离奇bug 解决方案: 创建个新的unity工程,进行如上操作,一切正常…… 怀疑问题根源是配置出现 ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity Rain Ai 插件基本使用(二)
前言 在前面的教程中我们已经基本实现了路径导航和障碍物规避. 但是这样我们并没有让我们的角色学会思考,他只是机械的去完成一些步骤,这并不能体现Rain插件的智能. 一个角色他应该有多个不同的状态,待机 ...
- 详解Javascript的继承实现(二)
上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...
- .NET 扩展方法 (二)
上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...
- unity3d编辑器——检视面板部分(一)
最近在学习unity编辑器,so,记录总结一下. 以下介绍了一些简单的unity3d检视面板部分的使用技巧. using UnityEngine; using System.Collections; ...
随机推荐
- Html学习之十六(表格与表单学习--课程表制作)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python3.5.3rc1学习十一:字典与模块
#os模块import oscurDir = os.getcwd()print(curDir) os.mkdir("新建") import timetime.sleep(2)os. ...
- Moving x86 assembly to 64-bit (x86-64)
While 64-bit x86 processors have now been on the market for more than 5 years, software support is o ...
- 首次使用gradle出现Could not find method leftShift() for arguments解决办法
1.在win10桌面编写test.gradle脚本,里面内容如下 task helloword << { println 'Hello gradle qick start' } 2.在do ...
- Luogu P5363 [SDOI2019]移动金币
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...
- Java-100天知识进阶-JVM内存-知识铺(三)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. Java内存模型(JMM) JVM内存模式是JVM的内存分区 Java内存模式是一种虚 ...
- java jdb
https://stackoverflow.com/questions/8155253/how-do-i-compile-in-debug-mode-netbeans-java-maven <p ...
- SQL Server 通过“with as”方法查询树型结构
一.with as 公用表表达式 类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用: 1. 实现递归查询(树形结构) 2. 可以在一个 ...
- js Iframe与父级页面通信及IE9-兼容性
一. postMessage window.postMessage()方法安全地启用Window对象之间的跨源通信:例如,在页面和它产生的弹出窗口之间,或者在页面和嵌入其中的iframe之间. 二.语 ...
- webstorm关闭烦人的eslint语法检查
使用了eslint语法检查之后发现JS代码里面处处是红线,通过右键菜单中的fix eslint problems选项又会发现页面代码的格式被eslint换行得不分青红皂白,索性关闭exlint语法检查 ...