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; ...
随机推荐
- [C3W1] Structuring Machine Learning Projects - ML Strategy 1
第一周:机器学习策略(1)(ML Strategy(1)) 为什么是ML策略?(Why ML Strategy) 大家好,欢迎收听本课,如何构建你的机器学习项目也就是说机器学习的策略.我希望通过这门课 ...
- 【CodeChef EDGEST】Edges in Spanning Trees(树链剖分+树上启发式合并)
点此看题面 大致题意: 给你两棵\(n\)个点的树,对于第一棵树中的每条边\(e_1\),求存在多少条第二棵树中的边\(e_2\),使得第一棵树删掉\(e_1\)加上\(e_2\).第二棵树删掉\(e ...
- Loadrunner 进行压力测试 并发测试
问题背景: 今年公司项目进行Saas化转型,在中间遇到很多问题,其中之一就是 Saas化后多租户的性能 和 并发问题.公司让我来调研和重现问题,通过调研总结了一些经验教训,分享给大家. 环境: Loa ...
- Chrome保存整个网页为图片
打开需要保存为图片的网页 然后按F12,接着按Ctrl+Shift+P 在红框内输入full 点击下面的“Capture full size screenshot”就可以保存整个网页为图片了 原文出处 ...
- (三十九)golang--反序列化
反序列化:是指将json字符串反序列化成原来的数据类型. import ( "encoding/json" "fmt" ) type monster struc ...
- 使用wireshark学习TCP
TCP标志位: 在TCP传输中,标志位用于表示特定的连接状态或提供额外信息.每个标志位占用1比特.常用的TCP标志位包含以下几种: SYN Synchronous,TCP三次握手建立连接的第一步,主动 ...
- Python - 字典 - 第十天
Python 字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式 ...
- 邮箱图标的css样式
<div> <div style="position:relative; height:40px;width: 70px;border:2px solid black; m ...
- 剑指 Offer——1. 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- Java自学-I/O 控制台输入流System.in
Java 控制台输入流 System.in和Scanner System.out 是常用的在控制台输出数据的 System.in 可以从控制台输入数据 步骤 1 : System.in package ...