更新日期:2020年8月21日。
Github源码:[点我获取源码] Gitee源码:[点我获取源码]
索引
- Inspector自定义序列化检视器
- 使用
- Dropdown下拉框检视器
- string下拉框
- int下拉框
- float下拉框
- ReorderableList可排序列表检视器
- 数组
- 集合
- Enable激活状态检视器
- Display显示状态检视器
- Label标签检视器
- Color颜色检视器
- ReadOnly只读检视器
- Hyperlink超链接检视器
- GenericMenu通用菜单检视器
- GenericTable通用表格检视器
- Drawer抽屉检视器
- PropertyDisplay公共属性检视器
- Event事件检视器
- Button按钮检视器
Inspector自定义序列化检视器
Inspector自定义序列化检视器支持通过简单的在序列化字段上添加特性标记从而实现在Inspector界面自定义多种实用的检视器效果。
使用
Dropdown下拉框检视器
目前可以为int,string,float三种类型的序列化字段定义下拉框检视器,下拉框检视器使得目标字段在Inspector面板只能设置为下拉框中的几种值之一,以防止出现意外值:
string下拉框
比如今有字段Sex表示性别,其值只能为男、女、未知三种,使用Dropdown限制其值:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
}
在Inspector面板的效果:

int下拉框
比如今有字段Age表示青少年段的年龄,其值只能为13, 14, 15, 16, 17五种,使用Dropdown限制其值:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
}
在Inspector面板的效果:

float下拉框
比如今有字段Height表示青少年段的身高分段,其值只能为1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f六种,使用Dropdown限制其值:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
}
在Inspector面板的效果:

ReorderableList可排序列表检视器
目前可以为任意类型的数组、List集合的序列化字段定义可排序列表检视器,可排序列表检视器使得目标字段在Inspector面板生成一个美观的、可拖动子元素排序、可增删的列表(自己在Editor类中实现一个ReorderableList比较复杂,需要写很多代码,这里只需要一个特性标记):
数组
比如今有字段Interest表示青少年的爱好,使用ReorderableList定义检视器:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[ReorderableList]
public string[] Interest;
}
在Inspector面板的效果:

集合
比如今有字段Uniform表示青少年的校服种类,使用ReorderableList定义检视器:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[ReorderableList]
public string[] Interest;
[ReorderableList]
public List<Material> Uniform;
}
在Inspector面板的效果:

Enable激活状态检视器
目前可以为任意的序列化字段定义激活状态检视器,激活状态检视器使得目标字段可以根据相应的条件来决定其自身是否激活:
比如今有如下需求,年龄Age大于15岁的青少年将不再有爱好,使用Enable定义检视器:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
//Enable 特性的参数 AgeGreater15 为方法名,该方法的返回值决定此字段的激活状态,所以该方法必须是bool型返回值
[Enable("AgeGreater15")]
[ReorderableList]
public string[] Interest;
[ReorderableList]
public List<Material> Uniform;
private bool AgeGreater15()
{
return Age <= 15;
}
}
在Inspector面板的效果(Age大于15,Interest变为灰色未激活状态):

Display显示状态检视器
目前可以为任意的序列化字段定义显示状态检视器,显示状态检视器使得目标字段可以根据相应的条件来决定其自身是否显示:
比如今有如下需求,年龄Age大于15岁的青少年不只是没有爱好,同时还要忘掉过去的爱好,使用Display定义检视器:
public class Test : MonoBehaviour
{
[Dropdown("男", "女", "未知")]
public string Sex;
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
//Display 特性的参数 AgeGreater15 为方法名,该方法的返回值决定此字段的显示状态,所以该方法必须是bool型返回值
[Display("AgeGreater15")]
[ReorderableList]
public string[] Interest;
[ReorderableList]
public List<Material> Uniform;
private bool AgeGreater15()
{
return Age <= 15;
}
}
在Inspector面板的效果(Age大于15,Interest字段直接隐藏了):

