Unity插件Odin简要入门

  • 这几天我把Odin在Unity商城里半价买了下来,Odin真是香的一
  • 有感而发,做出了这么一个入门教程

一:介绍

  • Odin是一个专门用来美化Unity的检视面板的API类插件
  • Odin主要是拓展了Unity里的Object的参数属性标签,例如原版的[SerializeField]

二:注意事项

  • 先创建一个脚本做演示,然后将此脚本挂载到某场景物体上
  • 在调用之前,需要做引用using Sirenix.OdinInspector;
  • 点击工具栏里的Tools -> Odin Inspector -> Attribute Overview可以查看Unity内嵌教程

三:常用功能

颜色

[GUIColor()]——对界面的颜色进行修改

1
2
[GUIColor(1.0f, 0.3f, 0.6f)]
public int myInt_1 = 0;

标题

[Title()]——在下列参数之前做标题提示

1
2
3
4
5
6
7
8
[Title("Title One")]
public int myInt_1 = 0;

[Title("Title Two", "Lil Title One")]
public int myInt_2 = 0;

[Title("Title Three", "Lil Title One", TitleAlignments.Centered)]
public int myInt_3 = 0;

只读

[ReadOnly]——在检视面板里显示,但是不能修改

1
2
[ReadOnly]
public int myInt_1 = 0;

数值规范化

[ValueDropdown()]——规定某数值只能选取某静态数组或枚举数中规定的数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ValueDropdown("ValueGroup_1")]
public int myInt_1;

[ValueDropdown("ValueGroup_2")]
public int myInt_2;

private static int[] ValueGroup_1 = new int[]
{
256,
512,
1024
};

private static IEnumerable ValueGroup_2 = new ValueDropdownList<int>()
{
{ "Small", 256 },
{ "Medium", 512 },
{ "Large", 1024 }
};

预制体与场景物体限定

[AssetsOnly]——只允许拖入预制体

[SceneObjectsOnly]——只允许拖入场景物体

1
2
3
4
5
[AssetsOnly]
public GameObject myGO_1;

[SceneObjectsOnly]
public GameObject myGO_2;

隐藏标签

[HideLabel]——隐藏参数的外部描述标签

1
2
[HideLabel]
public int myInt_1;

标签文字修改

[LabelText()]——修改参数的标签文字

1
2
[LabelText("我的整数")]
public int myInt_1;

标签文字长度

[LabelWidth()]——修改参数的标签文字长度

1
2
[LabelWidth(250)]
public int myInt_1;

提示

[InfoBox()]——在参数前添加一个提示框

1
2
3
4
5
6
7
8
[InfoBox("提示", InfoMessageType.Info)]
public int myInt_1;

[InfoBox("警告", InfoMessageType.Warning)]
public int myInt_2;

[InfoBox("报错", InfoMessageType.Error)]
public int myInt_3;

值修改事件

[OnValueChanged()]——当参数被修改时,触发一个函数

1
2
3
4
5
6
7
[OnValueChanged("On_myInt_1_Changed")]
public int myInt_1;

private void On_myInt_1_Changed()
{
print("值被修改");
}

内联标签

[SuffixLabel()]——在参数行的末尾显示一个子标签,通常是注释或者是单位提示

1
2
3
4
5
6
7
8
[SuffixLabel("内部标签")]
public int myInt_1;

[SuffixLabel("内部标签", Overlay = true)]
public int myInt_2;

[SuffixLabel("$myInt_3")]
public int myInt_3;

按钮

[Button()]——修饰一个函数,将其暴露成按钮

1
2
3
4
5
[Button("按钮", ButtonSizes.Large)]
private void Slot_MyButton()
{
print("触发按钮");
}

四:打组

盒型组

[BoxGroup()]——使用相同名称可以隶属于同一盒型组

1
2
3
4
5
6
7
8
[BoxGroup("组1")]
public int myInt_1;

[BoxGroup("组1")]
public int myInt_2;

[BoxGroup("组2")]
public int myInt_3;

按钮组

[ButtonGroup()]——将多个按钮限制到同一排,根据名称不同可以放在不同排

1
2
3
4
5
6
7
8
9
10
11
12
13
[ButtonGroup("ButtonGroup1")]
[Button("按钮1", ButtonSizes.Large)]
private void Slot_MyButton1()
{
print("触发按钮1");
}

[ButtonGroup("ButtonGroup1")]
[Button("按钮2", ButtonSizes.Large)]
private void Slot_MyButton2()
{
print("触发按钮2");
}

折页组

