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 学习笔记(三)相关推荐

  1. Unity插件EasyTouch学习笔记

    前言 EasyTouch是一款非常好用识别手机操作的插件,比如各种手势.摇杆等等,熟悉之后可以节约大量造轮子的时间. 我是在2019版本的Unity上进行测试的. 4.x用法 注意事项: 代码需要引用 ...

  2. 【Unity 3D】学习笔记三十六:物理引擎——刚体

    物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的 ...

  3. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  4. Unity超基础学习笔记(二)

    Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...

  5. Unity动画状态机学习笔记

    Unity动画状态机学习笔记 一.建平面,拖人物模型.建状态机.动画导入.拖组件--实现Game时人物动画为等待状态. 二.拖WAIT01.WAIT02.WAIT03.WAIT04--实现按数字1切换 ...

  6. 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 个重要概念 ...

  7. 【AngularJs学习笔记三】Grunt任务管理器

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  8. Unity之C#学习笔记(11):静态类型 Static

    前篇链接:Unity之C#学习笔记(10):接口和多态 Interfaces and Polymorphism 静态类型(Static)用一句话概括就是:在程序运行期间只会被创建一份的通用内容,用关键 ...

  9. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  10. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

最新文章

  1. RUNOOB python练习题5
  2. 升级鸿蒙系统有没有翻车,被寄予厚望的华为鸿蒙系统,这次要翻车?原来并不是我们想的那样...
  3. springcloud config服务端配置(二)
  4. PSPad 免费文本编辑器推荐
  5. 列出spring security的所有SecurityFilterChain
  6. flash 与随机性:随机抽取(2)
  7. Speaker Recognition: Feature Extraction
  8. 查询数据库现在几个用户在连接
  9. Android Studio制作简易音乐盒
  10. 一个区块链美女小白的蜕变——我庆幸自己能生活在这个高速时代!
  11. 绘制太极图(CSS)
  12. Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?
  13. go用函数字符串名调用函数
  14. 场景编程集锦 - 吉米的总统梦想
  15. The LeVoice Far-field Speech Recognition System for VOiCES from a Distance Challenge 2019
  16. [转]PROE传动链条的装配教程
  17. 洛谷noip 模拟赛 day1 T3
  18. 水面反光如何拍摄_如何把水面拍出粼粼波光
  19. 企业局域网规划与管理
  20. Jackson之jackson-core

热门文章

  1. “配置系统未能初始化” 异常解决
  2. CTF-密码学-位移密码
  3. (附源码)小程序 口腔诊所预约系统 毕业设计 201738
  4. 计算机毕业设计ssm基于SSM框架的人力资源管理系统89kq5系统+程序+源码+lw+远程部署
  5. 黑苹果安装记录(史上最简单的安装教程——小白福利)
  6. python chardet_【已解决】windows下,安装python的chardet
  7. Xshell 6安装和使用教程
  8. 手机屏幕怎么计算机,怎么将手机屏幕投屏到电脑上
  9. FPGA作业1:利用74161设计20进制计数器
  10. 一篇文章带你游历各种编码方式(三阶高密度码,曼彻斯特编码,交替双极性反转码,单双级(不)归零码)