Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute
【Odin|Odin Inspector 系列教程 --- Value Dropdown Attribute】Value Dropdown Attribute特性用于任何属性,并使用可配置选项创建下拉列表。使用此选项可为用户提供一组特定的选项供您选择。
也就是创建一些特殊的下拉条
这个里面的属性就有点多了,达到了16个!!!MemberName,也是唯一一个有参构造函数需要的属性,有两种形式的Drop下拉条,一种是直接数值的,另一种是Key-Value形式的
下面笔者逐个讲解
文章图片
/*【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升序排序
文章图片
/*【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】下拉条高度
文章图片
/*【DropdownHeight】下拉条高度*/
[PropertySpace(0, 40)]
[ValueDropdown("TextureSizes", DropdownHeight = 80)]
public int SomeSize6;
【DropdownWidth】下拉条的宽度
文章图片
/*【DropdownWidth】下拉条的宽度*/
[PropertySpace(0, 40)]
[ValueDropdown("TextureSizes", DropdownWidth = 100)]
public int SomeSize7;
【FlattenTreeView】是否使用平铺的树形视图
文章图片
/*【FlattenTreeView】是否使用平铺的树形视图*/
[PropertySpace(0, 40)]
[ValueDropdown("TreeViewOfInts", FlattenTreeView = true)]//默认为false,如果设置为true则禁用树形结构使用平铺模式
public int SomeSize8;
【DoubleClickToConfirm】需要双击才能确地选中的内容
文章图片
/*【DoubleClickToConfirm】需要双击才能确地选中的内容*/
[PropertySpace(0, 40)]
[ValueDropdown("TreeViewOfInts", DoubleClickToConfirm = true)]//需要双击才能选中
public int SomeSize9;
【HideChildProperties】是否隐藏此类型所含有的属性信息
文章图片
/*【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】下拉条变成一个小的选择器,代替原有的宽型下拉条
文章图片
/*【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条*/
[PropertySpace(0, 40)]
[ValueDropdown("TreeViewOfInts", AppendNextDrawer = true)]//
public int SomeSize11;
【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的
文章图片
/*【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的*/
[PropertySpace(0, 40)]
[ValueDropdown("TreeViewOfInts", AppendNextDrawer = true, DisableGUIInAppendedDrawer = true)]//
public int SomeSize12;
【ExpandAllMenuItems】下拉条里面的条目是否全部展开
文章图片
/*【ExpandAllMenuItems】下拉条里面的条目是否全部展开*/
[ValueDropdown("TreeViewOfInts" , ExpandAllMenuItems = false)]//
public int SomeSize13;
[PropertySpace(0, 40)]
[ValueDropdown("TreeViewOfInts", ExpandAllMenuItems =true )]//
public int SomeSize14;
【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加
文章图片
/*【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加*/
[ValueDropdown("GetAllSceneObjects", IsUniqueList = false)]
public List UniqueGameobjectList0;
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", IsUniqueList = true)]
public List UniqueGameobjectList1;
【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item
文章图片
/*【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item*/
[ValueDropdown("GetAllSceneObjects")]
public List UniqueGameobjectList2;
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", ExcludeExistingValuesInList = true)]
public List UniqueGameobjectList3;
【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出
文章图片
/*【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出*/
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", DisableListAddButtonBehaviour = true, IsUniqueList = true)]
public List UniqueGameobjectList4;
【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表
文章图片
/*【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表*/
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", DrawDropdownForListElements = false)]
public List UniqueGameobjectList5;
【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。
文章图片
/*【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 系列教程
推荐阅读
- 【欢喜是你·三宅系列①】⑶
- 你不可不知的真相系列之科学
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 2018-06-13金句系列7(金句结构-改编古现代诗词)
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- 乡野村趣系列之烧仙草
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- 【年终激励系列】之五(年终奖如何与考核紧密相连)
- 剥削劳动力系列(企业家剥削你时,他要付出巨大的代价)