Label标签检视器
目前可以为任意的序列化字段定义标签检视器,标签检视器使得目标字段始终以标签指定的名称显示在Inspector面板:
使用Label定义检视器:
public class Test : MonoBehaviour
{
[Label("性别")]
[Dropdown("男", "女", "未知")]
public string Sex;
[Label("年龄")]
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Label("身高")]
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[Label("爱好")]
[ReorderableList]
public string[] Interest;
[Label("校服")]
[ReorderableList]
public List<Material> Uniform;
}
在Inspector面板的效果:

Color颜色检视器
目前可以为任意的序列化字段定义颜色检视器,颜色检视器使得目标字段始终以指定的颜色显示在Inspector面板:
使用Color定义检视器:
public class Test : MonoBehaviour
{
[Color(1, 0, 0, 1)]
[Label("性别")]
[Dropdown("男", "女", "未知")]
public string Sex;
[Color(0, 1, 0, 1)]
[Label("年龄")]
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Color(0.48f, 0.5f, 0.3f, 1)]
[Label("身高")]
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[Label("爱好")]
[ReorderableList]
public string[] Interest;
[Color(0.78f, 0.89f, 0.1f, 1)]
[Label("校服")]
[ReorderableList]
public List<Material> Uniform;
}
在Inspector面板的效果:

ReadOnly只读检视器
目前可以为任意的序列化字段定义只读检视器,只读检视器使得目标字段在Inspector面板为只读的,不可编辑的:
使用ReadOnly定义检视器:
public class Test : MonoBehaviour
{
[ReadOnly]
[Label("性别")]
[Dropdown("男", "女", "未知")]
public string Sex;
[ReadOnly]
[Label("年龄")]
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Label("身高")]
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[Label("爱好")]
[ReorderableList]
public string[] Interest;
[Label("校服")]
[ReorderableList]
public List<Material> Uniform;
}
在Inspector面板的效果:

Hyperlink超链接检视器
目前可以为任意的string类型序列化字段定义超链接检视器,超链接检视器使得目标字段在Inspector面板自动展示一个可以点击的超链接文本:
使用Hyperlink定义检视器:
public class Test : MonoBehaviour
{
[Hyperlink("百度一下")]
public string Baidu = "https://www.baidu.com/";
}
在Inspector面板的效果:

GenericMenu通用菜单检视器
目前可以为string类型的序列化字段定义通用菜单检视器,通用菜单检视器使得目标字段在Inspector面板生成一个按钮,点击后生成一个自定义菜单,选中菜单中内容后赋值给字段:
使用GenericMenu定义检视器:
public class Test : MonoBehaviour
{
[Label("设置模式"), GenericMenu(nameof(SetMode))] public string Mode;
#if UNITY_EDITOR
private string[] SetMode()
{
string[] strs = new string[3];
strs[0] = "学霸模式";
strs[1] = "学渣模式";
strs[2] = "自定义模式";
return strs;
}
#endif
}
在Inspector面板的效果:

当然,GenericMenu与Dropdown不同的地方不仅仅是GenericMenu的弹出菜单可以动态配置,而且还可以给菜单项指定回调,当选择了任何菜单项后都会呼叫回调方法:
public class Test : MonoBehaviour
{
[Label("设置模式"), GenericMenu(nameof(SetMode), nameof(DoMode))] public string Mode;
#if UNITY_EDITOR
private string[] SetMode()
{
string[] strs = new string[3];
strs[0] = "学霸模式";
strs[1] = "学渣模式";
strs[2] = "自定义模式";
return strs;
}
private static void DoMode(string mode)
{
if (mode == "学霸模式")
{
//当被设置为"学霸模式"时,立刻学习
"学习".Info();
}
}
#endif
}
GenericTable通用表格检视器
目前可以为自定义复杂类型的数组、集合的序列化字段定义通用表格检视器,通用表格检视器使得目标字段在Inspector面板生成一个按钮,点击后可以展开至表格窗口中编辑数据,对于数据项比较多的情况将会更加直观:
使用GenericTable定义检视器:
public class Test : HTBehaviour
{
[GenericTable, Label("学生们")] public Student[] Students;
[System.Serializable]
public class Student
{
public string name;
public Sex sex;
public int age;
public string grade;
public string address;
public GameObject entity;
public Color col;
public Texture headImage;
}
public enum Sex
{
Man,
Woman
}
}
在Inspector面板的效果:

