UEDL4-2——搜索框查询、对象选中提示

本章代码关键字

1
2
3
4
5
6
EditorGUIUtility.ShowObjectPicker<>()        //执行该方法会弹出一个搜索特定对象的窗口,用于选择自己想要的资源
EditorGUIUtility.GetObjectPickerObject() //它可以获取搜索框窗口上选择的对象,需要配合Event事件类相关内容来在正确的时机调用
Event.current.commandName //获取当前事件命令的名字,可以通过这里的名字与特定事件名比较来确认当前为何种事件
"ObjectSelectorUpdated" //对象选择窗口的对象选择发生变化时发送的事件命令的名字
"ObjectSelectorClosed" //对象选择窗口关闭时发送的事件命令的名字
EditorGUIUtility.PingObject() //高亮显示Unity的Object变量关联的对象

搜索框查询

主要作用:弹出一个搜索窗口,用于选择自己想要的资源
主要API:EditorGUIUtility.ShowObjectPicker<资源类型>(默认被选中的对象, 是否允许查找场景对象, "查找对象名称过滤", 0);

  • 参数一:默认被选中的对象的引用
  • 参数二:是否允许查找场景对象
  • 参数三:查找对象名称过滤(比如,如果这里填入normal​,则文件名称中有normal​的会被搜索到)
  • 参数四:controlID​, 默认写0
1
2
3
4
5
6
7
8
9
10
11
private void OnGUI()
{
if (GUILayout.Button("打开搜索框查询窗口"))
{
EditorGUIUtility.ShowObjectPicker<Texture>(null, true, "", 0);
}
if (GUILayout.Button("打开搜索框查询窗口,限制Editor"))
{
EditorGUIUtility.ShowObjectPicker<Texture>(null, false, "Editor", 0);
}
}

显示效果:imageimage

在弹出的搜索框里选择了某个对象后,还需要配合下面的函数来获取对象

获取选择对象

主要API:EditorGUIUtility.GetObjectPickerObject()

该方法会直接获取搜索框窗口上选择的对象,但是我们需要在正确的时机调用它(例如点击了某个对象,关闭窗口时调用)

弹出的搜索窗口会通过发送事件的形式,通知开启它的窗口对象信息的变化
通过Event​公共类可以获取其它窗口发送给自己的事件,会用到的Event​公共类相关内容如下:

  • Event.current​ 获取当前事件

    • Event.current.commandName​ 获取当前事件命令的名字,可以通过这里的名字与特定事件名比较来确认当前为何种事件

    • 获取选择对象会用到的特定事件名:

      • "ObjectSelectorUpdated"​ 对象选择发生变化时发送的事件命令的名字

        1
        2
        3
        4
        5
        if (Event.current.commandName == "ObjectSelectorUpdated")
        {
        //当搜索框窗口选择更新时进入这段代码块
        Texture img = EditorGUIUtility.GetObjectPickerObject() as Texture;
        }
      • "ObjectSelectorClosed"​ 对象选择窗口关闭时发送的事件命令的名字

        1
        2
        3
        4
        5
        if (Event.current.commandName == `"ObjectSelectorClosed"`)
        {
        //当搜索框窗口关闭时进入这段代码块
        Texture img = EditorGUIUtility.GetObjectPickerObject() as Texture;
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private Texture img3;

private void OnGUI()
{
if (GUILayout.Button("打开搜索框查询窗口"))
{
EditorGUIUtility.ShowObjectPicker<Texture>(null, true, "", 0);
}
if (GUILayout.Button("打开搜索框查询窗口,限制Editor"))
{
EditorGUIUtility.ShowObjectPicker<Texture>(null, false, "Editor", 0);
}
//当搜索框窗口选择更新时进入这段代码块
if (Event.current.commandName == "ObjectSelectorUpdated")
{
img3 = EditorGUIUtility.GetObjectPickerObject() as Texture;
if (img3 != null)
Debug.Log($"窗口选择更新:{img3.name}");
}
//当搜索框窗口关闭时进入这段代码块
else if (Event.current.commandName == "ObjectSelectorClosed")
{
img3 = EditorGUIUtility.GetObjectPickerObject() as Texture;
if (img3 != null)
Debug.Log($"窗口选择关闭:{img3.name}");
}
}

显示效果(当点击弹出的搜索框内容时):
image

显示效果(当关闭搜索框时):
image

对象选择提示

EditorGUIUtility.PingObject()​ 方法可以在编辑器上(如Project窗口等)高亮显示Unity的Object变量关联的资源,传入要显示资源高亮的即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private Texture img3;

private void OnGUI()
{
if (GUILayout.Button("打开搜索框查询窗口"))
{
EditorGUIUtility.ShowObjectPicker<Texture>(null, true, "", 0);
}
img3 = EditorGUILayout.ObjectField("选择贴图", img3, typeof(Texture), false) as Texture;
if (GUILayout.Button("高亮选中对象"))
{
if (img3 != null)
EditorGUIUtility.PingObject(img3);
}
}

显示效果:

  • 选择一个资源(点击的上边的“打开搜索框查询窗口”选择的对象)
    image

  • 点击显示高亮(可能会失灵,原因不明,不能连按,需要等一会才能按)

    image