Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute

【Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute】Value Dropdown Attribute特性用于任何属性,并使用可配置选项创建下拉列表。使用此选项可为用户提供一组特定的选项供您选择。
也就是创建一些特殊的下拉条
这个里面的属性就有点多了,达到了16个!!!
下面笔者逐个讲解
MemberName,也是唯一一个有参构造函数需要的属性,有两种形式的Drop下拉条,一种是直接数值的,另一种是Key-Value形式的 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【MemberName】*/ [PropertySpace(40, 0)] [ValueDropdown("TextureSizes")] public int SomeSize1; private static int[] TextureSizes = new int[] { 32, 64, 128, 256, 512, 1024, 2048, 4096 }; [ValueDropdown("FriendlyTextureSizes")] public int SomeSize2; private static IEnumerable FriendlyTextureSizes = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, };

【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序*/ [PropertySpace(40, 0)] [ValueDropdown("SortList1")] public int SomeSize3; private IEnumerable SortList1 = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, { "A", 128 }, }; [PropertySpace(0, 40)] [ValueDropdown("SortList2", SortDropdownItems = true)] public int SomeSize4; private List> SortList2 = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, { "A", 128 }, };

【DropdownTitle】给下来条提供一个标题 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
[PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownTitle = "下拉条标题")] public int SomeSize5;

【DropdownHeight】下拉条高度 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DropdownHeight】下拉条高度*/ [PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownHeight = 80)] public int SomeSize6;

【DropdownWidth】下拉条的宽度 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DropdownWidth】下拉条的宽度*/ [PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownWidth = 100)] public int SomeSize7;

【FlattenTreeView】是否使用平铺的树形视图 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【FlattenTreeView】是否使用平铺的树形视图*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", FlattenTreeView = true)]//默认为false,如果设置为true则禁用树形结构使用平铺模式 public int SomeSize8;

【DoubleClickToConfirm】需要双击才能确地选中的内容 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DoubleClickToConfirm】需要双击才能确地选中的内容*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", DoubleClickToConfirm = true)]//需要双击才能选中 public int SomeSize9;

【HideChildProperties】是否隐藏此类型所含有的属性信息 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【HideChildProperties】是否隐藏此类型所含有的属性信息*/ [ValueDropdown("RangVector3", HideChildProperties = true)]// public Vector3 vector3HideChildProperties; [PropertySpace(0, 40)] [ValueDropdown("RangVector3", HideChildProperties = false)]// public Vector3 vector3ShowChildProperties; public IEnumerableRangVector3() { return Enumerable.Range(0, 10).Select(i => new Vector3(i, i, i)); }

【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true)]// public int SomeSize11;

【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true, DisableGUIInAppendedDrawer = true)]// public int SomeSize12;

【ExpandAllMenuItems】下拉条里面的条目是否全部展开 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【ExpandAllMenuItems】下拉条里面的条目是否全部展开*/ [ValueDropdown("TreeViewOfInts" , ExpandAllMenuItems = false)]// public int SomeSize13; [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems =true )]// public int SomeSize14;

【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加*/ [ValueDropdown("GetAllSceneObjects", IsUniqueList = false)] public List UniqueGameobjectList0; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", IsUniqueList = true)] public List UniqueGameobjectList1;

【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item*/ [ValueDropdown("GetAllSceneObjects")] public List UniqueGameobjectList2; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", ExcludeExistingValuesInList = true)] public List UniqueGameobjectList3;

【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出*/ [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", DisableListAddButtonBehaviour = true, IsUniqueList = true)] public List UniqueGameobjectList4;

【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表*/ [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", DrawDropdownForListElements = false)] public List UniqueGameobjectList5;

【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。 Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
文章图片
/*【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。*/ [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch =200)] public List UniqueGameobjectList6; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch = 20)] public List UniqueGameobjectList7;