很明显,在Inspector面板直接编辑数据会比较麻烦,我们点击上图的按钮,展开至表格编辑窗口:

通用表格编辑窗口使得我们编辑数据更加直观,而且还可以根据某一列进行排序,大大增加了搜索、编辑数据的便捷性。
Drawer抽屉检视器
目前可以为任意类型序列化字段定义抽屉检视器,抽屉检视器使得目标字段及后续字段被组合到一个分组内,并由此抽屉决定是否展开分组,直到遇到下一个抽屉为止:
使用Drawer定义检视器:
public class Test : HTBehaviour
{
[Drawer("玩家1")] //将之后的属性打包为一个可折叠抽屉分组
[Label("玩家1姓名")] public string Name1;
[Label("玩家1等级")] public int Level1;
[Label("玩家1性别"), Dropdown("男", "女")] public string Sex1 = "男";
[Drawer("玩家2")] //将之后的属性打包为一个可折叠抽屉分组
[Label("玩家2姓名")] public string Name2;
[Label("玩家2等级")] public int Level2;
[Label("玩家2性别"), Dropdown("男", "女")] public string Sex2 = "男";
}
在Inspector面板的效果:

PropertyDisplay公共属性检视器
目前可以为任意的属性定义公共属性检视器,公共属性检视器使得目标属性可以展示在Inspector面板上:
使用PropertyDisplay公共属性检视器:
public class Test : MonoBehaviour
{
private Transform _trans;
[PropertyDisplay("目标", false)]
public Transform Trans
{
get
{
return _trans;
}
}
[PropertyDisplay("姓名", false)]
public string Name { get; set; } = "张三";
[PropertyDisplay("自定义类", false)]
public MyClass myClass { get; set; }
[PropertyDisplay(null, false)]
public string Age { get; }
}
public class MyClass
{
}
在Inspector面板的效果:

注意:你应该知晓的是,由于属性不能序列化,比如在此处修改了‘姓名’的值后,关闭场景并重新打开后,‘姓名’值会再次复原为‘张三’。
Event事件检视器
目前可以为任意的事件定义事件检视器,事件检视器使得目标事件在Inspector面板自动展开事件中包含的所有已注册方法:
使用Event定义检视器:
public class Test : MonoBehaviour
{
[Event("学习")]
public HTFAction Study;
private void Start()
{
Study += OnStudyYuWen;
Study += OnStudyShuXue;
}
/// <summary>
/// 学习语文
/// </summary>
private void OnStudyYuWen()
{
}
/// <summary>
/// 学习数学
/// </summary>
private void OnStudyShuXue()
{
}
}
在Inspector面板的效果:

Button按钮检视器
目前可以为任意的方法定义按钮检视器,按钮检视器使得目标方法在Inspector面板自动生成一个按钮,点击按钮可以执行到该方法:
使用Button定义检视器:
public class Test : MonoBehaviour
{
[Label("性别")]
[Dropdown("男", "女", "未知")]
public string Sex;
[Label("年龄")]
[Dropdown(13, 14, 15, 16, 17)]
public int Age;
[Label("身高")]
[Dropdown(1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f)]
public float Height;
[Label("爱好")]
[ReorderableList]
public string[] Interest;
[Label("校服")]
[ReorderableList]
public List<Material> Uniform;
//一键设置目标为学霸
[Button(text: "设置为学霸")]
private void SetToZha()
{
Age = 13;
Height = 1.7f;
Interest = new string[] { "看书", "上课", "做题", "做作业", "做卷子" };
}
}
在Inspector面板的效果:

点击按钮设置为学霸,一个学霸就诞生了:











