本文章是为了记录学习Unity插件Odin,使用该插件可以让我们更快速便捷的开发Unity工具
前言
Unity原生编辑编辑器的方法有两种——IMGUI和新的UIElement
1.UIElement我之前做过介绍,开发模式类似于HTML+CSS,如果有类似经验的人开发及相对容易,但是就目前而言不太适合编辑器开发,我觉得比较适合取代UGUI进行UI开发
2.IMGUI入门比较简单,使用EditorGUILayout或者GUILayout来编写编辑器并进行排版和布局,通过回调来添加事件,但是写多了,EditorGUILayout会变得层层叠叠,代码可读性变得非常差,没有合理的注释或者拆分的话,可能时间一长自己都看不懂了
3.Odin就是基于IMGUI的编辑器拓展的插件,同时也可以帮助开发者进行序列化操作(Unity原生的序列化不支持很多类型,Odin支持比Unity更多的序列化,例如二维数组、Dictionary),在使用Odin的时候,我们通过Odin中给予我们的Attributes来快速影响我们所需要编辑的字段,帮助我们快速开发可视化界面以及工具
案例:Attributes Overview
1. Basic Editor Changes
1.1. Default Drawer Changes
1.1.1. InfoBox
使用[InfoBox]可以在编辑器中添加提示框
- string Message——信息
- InfoMessageType InfoMessageType——信息类型(Info/Warning/Error),会改变图标类型
- string VisibleIf——是否显示,需要填入函数名,返回值为bool类型,根据返回值决定是否显示提示框
- bool GUIAlwaysEnabled——是否无视GUI.enable显示
[InfoBox("All enums will now have a more feature-rich dropdown that introduces search.",InfoMessageType = InfoMessageType.Warning,VisibleIf = "ChangeShow")]
public KeyCode NormalEnum;
public bool ChangeShow()
{
return NormalEnum == KeyCode.A ? true : false;//只有当NormalEnum为KeyCode.A时才会显示提示框
}
1.1.2. 普通属性
例如int,Vector2,Rect等,还是和原来一样
1.1.3. Title
使用[Title]可以在编辑器中添加标题
- string Title——标题
- string Subtitle——副标题
- bool Bold——是否加粗
- bool HorizontalLine——有否有水平线分割(如下图)
- TitleAlignments TitleAlignment——标题对齐方式(Left/Centered/Right/Split),前三个为左中右,标题与副标题上下排列,最后一个标题左对齐,副标题右对齐(如下图)
[Title("Small Facts",Subtitle ="aaa",TitleAlignment = TitleAlignments.Split, Bold = true, HorizontalLine = true)]
1.2. Lists
1.2.1. List< T >
List< T >类型的可视化界面如下图所示
1.2.2. Range
使用[Range]可以将数值变成滑动条的形式,如果使用在数组上,数组都会变成滑动条
1.2.3. ListDrawerSettings
使用[ListDrawerSettings]可以对List类型的UI进行定制
- bool HideAddButton——是否隐藏Add按钮,隐藏上图所示“+”按钮
- bool AddCopiesLastElement——是否在Add时复制最后一个元素
- string OnEndListElementGUI——在List每个元素更新前需要调用的函数
- string OnBeginListElementGUI——在List每个元素更新后需要调用的函数
- string CustomRemoveElementFunction——在点击移除键时调用的函数,根据元素值
- bool AlwaysAddDefaultValue——(没弄懂)理论上是在点击时不会显示其派生类供选择,直接显示基类T
- string CustomAddFunction——自定义Add按钮的函数,返回值为元素
- string ListElementLabelName——List中元素的标签名,参数为字段/属性名
- bool HideRemoveButton——是否隐藏移除按钮
- string CustomRemoveIndexFunction——在点击移除键时调用的函数,根据元素的index值
[System.Serializable]
public class A
{
public float num;
}
[System.Serializable]
public class AB : A
{
public int i;
}
[System.Serializable]
public class AC : A
{
public bool j;
}
//超级简单的案例
[InfoBox("Applying a [Range] attribute to this list instead applies it to all of its float entries.")]
//[Range(0, 1)]
[ListDrawerSettings(HideAddButton = false,CustomRemoveElementFunction = "CustomRemove", AddCopiesLastElement = true,
OnBeginListElementGUI = "BeginGUI",OnEndListElementGUI