Unity3d 带有搜索功能的Unity GUI组合框

Unity3d 带有搜索功能的Unity GUI组合框,unity3d,Unity3d,我需要一个列表,这是一个列表很多(枚举列表)。现在列表使用的是弹出框(组合框),但是普通的组合框并没有真正的帮助,因为里面有太多的项目。当尝试选择远离底部的项目时,会有点沮丧。打开时,屏幕上的列表已满 当打开一个组合框并键入一个字母时,它将只跳转第一个字母,当我按下第二个字母时,列表将跳转到另一个第一个字母开始。例如,我想选择DIAMOND->我按D键,它将进入带有D start的列表。当我按下I时,它将跳转到以I而不是DI开头的项目 有没有GUI组件可以进行搜索?Unity没有像您这样的用于

我需要一个列表,这是一个列表很多(枚举列表)。现在列表使用的是弹出框(组合框),但是普通的组合框并没有真正的帮助,因为里面有太多的项目。当尝试选择远离底部的项目时,会有点沮丧。打开时,屏幕上的列表已满

当打开一个组合框并键入一个字母时,它将只跳转第一个字母,当我按下第二个字母时,列表将跳转到另一个第一个字母开始。例如,我想选择DIAMOND->我按D键,它将进入带有D start的列表。当我按下I时,它将跳转到以I而不是DI开头的项目


有没有GUI组件可以进行搜索?

Unity没有像您这样的用于搜索的组件

但您可以尝试以下操作(
SearchEnumLabel
函数):

使用系统;
利用制度全球化;
使用System.Linq;
使用UnityEditor;
公共枚举状态
{
ABCDEF,
ACBDEF,
AdEXG,
贝尔达
}
[CustomEditor(typeof(ObjectControllerTester))]
[CaneditMultipleObject]
公共类ObjectControllerTestEditor:编辑器
{
选定的国家;
InspectorGUI()上的公共覆盖无效
{
_selected=SearchEnumLabel(“我的搜索枚举”,选中);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField(“[Debug]当前选中:”+_选中);
}
私有字符串_searchEnumText=“”;
private bool_IsSearchEnumLabelSearch=假;
私有T SearchEnumLabel(字符串标签,T状态),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
{
LabelField(“T必须是枚举类型”);
返回状态;
}
var states=Enum.GetValues(typeof(T)).Cast().Select(o=>o.ToString()).ToArray();
if(string.IsNullOrEmpty(_searchEnumText)&&states.Length>0)_searchEnumText=state.ToString(CultureInfo.InvariantCulture);
var text=EditorGUILayout.TextField(标签,_searchEnumText);
如果(文本!=_searchEnumText ||_IsSearchEnumLabelSearch)
{
_searchEnumText=文本;
var mach=states.Select((v,i)=>new{value=v,index=i}).FirstOrDefault(a=>a.value.ToLower().StartsWith(text.ToLower());
var targetState=状态;
如果(马赫!=null)targetState=(T)Enum.GetValues(typeof(T)).GetValue(马赫索引);
EditorGUILayout.LabelField(“选择最近的:+targetState”);
重新油漆();
状态=目标状态;
_IsSearchEnumLabelSearch=!string.Equals(_searchEnumText,targetState.ToString(CultureInfo.InvariantCulture),StringComparison.CurrentCultureInoRecase);
}
返回状态;
}
}
此脚本将显示如下内容:

默认视图

输入一些数据后

==更新===

带有快速选择按钮的更复杂变体

使用系统;
利用制度全球化;
使用System.Linq;
使用UnityEditor;
使用UnityEngine;
公共枚举状态
{
ABCDEF,
ACBDEF,
AdEXG,
贝尔达,
sEOjsfl,
斯迪亚索,
POsdjaow,
PSADJsd,
美洲国家组织,
伊克温兹
}
[CustomEditor(typeof(ObjectControllerTester))]
[CaneditMultipleObject]
公共类ObjectControllerTestEditor:编辑器
{
选定的国家;
公共覆盖无效OnInspectorGUI()
{
_selected=SearchEnumLabel(“我的搜索枚举”,选中);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField(“[Debug]当前选中:”+_选中);
}
私有字符串_searchEnumText=“”;
private bool_IsSearchEnumLabelSearch=假;
私有T SearchEnumLabel(字符串标签,T状态),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
{
LabelField(“T必须是枚举类型”);
返回状态;
}
var states=Enum.GetValues(typeof(T)).Cast().Select(o=>o.ToString()).ToArray();
if(string.IsNullOrEmpty(_searchEnumText)&&states.Length>0)_searchEnumText=state.ToString(CultureInfo.InvariantCulture);
var text=EditorGUILayout.TextField(标签,_searchEnumText);
如果(文本!=_searchEnumText ||_IsSearchEnumLabelSearch)
{
_searchEnumText=文本;
var mach=states.Select((v,i)=>new{value=v,index=i})。其中(a=>a.value.ToLower().StartsWith(text.ToLower()).ToList();
var targetState=状态;
if(马赫数Any())
{
//许多结果
targetState=(T)Enum.GetValues(typeof(T)).GetValue(马赫[0]。索引);
EditorGUILayout.LabelField(“选择关闭:+targetState”);
重新油漆();
var selected=GUILayout.SelectionGrid(-1,马赫数Select(v=>v.value.ToArray(),4);
如果(已选择!=-1)
{
targetState=(T)Enum.GetValues(typeof(T)).GetValue(马赫[selected].index);
_searchEnumText=targetState.ToString(CultureInfo.InvariantCulture);
_isSearchEnumLabelInSearch=false;
GUI.FocusControl(“FocusAway”);
重新油漆();
}
}
状态=目标状态;
_IsSearchEnumLabelSearch=!string.Equals(_searchEnumText,targetState.ToString(CultureInfo.InvariantCulture),StringComparison.CurrentCultureInoRecase);
}
返回状态;
}
}
点击按钮选择目标枚举
Unity没有像您这样的搜索组件

但您可以尝试以下操作(
SearchEnumLabel
函数):

使用系统;
利用制度全球化;
使用System.Linq;
使用UnityEditor;
公共枚举状态
{
ABCDEF,
ACBDEF,