[FoldoutGroup()]——使用相同名称可以隶属于同一折页组,提供折页功能

1
2
3
4
5
6
7
8
[FoldoutGroup("组1")]
public int myInt_1;

[FoldoutGroup("组1")]
public int myInt_2;

[FoldoutGroup("组2")]
public int myInt_3;

横排组

[HorizontalGroup()]——使用相同名称可以隶属于同一横排组

1
2
3
4
5
6
7
8
[HorizontalGroup("组1")]
public int myInt_1;

[HorizontalGroup("组1")]
public int myInt_2;

[HorizontalGroup("组2")]
public int myInt_3;

页面组

[TabGroup()]——使用相同名称可以隶属于同一页面组,提供翻页功能

1
2
3
4
5
6
7
8
[TabGroup("组1")]
public int myInt_1;

[TabGroup("组1")]
public int myInt_2;

[TabGroup("组2")]
public int myInt_3;

勾选组

[ToggleGroup()]——使用相同名称可以隶属于同一勾选组,同一个勾选组绑定一个布尔值来控制只读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ToggleGroup("toggle_1")]
public bool toggle_1;

[ToggleGroup("toggle_1")]
public int myInt_1;

[ToggleGroup("toggle_1")]
public int myInt_2;

[ToggleGroup("toggle_2")]
public bool toggle_2;

[ToggleGroup("toggle_2")]
public int myInt_3;

条件组

[ShowIfGroup()]——使用相同名称可以隶属于同一条件组,同一个条件组绑定一个布尔值来控制显示

1
2
3
4
5
6
7
8
9
10
11
12
public bool toggle_1;

[ShowIfGroup("toggle_1"), BoxGroup("toggle_1/组1")]
public int myInt_1;

[ShowIfGroup("toggle_1"), BoxGroup("toggle_1/组1")]
public int myInt_2;

public bool toggle_2;

[ShowIfGroup("toggle_2"), BoxGroup("toggle_2/组2")]
public int myInt_3;

五:特定数值类型

数值大小限制

[MinValue]——最小值限定

[MaxValue]——最大值限定

[MinMaxSlider]——通过最小值与最大值限定的方式来限定二维向量,不能精准修改浮点

[Wrap]——最小值与最大值相连

1
2
3
4
5
6
7
8
9
10
11
[MinValue(20), MaxValue(30)]
public int myInt_1;

[MinMaxSlider(20, 30)]
public Vector2Int myVector2Int_1;

[MinMaxSlider(20.0f, 30.0f)]
public Vector2 myVector2_1;

[Wrap(0f, 10f)]
public float myFloat_1;

滑动条

[ProgressBar()]——将数字转化成滑动条输入

1
2
3
4
5
[ProgressBar(0, 100, r:1.0f, g:0.2f, b:0.6f, Height=20)]
public int myInt_1;

[ProgressBar(0, 10, Segmented=true)]
public int myInt_2;

调色板

  • 点击工具栏里的Tools -> Odin Inspector -> Preferences -> Color Palettes可以查看调色板配置文件

[ColorPalette()]——使用调色板来快捷选择颜色

1
2
[ColorPalette]
public Color myColor_1;

仅显示文字

[DisplayAsString]——将文字直截了当地显示在检视面板里

1
2
[DisplayAsString, HideLabel]
public string myString_1 = "这是一段文字。";

枚举类型

[EnumPaging]——提供枚举类型的一些辅助按钮

[EnumToggleButtons]——使用按钮组的方式来显示枚举数

1
2
3
4
5
6
7
8
9
10
11
12
[EnumPaging]
public MyEnum myEnum_1;

[EnumToggleButtons]
public MyEnum myEnum_2;

public enum MyEnum
{
First,
Second,
Third
}

文件路径

[FilePath]——提供文件路径搜索按钮

[FolderPath]——提供文件夹路径搜索按钮

1
2
3
4
5
6
7
8
[FilePath]
public string myString_1;

[FilePath(ParentFolder = "Assets/Resources")]
public string myString_2;

[FilePath(ParentFolder = "Assets/Resources", AbsolutePath = true)]
public string myString_3;

预览区

[PreviewField]——创建物体预览区

1
2
3
4
5
6
7
8
9
[PreviewField]
public Object myObject_1;

[VerticalGroup("VG_1/HG_1")]
public string A, B, C;

[PreviewField(50, ObjectFieldAlignment.Right), HideLabel]
[HorizontalGroup("VG_1", 50), VerticalGroup("VG_1/HG_2")]
public Object myObject_2;