15.EditorGUIUtility搜索框选中提示

15.EditorGUIUtility-搜索框查询对象选中提示


15.1 知识点

搜索框查询

主要作用

弹出一个搜索窗口,用于选择所需资源。

主要API

EditorGUIUtility.ShowObjectPicker<资源类型>(默认被选中的对象, 是否允许查找场景对象, "查找对象名称过滤", 0);

参数:

  1. 默认被选中的对象的引用
  2. 是否允许查找场景对象
  3. 查找对象名称过滤(默认搜索过滤,例如,”normal”表示文件名称中包含”normal”的对象会被搜索到)
  4. controlID,默认写0

获取选择对象

主要API:

EditorGUIUtility.GetObjectPickerObject()

事件相关

弹出的搜索窗口会通过发送事件的形式通知开启它的窗口对象信息的变化。通过Event公共类可以获取其它窗口发送给自己的事件。

Event.current 获取当前事件
commandName 获取事件命令的名字

事件:

  • ObjectSelectorUpdated:对象选择发生变化时发送
  • ObjectSelectorClosed:对象选择窗口关闭时发送
if (Event.current.commandName == "ObjectSelectorUpdated")
{
   // 当选择发生更新时通知进入
}
else if (Event.current.commandName == "ObjectSelectorClosed")
{
   // 当选择窗口关闭时通知进入
}

代码实践

private Texture img3;

private void OnGUI()
{
    // 搜索框查询
    if (GUILayout.Button("打开搜索框查询窗口"))
    {
        EditorGUIUtility.ShowObjectPicker<Texture>(null, true, "head", 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);
    }
}

对象选中提示

EditorGUIUtility.PingObject(想要提示选中的对象);

private void OnGUI()
{
    // 对象选中提示提示
    if(GUILayout.Button("高亮选中对象"))
    {
        if (img3 != null)
            EditorGUIUtility.PingObject(img3);
    }
}

先打开搜索框选择head,点击后可高亮显示选择的head资源



15.2 知识点代码

Lesson15_EditorGUIUtility_搜索框查询对象选中提示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson15_EditorGUIUtility_搜索框查询对象选中提示 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 搜索框查询

        //  主要作用:
        //  弹出一个搜索窗口,用于选择自己想要的资源
        //  主要API:
        //  EditorGUIUtility.ShowObjectPicker<资源类型>(默认被选中的对象, 是否允许查找场景对象, "查找对象名称过滤", 0);
        //  参数1. 默认被选中的对象的引用
        //  参数2. 是否允许查找场景对象
        //  参数3. 查找对象名称过滤(默认搜索过滤 比如这里的normal是指文件名称中有normal的会被搜索到)
        //  参数4. controlID, 默认写0

        //  获取选择对象:
        //  主要API:
        //  EditorGUIUtility.GetObjectPickerObject()

        //  弹出的搜索窗口会通过发送事件的形式
        //  通知开启它的窗口对象信息的变化
        //  通过Event公共类可以获取其它窗口发送给自己的事件
        //  Event.current 获取当前事件
        //  commandName 获取事件命令的名字
        //      ObjectSelectorUpdated 对象选择发生变化时发送
        //      ObjectSelectorClosed 对象选择窗口关闭时发送
        //  if(Event.current.commandName == "ObjectSelectorUpdated")
        //  {
        //    当选择发生更新时通知进入
        //
        //  }
        //  else if (Event.current.commandName == "ObjectSelectorClosed")
        //  {
        //    当选择窗口关闭时通知进入
        //  }

        #endregion

        #region 知识点二 对象选中提示

        //EditorGUIUtility.PingObject(想要提示选中的对象);

        #endregion
    }
}

MyEditorGUIUtilityLearnWindow

using System;
using UnityEditor;
using UnityEngine;

public class MyEditorGUIUtilityLearnWindow : EditorWindow
{
    [MenuItem("编辑器拓展教程/MyEditorGUIUtilityLearnWindow")]
    private static void OpenMyEditorGUIUtilityLearnWindow()
    {
        MyEditorGUIUtilityLearnWindow win =
            EditorWindow.GetWindow<MyEditorGUIUtilityLearnWindow>("EditorGUIUtility学习面板");
        //win.titleContent = new GUIContent("EditorGUIUtility学习面板");
        win.Show();
    }

    #region Lesson14_EditorGUIUtility_资源加载

    private Texture img;
    private Texture img2;

    #endregion

    #region Lesson15_EditorGUIUtility_搜索框查询对象选中提示
    
    private Texture img3;

    #endregion
    
    private void OnGUI()
    {
        #region Lesson14_EditorGUIUtility_资源加载

        //加载资源(如果资源不存在返回null)
        if (GUILayout.Button("加载编辑器图片资源"))
            img = EditorGUIUtility.Load("head.png") as Texture;
        if (img != null)
            GUI.DrawTexture(new Rect(0, 50, 160, 90), img);

        //加载资源(如果资源不存在会直接报错)
        if (GUILayout.Button("加载编辑器图片资源(如果资源不存在会直接报错)"))
            img2 = EditorGUIUtility.LoadRequired("head.png") as Texture;
        if (img2 != null)
            GUI.DrawTexture(new Rect(0, 150, 160, 90), img2);

        #endregion
        
        #region Lesson15_EditorGUIUtility_搜索框查询对象选中提示

        //搜索框查询
        if (GUILayout.Button("打开搜索框查询窗口"))
        {
            EditorGUIUtility.ShowObjectPicker<Texture>(null, true, "head", 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);
        }

        
        //对象选中提示提示
        if (GUILayout.Button("高亮选中对象"))
        {
            if (img3 != null)
                EditorGUIUtility.PingObject(img3);
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