Odin Inspector 系列教程 — Value Dropdown Attribute

Odin Inspector 系列教程 — Value Dropdown AttributeValueDropdownAttribute特性用于任何属性,并使用可配置选项创建下拉列表。使用此选项可为用户提供一组特定的选项供您选择。也就是创建一些特殊的下拉条这个里面的属性就有点多了,达到了16个!!!下面笔者逐个讲解MemberName,也是唯一一个有参构造函数需要的属性,有两种形式的Drop下拉条,一种是直接数值的,另一种是Key-Value形式的…

大家好,又见面了,我是你们的朋友全栈君。

Value Dropdown Attribute特性用于任何属性,并使用可配置选项创建下拉列表。使用此选项可为用户提供一组特定的选项供您选择。
也就是创建一些特殊的下拉条

这个里面的属性就有点多了,达到了16个!!!
下面笔者逐个讲解

MemberName,也是唯一一个有参构造函数需要的属性,有两种形式的Drop下拉条,一种是直接数值的,另一种是Key-Value形式的
7643202-5133392a301e7482.gif

    /*【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<int>()
    {
      { "Small", 256 },
      { "Medium", 512 },
      { "Large", 1024 },
    };
【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序
7643202-0d2e87e0c595e834.gif

    /*【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序*/
    [PropertySpace(40, 0)]
    [ValueDropdown("SortList1")]
    public int SomeSize3;
    private IEnumerable SortList1 = new ValueDropdownList<int>()
    {
      { "Small", 256 },
      { "Medium", 512 },
      { "Large", 1024 },
       { "A", 128 },
    };
    [PropertySpace(0, 40)]
    [ValueDropdown("SortList2", SortDropdownItems = true)]
    public int SomeSize4;
    private List<ValueDropdownItem<int>> SortList2 = new ValueDropdownList<int>()
    {
      { "Small", 256 },
      { "Medium", 512 },
      { "Large", 1024 },
      { "A", 128 },
    };
【DropdownTitle】给下来条提供一个标题
7643202-9a139d5edd540247.gif

    [PropertySpace(0, 40)]
    [ValueDropdown("TextureSizes", DropdownTitle = "下拉条标题")]
    public int SomeSize5;
【DropdownHeight】下拉条高度
7643202-8d497fb864acf9ad.gif

    /*【DropdownHeight】下拉条高度*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TextureSizes", DropdownHeight = 80)]
    public int SomeSize6;
【DropdownWidth】下拉条的宽度
7643202-94faa27ba6d8709c.gif

    /*【DropdownWidth】下拉条的宽度*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TextureSizes", DropdownWidth = 100)]
    public int SomeSize7;
【FlattenTreeView】是否使用平铺的树形视图
7643202-b8448162f2aff711.gif

    /*【FlattenTreeView】是否使用平铺的树形视图*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TreeViewOfInts", FlattenTreeView = true)]//默认为false,如果设置为true则禁用树形结构使用平铺模式
    public int SomeSize8;
【DoubleClickToConfirm】需要双击才能确地选中的内容
7643202-0522a8c8db841a5e.gif

    /*【DoubleClickToConfirm】需要双击才能确地选中的内容*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TreeViewOfInts", DoubleClickToConfirm = true)]//需要双击才能选中
    public int SomeSize9;
【HideChildProperties】是否隐藏此类型所含有的属性信息
7643202-f9351ae2fc862355.png

    /*【HideChildProperties】是否隐藏此类型所含有的属性信息*/
    [ValueDropdown("RangVector3", HideChildProperties = true)]//
    public Vector3 vector3HideChildProperties;
    [PropertySpace(0, 40)]
    [ValueDropdown("RangVector3", HideChildProperties = false)]//
    public Vector3 vector3ShowChildProperties;

    public IEnumerable<Vector3>  RangVector3()
    {
       return Enumerable.Range(0, 10).Select(i => new Vector3(i, i, i));
    }
【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条
7643202-132b3d1fe697a04a.gif

    /*【AppendNextDrawer】下拉条变成一个小的选择器,代替原有的宽型下拉条*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true)]//
    public int SomeSize11;
【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的
7643202-55796b6570049c75.gif

    /*【DisableGUIInAppendedDrawer】配合AppendNextDrawer使用,显示的数值为灰度状态,达到不可更改数值的目的*/
    [PropertySpace(0, 40)]
    [ValueDropdown("TreeViewOfInts", AppendNextDrawer = true, DisableGUIInAppendedDrawer = true)]//
    public int SomeSize12;
