Unity Plugins Odin

Odin Odin

  • 立即刷新

    Sirenix.Utilities.Editor.GUIHelper.RequestRepaint();

  • 取一个随机的 [0, 1) 值 [正弦函数]

    Mathf.Abs(Mathf.Sin((float)EditorApplication.timeSinceStartup))

  • Odin 中一些需要引用变量值或者需要引用方法的地方都可以使用美元符号来引用

    Required("$变量名") Required("$方法名")

  • Odin 中也可以使用 @ 字符来直接引用方法体内容, 在方法体很短很短的时候可以用一下

  • EditorGUI.BeginChangeCheck()if (EditorGUI.EndChangeCheck()) 可以实现监控 GUI 变更

  • EditorGUIUtility.isProSkin 判断是否是黑色主题

  • 得到 Android 平台当前导入设置的尺寸和压缩格式

    return textureImporter.GetPlatformTextureSettings("Android", out var maxSize, out var format);

    • 其中平台名称可选 "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo Switch", "tvOS".
  • 得到默认的导入设置 textureImporter.GetDefaultPlatformTextureSettings()

  • 修改 Mesh 的压缩等级

    MeshUtility.SetMeshCompression(Mesh mesh, ModelImporterMeshCompression level);

AssetsOnly

修饰一个字段, 这个字段只能使用 Project 面板中资源赋值

SceneObjectsOnly

修饰一个字段, 这个字段只能使用 Scene 中的物体赋值

CustomValueDrawer

使用自定义方法来绘制字段的 Inspector

1
2
3
4
5
6
// 用特性修饰字段, 并且引用自定义的界面绘制方法
[CustomValueDrawer(nameof(MyCustomDrawer))]
public float CustomDrawerStatic;

// 界面绘制方法
private static float MyCustomDrawer(float value, GUIContent label) { return EditorGUILayout.Slider(label, value, 0f, 10f); }

Delayed DelayedProperty

分别修饰字段和属性, 让用户的修改不再实时生效, 而是当用户按下 Enter 时或者控件丢失焦点时生效

DetailedInfoBox

修饰一个字段, 在其上方展示一个消息框

可以使用 InfoMessageType 来控制消息框中显示什么样的图标, None 为不显示图标, 默认为 Info

可以使用 VisibleIf(nameof(function)) 来控制消息框的显示与隐藏

ShowInInspector

可以修饰字段与属性, 将值显示在面板中

但是此特性仅仅实现了对值的显示, 无法保存修改

对于仅有 get 器的属性, 显示在面板中的时候是灰色的

EnableGUI

当仅有 get 器的属性使用 ShowInInspector 修饰后显示在面板中的时候是灰色的, 此时再使用此特性修饰, 显示的属性将不再是灰色的

GUIColor

以指定的颜色来绘制 GUI

可以直接串 3 ~ 4 个数字来控制颜色, 也可以传一个返回值为 Color 的方法名称, 使用 nameof 关键字

HideLabel

可以隐藏界面上的变量名, 只显示变量值

[PropertyOrder(-1)]

用来控制属性在界面上的显示顺序, 数字小的先显示, 允许负数

[PropertySpace(SpaceBefore = 30, SpaceAfter = 30)]

控制一个的属性或者字段的上下空白间距

ReadOnly

EnableGUI 正好相反, 此特性修饰后, 显示将变为灰色, 当仅显示数值而不允许修改的时候使用

Required

当修饰的值为 null 的时候会提示错误信息

可以使用 Required("自定义错误提示信息") 来自定义提示的信息

另外需要显示动态提示的时候可以使用 Required("$变量名") Required("$方法名") 来实现, 但是这里不能使用 nameof, 只能使用名称字符串

Searchable

通过添加特性为字段其添加一个搜索框, 可用于搜索对应的类或其子类的成员, 但目前不可用于字典类型

  • 也可以直接修饰 MonoBehavior 类, 此时会在界面顶部显示一个搜索框

  • 还可以通过实现 ISearchFilterable 接口来自定义搜索规则

    Searchable(FilterOptions = SearchFilterOptions.ISearchFilterableInterface)

  • 但是目前此属性在搜索数字 0 1 2 的时候会有 Bug, 再加上这个界面上很少使用搜索, 因此默认禁用

Title

在字段上方显示标题