示例完整代码(含有一些其他辅助性功能代码)
using Sirenix.OdinInspector; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class ValueDropdownAttributeExample : MonoBehaviour {/*【MemberName】*/ [PropertySpace(40, 0)] [ValueDropdown("TextureSizes")] public int SomeSize1; private static int[] TextureSizes = new int[] { 32, 64, 128, 256, 512, 1024, 2048, 4096 }; [ValueDropdown("FriendlyTextureSizes")] public int SomeSize2; private static IEnumerable FriendlyTextureSizes = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, }; /*【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序*/ [PropertySpace(40, 0)] [ValueDropdown("SortList1")] public int SomeSize3; private IEnumerable SortList1 = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, { "A", 128 }, }; [PropertySpace(0, 40)] [ValueDropdown("SortList2", SortDropdownItems = true)] public int SomeSize4; private List> SortList2 = new ValueDropdownList() { { "Small", 256 }, { "Medium", 512 }, { "Large", 1024 }, { "A", 128 }, }; /*【DropdownTitle】给下来条提供一个标题*/ [PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownTitle = "下拉条标题")] public int SomeSize5; /*【DropdownHeight】下拉条高度*/ [PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownHeight = 80)] public int SomeSize6; /*【DropdownWidth】下拉条的宽度*/ [PropertySpace(0, 40)] [ValueDropdown("TextureSizes", DropdownWidth = 100)] public int SomeSize7; /*【FlattenTreeView】是否使用平铺的树形视图*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", FlattenTreeView = true)]//默认为false,如果设置为true则禁用树形结构使用平铺模式 public int SomeSize8; /*【DoubleClickToConfirm】需要双击才能确地选中的内容*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", DoubleClickToConfirm = true)]//需要双击才能选中 public int SomeSize9; /*【HideChildProperties】是否隐藏此类型所含有的属性信息*/ [ValueDropdown("RangVector3", HideChildProperties = true)]// public Vector3 vector3HideChildProperties; [PropertySpace(0, 40)] [ValueDropdown("RangVector3", HideChildProperties = false)]// public Vector3 vector3ShowChildProperties; public IEnumerableRangVector3() { return Enumerable.Range(0, 10).Select(i => new Vector3(i, i, i)); }/*【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true)]// public int SomeSize11; /*【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的*/ [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true, DisableGUIInAppendedDrawer = true)]// public int SomeSize12; /*【ExpandAllMenuItems】下拉条里面的条目是否全部展开*/ [ValueDropdown("TreeViewOfInts" , ExpandAllMenuItems = false)]// public int SomeSize13; [PropertySpace(0, 40)] [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems =true )]// public int SomeSize14; /*【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加*/ [ValueDropdown("GetAllSceneObjects", IsUniqueList = false)] public List UniqueGameobjectList0; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", IsUniqueList = true)] public List UniqueGameobjectList1; /*【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item*/ [ValueDropdown("GetAllSceneObjects")] public List UniqueGameobjectList2; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", ExcludeExistingValuesInList = true)] public List UniqueGameobjectList3; /*【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出*/ [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", DisableListAddButtonBehaviour = true, IsUniqueList = true)] public List UniqueGameobjectList4; /*【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表*/ [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", DrawDropdownForListElements = false)] public List UniqueGameobjectList5; /*【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。*/ [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch =200)] public List UniqueGameobjectList6; [PropertySpace(0, 40)] [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch = 20)] public List UniqueGameobjectList7; [ValueDropdown("GetListOfMonoBehaviours", AppendNextDrawer = true, HideChildProperties = false)] public MonoBehaviour SomeMonoBehaviour; private IEnumerable GetListOfMonoBehaviours() { return GameObject.FindObjectsOfType(); }[ValueDropdown("KeyCodes")] public KeyCode FilteredEnum; private static IEnumerable KeyCodes = Enumerable.Range((int)KeyCode.Alpha0, 10).Cast(); [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems = true)] public List IntTreeview = new List() { 1, 2, 7 }; /// /// 以“/”符号作为类别分隔符 /// private IEnumerable TreeViewOfInts = new ValueDropdownList() { { "Node 1/Node 1.1", 1 }, { "Node 1/Node 1.2", 2 }, { "Node 2/Node 2.1", 3 }, { "Node 3/Node 3.1", 4 }, { "Node 3/Node 3.2", 5 }, { "Node 1/Node 3.1/Node 3.1.1", 6 }, { "Node 1/Node 3.1/Node 3.1.2", 7 }, { "Node 1", -1 }, { "Node 2", -2 }, { "Node 3", -3 }, { "Node 4", -4 }, }; /// /// IsUniqueList为true 每个Item上面有一个勾选框 /// [ValueDropdown("GetAllSceneObjects", IsUniqueList = true, HideChildProperties = false)] public List UniqueGameobjectList; private static IEnumerable GetAllSceneObjects() { Func getPath = null; getPath = x => (x ? getPath(x.parent) + "/" + x.gameObject.name : ""); //三元运算符 其中X为Transform return GameObject.FindObjectsOfType().Select(x => new ValueDropdownItem(getPath(x.transform), x)); }/// /// ExcludeExistingValuesInList 为 ture则选中的item不在出现在等待选择的列下拉表中 /// DrawDropdownForListElements 为 true每个item都有一个下拉列表 /// [ValueDropdown("GetAllSceneObjects", IsUniqueList = false, DropdownTitle = "Select Scene Object", DrawDropdownForListElements = false, ExcludeExistingValuesInList = true)] public List UniqueGameobjectListMode2; private static IEnumerable GetAllScriptableObjects() { return UnityEditor.AssetDatabase.FindAssets("t:ScriptableObject") .Select(x => UnityEditor.AssetDatabase.GUIDToAssetPath(x)) .Select(x => new ValueDropdownItem(x, UnityEditor.AssetDatabase.LoadAssetAtPath(x))); }private static IEnumerable GetAllSirenixAssets() { var root = "Assets/Plugins/Sirenix/"; return UnityEditor.AssetDatabase.GetAllAssetPaths() .Where(x => x.StartsWith(root)) .Select(x => x.Substring(root.Length)) .Select(x => new ValueDropdownItem(x, UnityEditor.AssetDatabase.LoadAssetAtPath(root + x))); } }

更多教程内容详见:革命性Unity 编辑器扩展工具 --- Odin Inspector 系列教程

    推荐阅读