ExpandAllMenuItems】下拉条里面的条目是否全部展开
7643202-01569c004ab367f8.gif

    /*【ExpandAllMenuItems】下拉条里面的条目是否全部展开*/
    [ValueDropdown("TreeViewOfInts" , ExpandAllMenuItems = false)]//
    public int SomeSize13;
    [PropertySpace(0, 40)]
    [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems =true )]//
    public int SomeSize14;
【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加
7643202-c01d00466668a841.gif

    /*【IsUniqueList】在添加的列表Item前面添加勾选框,可以一次性勾选多个Item并添加*/
    [ValueDropdown("GetAllSceneObjects", IsUniqueList = false)]
    public List<GameObject> UniqueGameobjectList0;
    [PropertySpace(0, 40)]
    [ValueDropdown("GetAllSceneObjects", IsUniqueList = true)]
    public List<GameObject> UniqueGameobjectList1;
【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item
7643202-a494380d06e61060.gif

    /*【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item*/
    [ValueDropdown("GetAllSceneObjects")]
    public List<GameObject> UniqueGameobjectList2;
    [PropertySpace(0, 40)]
    [ValueDropdown("GetAllSceneObjects", ExcludeExistingValuesInList = true)]
    public List<GameObject> UniqueGameobjectList3;
【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出
7643202-ce51f8559caf0457.gif

    /*【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出*/
    [PropertySpace(0, 40)]
    [ValueDropdown("GetAllSceneObjects", DisableListAddButtonBehaviour = true, IsUniqueList = true)]
    public List<GameObject> UniqueGameobjectList4;
【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表
7643202-cc3b46a31df970df.gif

    /*【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表*/
    [PropertySpace(0, 40)]
    [ValueDropdown("GetAllSceneObjects", DrawDropdownForListElements = false)]
    public List<GameObject> UniqueGameobjectList5;
``

##### 【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。