可以显示主标题 + 副标题, 默认主标题为加粗 + 分割线

可以使用 bold 参数控制是否是粗体

可以使用 horizontalLine 参数控制是否显示分割线

可以使用 TitleAlignments 参数控制主标题和副标题的对齐方式

TypeFilter

此特性的应用场景是显示的字段是基类型, 并且它还有好几个子类型, 于是编辑器就不知道该序列化哪个了

所以就有了这个筛选类型的特性, 来决定这个字段按照什么类型来序列化

由于筛选函数是自定义的, 因此也可以指定只能选择特定的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public IEnumerable<Type> GetFilteredTypeList()
{
var types = typeof(BaseClass).Assembly.GetTypes()
// 非抽象类 (这里 BaseClass 是 abstract 类)
.Where(type => !type.IsAbstract)
// 非泛型类
.Where(type => !type.IsGenericTypeDefinition)
// 是 BaseClass 的派生类
.Where(type => typeof(BaseClass).IsAssignableFrom(type));

// 按照需求添加指定的类型
types = types.AppendWith(typeof(C1<>).MakeGenericType(typeof(GameObject)));
types = types.AppendWith(typeof(C1<>).MakeGenericType(typeof(AnimationCurve)));
types = types.AppendWith(typeof(C1<>).MakeGenericType(typeof(List<float>)));

return types;
}

TypeInfoBox

用来修饰 MonoBehavior 以及 ScriptableObject, 可以在类型的最上方显示一条信息

ValidateInput

变量输入值验证

  • 传入方法名以及消息内容 [ValidateInput(nameof(IsRight), "输入值不正确!")]
  • 可以通过 InfoMessageType 来控制显示的图标类型

ValueDropdown

用来实现一个下拉框

下拉框所需要的数据 [ MemberName ] 有两种传参方式

  • 传递 数组 或者 链表 int[] Vector3[] List<GameObject> 数组及链表的内容会同时作为下拉框选项的显示文本和选项的实际值
  • 传递 下拉列表 ValueDropdownList<T> 这个类型是一个键值对链表, Key 为 string 类型, Value 为自定义泛型 T, 这种情况下, Key 会作为下拉框的显示文本, Value 则会作为选项的实际值, 一般常用 <string, string><string, int>
参数名 参数类型 参数默认值 参数说明
SortDropdownItems bool false 参数设置为 true 的时候, Key 的显示会按照字母升序来进行排序, false 时不进行排序
DropdownTitle string null 给下拉框设置一个标题
DropdownHeight int 自适应 固定下拉框的高度
DropdownWidth int 自适应 固定下拉框的宽度
FlattenTreeView bool false 是否平铺树形视图, 默认为 false 使用树形视图, 如果设置为 true, 则会使用平铺视图;
树形数据使用 / 来分割层级
DoubleClickToConfirm bool false true: 双击选中选项
一般当数据源为树形结构时使用
HideChildProperties bool false true: 会隐藏掉属性自身的面板绘制
比如 Vector3 类型就没有的自身的 x y z 三个输入框绘制, 只保留一个 (x, y, z) 的下拉框
AppendNextDrawer bool false true: 使用一个子菜单 ︙ 来代替下拉框
此时字段显示的数值为下拉框的值, 而不是显示文本
DisableGUIInAppendedDrawer bool false 配合 AppendNextDrawer 使用
AppendNextDrawer 会导致字段显示的是下拉框的值, 而不是显示文本, 所以可以对值进行修改
DisableGUIInAppendedDrawer 设置为 true 时, 字段显示的值将会是灰色的, 无法修改
ExpandAllMenuItems bool false 设置为 true 之后, 则会默认展开整个树形结构, 否则默认折叠整个树形结构
IsUniqueList bool false 是否是多选列表
设置为 true 时将可以选择多个选项添加到列表, 选择完成后点击 √
ExcludeExistingValuesInList bool false 是否排除已存在的值, false 表示可以重复添加, true 则不允许添加重复值
DisableListAddButtonBehaviour bool false 禁用下拉列表, 以弹窗的形式弹出
DrawDropdownForListElements bool false 是否为列表元素绘制下拉框, 默认绘制
NumberOfItemsBeforeEnablingSearch int 10 当下拉框的选项个数超出指定个数后, 绘制搜索框

AssetList

