首页 > 其他分享 >【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器

时间:2022-12-13 15:04:25浏览次数:70  
标签:检视 string 自定义 Dropdown Label Unity Inspector 序列化 public


更新日期: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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Unity

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_序列化_02

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_03

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Unity_04

集合

比如今有字段​​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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_05

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变为灰色未激活状态):

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_HTFramework_06

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字段直接隐藏了):

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Inspector_07

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_HTFramework_08

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Inspector_09

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Inspector_10

Hyperlink超链接检视器

目前可以为​​任意的string​​类型序列化字段定义超链接检视器,超链接检视器使得目标字段在Inspector面板自动展示一个可以点击的超链接文本

使用​​Hyperlink​​定义检视器:

public class Test : MonoBehaviour
{
[Hyperlink("百度一下")]
public string Baidu = "https://www.baidu.com/";
}

在​​Inspector​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_序列化_11

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_序列化_12

当然,​​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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_13


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

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_Inspector_14


通用表格编辑窗口使得我们编辑数据更加直观,而且还可以根据某一列进行排序,大大增加了搜索、编辑数据的便捷性。

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_15

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_16

注意:你应该知晓的是,由于属性不能序列化,比如在此处修改了‘姓名’的值后,关闭场景并重新打开后,‘姓名’值会再次复原为‘张三’。

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_HTFramework_17

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​​面板的效果:

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_HTFramework_18


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

【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器_框架_19


标签:检视,string,自定义,Dropdown,Label,Unity,Inspector,序列化,public
From: https://blog.51cto.com/u_15911199/5934148

相关文章

  • 【Unity】 HTFramework框架(三十六)AssetsMaster资源管理器,做资产的主人
    更新日期:2020年8月13日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​AssetsMaster​​​​使用AssetsMaster​​​​打开AssetsMaster......
  • Unity 多物体混合动画、值变动画控制器
    索引​​前言​​​​示例​​​​1、4个Cube的联动动画​​​​2、UGUIText文本动画​​​​3、UGUIImage图片动画​​​​4、物体消隐动画​​​​使用与解析​​​​1......
  • Unity实现在白板上绘画涂鸦
    前言有段时间没有更新博客了,不知道应该写些什么,太简单感觉没有记录的必要,太难自己都没能理解,不知道如何下手。回归初心,记录自己想记录的东西。需要实现一个白板绘画的功能,......
  • Unity 使用拖尾渲染器模拟简易的管道流体
    关于管道流体关于管道流体,最佳的解决方案肯定是UV动画无疑,在网上看过很多例子几乎都是这样的,毕竟用实时流体计算的话开销确实太大,用粒子系统的话又苦于难以表现出流体的粘稠......
  • Unity UGUI图文混排源码(三) -- 动态表情
    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章1.首先来一个好消息,在最新版本的图文混排中,终于......
  • Unity 简易的UI背景昼夜轮替效果
    在UI背景上实现一个简易的有光影照射的昼夜轮替效果,往往比一个死板的UI背景看起来更加形象生动,比较传统的方式是多图轮流替换的序列帧动画,不过要达到整个UI背景大图的所有地......
  • 手动build unity3d的docker镜像
    手动buildunity3d的docker镜像参考资料docker官方文档:​​DockerDocumentation|DockerDocumentation​​unity3dlinux版的论坛链接,在这里能找到各个版本,以及需要安装......
  • Unity UGUI
    超详细的基础教程传送门:(持续更新中)UnityUGUI的教程好少,幸亏找到一个UGUI的Demo,看了几个例子,以下是一些简单的学习笔记:1.导入UI图片资源2.设置参数:            ......
  • unity shaderlab Blend操作
    原文链接: ​​http://www.tiankengblog.com/?p=84​​Blend混合操作是作用于在所有计算之后,是Shader渲染的最后一步,进行Blend操作后就可以显示在屏幕上。shader的计算步骤......
  • 【Unity】超级坦克大战(二)游戏流程
    更新日期:2020年7月9日。项目源码:在终章发布索引​​本章最佳实践​​​​正式开始​​​​登录流程​​​​准备流程​​​​关卡选择流程​​​​闯关流程​​​​启用所......