![](https://upload-images.jianshu.io/upload_images/7643202-87b2e38d89c171cc.gif?imageMogr2/auto-orient/strip)

```cs
    /*【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。*/
    [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch =200)]
    public List<GameObject> UniqueGameobjectList6;
    [PropertySpace(0, 40)]
    [ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch = 20)]
    public List<GameObject> 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<int>()
{
{ "Small", 256 },
{ "Medium", 512 },
{ "Large", 1024 },
};
/*【SortDropdownItems】默认为false 开启后为下拉列表为根据Key升序排序*/
[PropertySpace(40, 0)]
[ValueDropdown("SortList1")]
public int SomeSize3;
private IEnumerable SortList1 = new ValueDropdownList<int>()
{
{ "Small", 256 },
{ "Medium", 512 },
{ "Large", 1024 },
{ "A", 128 },
};
[PropertySpace(0, 40)]
[ValueDropdown("SortList2", SortDropdownItems = true)]
public int SomeSize4;
private List<ValueDropdownItem<int>> SortList2 = new ValueDropdownList<int>()
{
{ "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 IEnumerable<Vector3>  RangVector3()
{
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<GameObject> UniqueGameobjectList0;
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", IsUniqueList = true)]
public List<GameObject> UniqueGameobjectList1;
/*【ExcludeExistingValuesInList】添加列中不会显示已经选中的Item*/
[ValueDropdown("GetAllSceneObjects")]
public List<GameObject> UniqueGameobjectList2;
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", ExcludeExistingValuesInList = true)]
public List<GameObject> UniqueGameobjectList3;
/*【DisableListAddButtonBehaviour】禁用下拉列表,以弹窗的形式弹出*/
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", DisableListAddButtonBehaviour = true, IsUniqueList = true)]
public List<GameObject> UniqueGameobjectList4;
/*【DrawDropdownForListElements】已经添加的Item不会再出现Item下拉表*/
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", DrawDropdownForListElements = false)]
public List<GameObject> UniqueGameobjectList5;
/*【NumberOfItemsBeforeEnablingSearch】查过指定数量的Item则出现搜索框。默认是10。*/
[ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch =200)]
public List<GameObject> UniqueGameobjectList6;
[PropertySpace(0, 40)]
[ValueDropdown("GetAllSceneObjects", NumberOfItemsBeforeEnablingSearch = 20)]
public List<GameObject> UniqueGameobjectList7;
[ValueDropdown("GetListOfMonoBehaviours", AppendNextDrawer = true, HideChildProperties = false)]
public MonoBehaviour SomeMonoBehaviour;
private IEnumerable<MonoBehaviour> GetListOfMonoBehaviours()
{
return GameObject.FindObjectsOfType<MonoBehaviour>();
}
[ValueDropdown("KeyCodes")]
public KeyCode FilteredEnum;
private static IEnumerable<KeyCode> KeyCodes = Enumerable.Range((int)KeyCode.Alpha0, 10).Cast<KeyCode>();
[ValueDropdown("TreeViewOfInts", ExpandAllMenuItems = true)]
public List<int> IntTreeview = new List<int>() { 1, 2, 7 };
/// <summary>
/// 以“/”符号作为类别分隔符
/// </summary>
private IEnumerable TreeViewOfInts = new ValueDropdownList<int>()
{
{ "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 },
};
/// <summary>
/// IsUniqueList为true 每个Item上面有一个勾选框
/// </summary>
[ValueDropdown("GetAllSceneObjects", IsUniqueList = true, HideChildProperties = false)]
public List<GameObject> UniqueGameobjectList;
private static IEnumerable GetAllSceneObjects()
{
Func<Transform, string> getPath = null;
getPath = x => (x ? getPath(x.parent) + "/" + x.gameObject.name : "");//三元运算符 其中X为Transform
return GameObject.FindObjectsOfType<GameObject>().Select(x => new ValueDropdownItem(getPath(x.transform), x));
}
/// <summary>
/// ExcludeExistingValuesInList 为 ture则选中的item不在出现在等待选择的列下拉表中
/// DrawDropdownForListElements 为 true  每个item都有一个下拉列表
/// </summary>
[ValueDropdown("GetAllSceneObjects", IsUniqueList = false, DropdownTitle = "Select Scene Object", DrawDropdownForListElements = false, ExcludeExistingValuesInList = true)]
public List<GameObject> 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<ScriptableObject>(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<UnityEngine.Object>(root + x)));
}
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162783.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql行转列(拆分字符串场景)

    mysql行转列(拆分字符串场景)一对多没有建立中间表的时候经常会采用分隔符的形式将“多”存储在“一”的一个字段里,这样做的代价是无法向一对多的时候那样直接关联查询,一般采用在程序中分割后分别查询的办法

  • javachar转int_c中int转char

    javachar转int_c中int转charchar类型的数据转换成int类型的数字。本能反应是这么写的。publicstaticvoidmain(String[]args){charc=’1′;//本能反应是这么写的。inti=c;//或者这么写inti1=(int)c;System.out….

  • Java输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。[通俗易懂]

    Java输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。[通俗易懂]输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。有啥不懂就私信我classfive{publicstaticvoidmain(String[]args){//创建数组int[]a={6,4,2,1,5,9,3,31,45};//假设第一个数位最大数intsum=a[0];//假设第一位数为最小数intsum2=a[0];/

  • 波特尔暗空分类法_老暗锁打不开了怎么办

    波特尔暗空分类法_老暗锁打不开了怎么办传说中的暗之连锁被人们称为 Dark。Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。经过研究,你发现 Dark 呈现无向图的结构,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M 条附加边。你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark

  • pycharm好用的主题_pycharm关联python

    pycharm好用的主题_pycharm关联python所谓工欲善其事,必先利其器;在我们日常开发中,长时间编码从眼睛上心里承受压力上有个好的视觉感觉是很加分的以下是我个人十分喜欢的pycharm主题风格,包含整体风格/字体/背景颜色/背景图片;其设置如下:01主题:pycharm的File->Settings->Plugins,搜索MaterialThemeUI并安装,安装之后进行restart02字体:File…

  • 流量分析入门

    流量分析入门前言个人一直对流量分析…正好看到了一些相关书籍资料,自己向前辈师傅们学习以后整理一些资料来总结一下互联网五层模型在计算机网络这门课中介绍了OSI模型及互联网五层模型:在我们使用抓包软件进行流量分析的时候,抓到的包往往含有数据链路层、网络层、传输层,应用层四个部分,其中一部分在传递到不同层面的时候会被丢弃。我们的wireshark抓的包工作在数据链路层,而burpsuite抓的http包则工作在应用层wireshark的用法打开wireshark,可以看到这是我们的一些接口,我现在用的是Wif

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号