用于生成一个资源列表, 这个列表用来给修饰的字段赋值, 资源列表的资源来源是 Project 面板中的资源, 并不是 Hierarchy 中的游戏物体

因此这里的字段大多是 Texture, Sprite 等资源类型, 即使是 GameObject 指代的也是预制体而不是场景物体

可以修饰 UnityEngine.Object 类型的 单个字段 或者 数组字段 或者 列表字段

参数1: Path 用于指定资源列表的来源, 不传 Path 则默认为 Assets 目录下的全部资源

参数2: AutoPopulate 是否自动将符合条件的资源添加到修饰的字段中

参数3: CustomFilterMethod 自定义筛选方法, 方法的参数为字段的元素类型

比如字段为 GameObject, 那么筛选方法的参数就是 GameObject 类型 private bool Filter(GameObject obj)

比如字段为 List, 那么筛选方法的参数就是 Sprite 类型 private bool Filter(Sprite sprite)

参数4: LayerNames 根据 Layer 来筛选预制体资源, 由于只有预制体有标签, 所以只能修饰 GameObject 类型

参数5: Tags 根据 Tag 来筛选预制体资源, 可以使用 , 分割多个标签 Tags = "TagA,TagB"

参数6: AssetNamePrefix 根据名称的前缀来筛选资源

AssetSelector

修饰单个字段, 会在字段前显示一个 ︙ 符号, 产生一个资源选择框

修饰列表字段, 会在最右侧产生一个 + 号, 用于选择资源

FlattenTreeView 参数: 控制是否将树形结构平铺, 默认为 false 不平铺

Paths 参数: 限定资源选择的路径, 默认为 Assets 目录下的全部资源

Filter 参数: 筛选器, 字符串类型参数, 字符串规则就是 Unity 的搜索规则 name t:Model l:Water

DropdownTitle 参数: 定义选择框标题

ExpandAllMenuItems 参数: 是否强制展开树形结构

IsUniqueList 参数: 是否可以一次添加多个 false: 一次只能添加一个资源到列表

ExcludeExistingValuesInList 参数: 是否排除已存在列表中的资源 (即使显示已存在的资源, 也不允许选择同一个资源两次)

DrawDropdownForListElements: 是否给列表中的元素绘制下拉框

DisableListAddButtonBehaviour: 以弹窗的方式取代下拉框

ChildGameObjectsOnly

用于限制字段的值只能是子物体或自身上的组件

ColorPalette

修饰一个 Color 字段以及数组列表, 会产生一个调色板选择器, 可以选择不用的调色板, 之后再选择调色板上具有的颜色给 Color 字段赋值

  • PaletteName: 指定调色板名称

    指定名称时, 除了直接写明调色板的名称, 也可以引用变量值

    [ColorPalette("$字符串变量名")]

    还可以使用运算表达式, 比如下方将会引用 "调色板_1", "调色板_2", "调色板_3" 之类的

    [ColorPalette("@"调色板_" + 数字变量")]

  • ShowAlpha: 颜色值显示时是否在下方显示 Alpha 通道状态

DisplayAsString

用于任何属性, 对应的值在检查器中以文本形式显示字符串.

如果属性的值要在检查器中显示字符串, 但不允许进行任何编辑, 则推荐使用此特性

HideLabel

用于任何属性, 隐藏其属性名称, 仅显示属性的值

FilePath FolderPath

用于字符串属性以及字符串的数组和列表, 会显示一个文件夹图标, 用于选择文件给字符串赋值为选择文件的相对路径

ParentFolder: 自定义相对文件夹, 默认为相对 Assets 文件夹

[仅 FilePath] Extensions = "cs, lua": 限定文件的后缀

AbsolutePath: 赋值的时候为绝对路径, 默认是 false, 此时使用的是相对路径

RequireExistingPath: 要求路径必须存在, 不存在时显示错误信息

UseBackslashes: 默认为 false, 此时使用 / 分割目录, 设置为 true, 则使用 \ 分割目录

Toggle

修饰含有 bool 类型变量的结构体或者类

需要一个必填参数: 类或者结构体中 bool 类型的变量的名称

1
2
3
4
5
6
7
8
9
[Toggle(nameof(MyToggleable.enabled))]
public MyToggleable toggler = new MyToggleable();

[Serializable]
public class MyToggleable
{
public bool enabled;
public int myValue;
}