Unity插件——Odin 学习笔记(一)

本文是Unity插件Odin的学习笔记,重点介绍了如何使用Odin的Attributes来改进编辑器,包括InfoBox、Title、Lists、Enum相关属性、MinMaxSlider等,以实现更高效、直观的Unity工具开发。
摘要由CSDN通过智能技术生成

本文章是为了记录学习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 
  • 27
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值