Unity插件——Odin 学习笔记(三)
5. Groups and Layout
5.1. Table Lists
5.1.1. TableList
使用[TableList]以表的样式绘制List,具体的样式会根据具体元素的显示情况决定
- int NumberOfItemsPerPage——每页元素的数量
- bool IsReadOnly——是否只读
- int DefaultMinColumnWidth——默认最小列宽
- bool ShowIndexLabels——是否显示Index值
- bool DrawScrollView——是否绘制滚动条
- int MinScrollViewHeight——滚动条显示的最小值
- int MaxScrollViewHeight——滚动条显示的最大值
- bool AlwaysExpanded——是否总是展开
- bool HideToolbar——是否隐藏工具栏
- int CellPadding——元素间隔
- bool ShowPaging——是否显示页数
- int ScrollViewHeight——滚动显示的高度
public class TableListExamples : MonoBehaviour
{[TableList(ShowIndexLabels = true)]public List<SomeCustomClass> TableListWithIndexLabels = new List<SomeCustomClass>();
}[Serializable]
public class SomeCustomClass
{[TableColumnWidth(57, Resizable = false)][PreviewField(Alignment = ObjectFieldAlignment.Center)]public Texture Icon;[TextArea]public string Description;[VerticalGroup("Combined Column"), LabelWidth(22)]public string A, B, C;[TableColumnWidth(60)][Button, VerticalGroup("Actions")]public void Test1() { }[TableColumnWidth(60)][Button, VerticalGroup("Actions")]public void Test2() { }
}
5.1.2. TableColumnWidth
在[TableList]下使用[TableColumnWidth]可以调整该元素在TableList中的宽度
- int Width——宽度
- bool Resizable——是否可以调整大小
5.2. Tabs
5.2.1. TabGroup
使用[TabGroup]可以通过TabBar切换所需的属性
- string TabName——TabGroup的名称,默认情况下为"_DefaultTabGroup"
- bool UseFixedHeight——是否这个Tab与其他Tab保持一样的高度
- bool Paddingless——如果为true,则每个页面的内容将不包含在任何框中
//这个Tab A所在的分组是默认分组
[TabGroup("Tab A")]
public int One;
//这个Tab A所在的分组是New Group分组
[TabGroup("New Group", "Tab A")]
public int A;
//上图中上面一个TabGroup为默认分组,下面一个为New Group分组
5.3. Horizontal Groups
5.3.1. PropertyGroupAttribute
- string GroupID——分组ID
- string GroupName——分组名称
- int Order——序号,指所在层
5.3.2. HorizontalGroup
继承自PropertyGroupAttribute,通过使用[HorizontalGroup]属性可以水平布局Inpspector面板的属性
- float Width——宽度
- float MarginLeft——外左边距
- float MarginRight——外右边距
- float PaddingLeft——内左边距
- float PaddingRight——内右边距
- float MinWidth——最小宽度
- float MaxWidth——最大宽度
- string Title——该标签上方出现的标题的文本
- float LabelWidth——指文本宽度
注意:这里的数值为0~1之间时,按百分比计算;为0时会自动调整;大于1时会取整按数值偏移
如果在一个Group中还需要嵌套的话,就要按照以下方式为Group取名
[HorizontalGroup("Split", 0.5f, LabelWidth = 20)]
[BoxGroup("Split/Left")]
public int L;[BoxGroup("Split/Right")]
public int M;[BoxGroup("Split/Left")]
public int N;[BoxGroup("Split/Right")]
public int O;
5.4. Vertical Group
5.4.1. VerticalGroup
继承自PropertyGroupAttribute,通过使用[VerticalGroup]属性可以垂直布局Inpspector面板的属性
- float PaddingTop——内上边距
- float PaddingBottom——内下边距
用法与HorizontalGroup类似,这里不过多赘述
5.5. Foldout Groups
5.5.1. FoldoutGroup
继承自PropertyGroupAttribute,通过使用[FoldoutGroup]属性可以以下拉框形式布局Inpspector面板的属性
- bool Expanded——是否一直展开
用法与HorizontalGroup类似,这里不过多赘述
5.6. Box Group
5.6.1. BoxGroup
继承自PropertyGroupAttribute,通过使用[BoxGroup]属性可以以Box形式布局Inpspector面板的属性
- bool ShowLabel——是否显示标签
- bool CenterLabel——标签是否居中
用法与HorizontalGroup类似,这里不过多赘述
5.7. Toggles
5.7.1. ToggleGroup
继承自PropertyGroupAttribute,通过使用[ToggleGroup]属性可以以Toggle形式布局Inpspector面板的属性,类似[ShowIf],只有当ToggleGroup为True时才显示
- string ToggleGroupTitle——Toggle标签名
- bool CollapseOthersOnExpand——是否打开之后关闭其他所有的
- string ToggleMemberName——Toggle分组名
[ToggleGroup("EnableGroupOne", "$GroupOneTitle")]
public bool EnableGroupOne;[ToggleGroup("EnableGroupOne")]
public string GroupOneTitle = "One";[ToggleGroup("EnableGroupOne")]
public float GroupOneA;[ToggleGroup("EnableGroupOne")]
public float GroupOneB;
5.8. Inline Property
5.8.1. InlineProperty
使用[InlineProperty]可以让内联属性以标签+属性的形式显示出来,而不是下拉框的形式
public class InlinePropertyExamples : MonoBehaviour
{public Vector3Int Vector3Int;public Vector2Int Vector2Int;
}[Serializable]
[InlineProperty(LabelWidth = 13)]
public struct Vector3Int
{[HorizontalGroup]public int X;[HorizontalGroup]public int Y;[HorizontalGroup]public int Z;
}[Serializable]
public struct Vector2Int
{[HorizontalGroup]public int X;[HorizontalGroup]public int Y;
}
5.9. Title Groups
5.9.1. TitleGroup
类似[Title]的用法,这不过这次成为了一个组,详情请参考[Title]
5.10. Groups in Groups
5.10.1. 组嵌套组
本质上就是通过命名的方式来区分组
例如上图中的三个BoxGroup,他们同属于一个HorizontalGroup,那么就可以按照以下方式来命名
[HorizontalGroup("Split", width: 0.4f, LabelWidth = 20)][BoxGroup("Split/Left")][BoxGroup("Split/Center")][BoxGroup("Split/Right")]
如果我们西药在做左边的框再分左右只需要再命名即可
[HorizontalGroup("Split/Left/Split", width: 0.4f, LabelWidth = 20)]
[BoxGroup("Split/Left/Split/Left")][BoxGroup("Split/Left/Split/Right")]
只要分清所在的组并合理命名即可
6. Buttons
6.1. Buttons
6.1.1. Button
对函数使用[Button]属性,就可以再Inspector面板上产生一个可以按的按钮
- int ButtonHeight——按钮高度
- string Name——按钮的名称
- ButtonStyle Style——按钮类型
CompactBox——盒状,按钮在盒子外
FoldoutButton——参数以下拉框的形式展开
Box——盒状,按钮在盒子内 - int buttonSize——设置大小
- bool Expanded——按钮在有参数的情况下是否展开
6.1.2. GUIColor
通过[GUIColor]可以设置GUI的颜色
6.2. Inline Buttons
6.2.1. InlineButton
使用[InlineButton]属性可以在一个属性后跟一个Button
- string MemberMethod——函数名
- string Label——标签名
6.3. Button Groups
6.3.1. ButtonGroup
对于使用[ButtonGroup]的一系列按钮会形成一个按钮组,默认按钮组的名称为“_DefaultGroup”,如果想要创建新的按钮组,那么就在参数中填入组名即可
[Button(ButtonSizes.Large)]
[ButtonGroup("My Button Group")]
private void E()
{}[GUIColor(0, 1, 0)]
[ButtonGroup("My Button Group")]
private void F()
{}
6.4. Buttons With Parameters
6.4.1. Button的参数
那么就如同上面所说的,如果Button是有参数的话,那么就会自动的暴露出来,这里也不多赘述
[Button]
private void Default(float a, float b, GameObject c)
{}
6.5. Responsive Button Group
6.5.1. ResponsiveButtonGroupExample
使用[ResponsiveButtonGroup]就可以制作自适应的按钮组,同样是继承自[PropertyGroupAttribute]
- string group——默认分组为"_DefaultResponsiveButtonGroup"
- ButtonSizes DefaultButtonSize——默认的Button大小
- bool UniformLayout——如果为True那么每一排的Button的宽度都一致
就是一堆会自适应的按钮,就不做演示了
7. Misc
7.1. Disable Context Menu
7.1.1. DisableContextMenu
使用[DisableContextMenu]可以禁用右键操作
- bool DisableForMember——禁用对其成员的右键
- bool DisableForCollectionElements——禁用对数组的右键列表
7.2. Custom Context Menu
7.2.1. CustomContextMenu
使用[CustomContextMenu]可以自定义右键操作
- string MenuItem——选项名
- string MethodName——方法名
[CustomContextMenu("Say Hello/Twice", "SayHello")]
public int MyProperty;private void SayHello()
{Debug.Log("Hello Twice");
}
7.3. On Value Changed
7.3.1. OnValueChanged
使用[OnValueChanged]可以在属性或字段的内容发生改变的时候调用所给的函数
- string MethodName——方法名
- bool IncludeChildren——是否包括子类
//通过这个在选择Shader的同时下面只读属性的的Material也会随之改变
[OnValueChanged("CreateMaterial")]
public Shader Shader;[ReadOnly, InlineEditor(InlineEditorModes.LargePreview)]
public Material Material;private void CreateMaterial()
{if (this.Material != null){DestroyImmediate(this.Material);}if (this.Shader != null){this.Material = new Material(this.Shader);}
}
7.4. Draw With Unity
7.4.1. DrawWithUnity
如果你不想使用Odin绘制了,可以使用[DrawWithUnity]让属性使用Unity绘制
8. Meta
8.1. Put Attributes On Classes
8.1.1. 对类作属性限制
如下使用方法
public class AttributesOnClassesExample : SerializedMonoBehaviour
{public MyClass<int> A;public MyClass<string> B;public MyClass<GameObject> C;
}//下面这些都是我们之前看到过的[Required]//如果为null会有提示
[LabelWidth(70)]//标签宽度为70
[Toggle("IsEnabled")]//isEnabled为True才会显示其余信息
[HideReferenceObjectPicker]//在选择后隐藏选择框,只能使用右键Set to null
public class MyClass<T>
{public bool IsEnabled;public T Foo, Bar;
}
那么最后上面这个案例在Inspector的显示也和我们设想的一样
8.2. Custom Value Drawer
8.2.1. CustomValueDrawer
使用[CustomValueDrawer]可以自定义绘制方法,并且支持撤销操作和多个操作,参数为函数名,函数内使用IMGUI的方式来绘制
[CustomValueDrawer("MyStaticCustomDrawerStatic")]
public float CustomDrawerStatic;private static float MyStaticCustomDrawerStatic(float value, GUIContent label)
{return EditorGUILayout.Slider(label, value, 0f, 10f);
}
//感觉上不太实用
8.3. Title
已做过介绍,略
8.4. Display As String
8.4.1. DisplayAsString
之前也说过,是否已文字的形式绘制,通过Overflow参数调整,如果为false就会自动换行
8.5. Info Box
已做过介绍,略
8.6. Property Tooltip
已做过介绍,略
8.7. Label Text
8.7.1. LabelText
使用[LabelText]可以修改标签的文本,使用$符号可以动态修改文本
[LabelText("3")]
public int MyInt3;[InfoBox("Use $ to refer to a member string.")]
[LabelText("$MyInt3")]
public string LabelText = "Dynamic label text";
8.8. Suffix Label Examples
8.8.1. SuffixLabel
使用[SuffixLabel]属性可以在属性后作一个后缀,这在解释属性的时候非常有用
- string Label——标签名,使用$符号可以动态修改文本
- bool Overlay——是否覆盖,如果使用了覆盖,后缀就会覆盖在属性上而不是写在后面
[SuffixLabel("$Suffix", Overlay = true)]
public string Suffix = "Dynamic suffix label";
8.9. Hide Label
8.9.1. HideLabel
通过使用[HideLabel]可以隐藏属性的标签名
8.10. On Inspector GUI
8.10.1. OnInspectorGUI
使用[OnInspectorGUI]也可以自定义绘制GUI,绘制方法还是IMGUI,可以通过对函数添加属性,也可以通过在参数中添加函数名来绘制
8.11. GUI Color
8.11.1. GUIColor
通过[GUIColor]可以设置GUI的颜色,可以通过设置rgba、设置Color以及函数返回Color来设置颜色,比较简单
8.12. Indent
8.12.1. Indent
通过[Indent]可以进行缩进,参数为缩进大小(正负都可以,int类型),也很简单
8.13. Property Order
8.13.1. PropertyOrder
通过[PropertyOrder]可以改变属性的排布顺序,默认的排布顺序是根据代码从上往下,使用了PropertyOrder就会根据PropertyOrder排序,默认为0(即没有标注的也为0),同等数值也是从上往下
8.14. Show Properties In The Inspector
8.14.1. HideInInspector/ShowInInspector
[HideInInspector]可以让已经被序列化的属性不在Inspector面板中出现
[ShowInInspector]可以让即使没有被序列化的属性也在Inspector面板中出现
之前也说过,略
8.15. Show Static Members In The Inspector
8.15.1. 显示静态成员
使用[ShowInInspector]可以让静态的成员也显示出来,而静态函数不需要标签也能显示
8.16. Show Drawer Chain
8.16.1. ShowDrawerChain
使用[ShowDrawerChain]可以显示绘制顺序,用来Debug
那么到这里为止Attributes Overview案例的内容已经完全解释完毕,已经对大部分基本的标签有了基本的了解,接下来就是发挥自己的想象力来对自己的项目进行处理了!
Unity插件——Odin 学习笔记(三)相关推荐
- Unity插件EasyTouch学习笔记
前言 EasyTouch是一款非常好用识别手机操作的插件,比如各种手势.摇杆等等,熟悉之后可以节约大量造轮子的时间. 我是在2019版本的Unity上进行测试的. 4.x用法 注意事项: 代码需要引用 ...
- 【Unity 3D】学习笔记三十六:物理引擎——刚体
物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的 ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- Unity超基础学习笔记(二)
Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...
- Unity动画状态机学习笔记
Unity动画状态机学习笔记 一.建平面,拖人物模型.建状态机.动画导入.拖组件--实现Game时人物动画为等待状态. 二.拖WAIT01.WAIT02.WAIT03.WAIT04--实现按数字1切换 ...
- K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程
K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...
- 【AngularJs学习笔记三】Grunt任务管理器
为什么80%的码农都做不了架构师?>>> #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...
- Unity之C#学习笔记(11):静态类型 Static
前篇链接:Unity之C#学习笔记(10):接口和多态 Interfaces and Polymorphism 静态类型(Static)用一句话概括就是:在程序运行期间只会被创建一份的通用内容,用关键 ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
- tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...
最新文章
- RUNOOB python练习题5
- 升级鸿蒙系统有没有翻车,被寄予厚望的华为鸿蒙系统,这次要翻车?原来并不是我们想的那样...
- springcloud config服务端配置(二)
- PSPad 免费文本编辑器推荐
- 列出spring security的所有SecurityFilterChain
- flash 与随机性:随机抽取(2)
- Speaker Recognition: Feature Extraction
- 查询数据库现在几个用户在连接
- Android Studio制作简易音乐盒
- 一个区块链美女小白的蜕变——我庆幸自己能生活在这个高速时代!
- 绘制太极图(CSS)
- Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?
- go用函数字符串名调用函数
- 场景编程集锦 - 吉米的总统梦想
- The LeVoice Far-field Speech Recognition System for VOiCES from a Distance Challenge 2019
- [转]PROE传动链条的装配教程
- 洛谷noip 模拟赛 day1 T3
- 水面反光如何拍摄_如何把水面拍出粼粼波光
- 企业局域网规划与管理
- Jackson之jackson-core
热门文章
- “配置系统未能初始化” 异常解决
- CTF-密码学-位移密码
- (附源码)小程序 口腔诊所预约系统 毕业设计 201738
- 计算机毕业设计ssm基于SSM框架的人力资源管理系统89kq5系统+程序+源码+lw+远程部署
- 黑苹果安装记录(史上最简单的安装教程——小白福利)
- python chardet_【已解决】windows下,安装python的chardet
- Xshell 6安装和使用教程
- 手机屏幕怎么计算机,怎么将手机屏幕投屏到电脑上
- FPGA作业1:利用74161设计20进制计数器
- 一篇文章带你游历各种编码方式(三阶高密度码,曼彻斯特编码,交替双极性反转码,单双级(不)归零码)