21.Selection常用静态方法

21.Selection-常用静态方法


21.1 知识点

判断某个对象是否被选中

Contains 判断某个对象是否被选中(多选中存在也算)

private Object obj;

private void OnGUI()
{
    // 判断某个对象是否被选中
    obj = EditorGUILayout.ObjectField("用于判断是否被选中的对象", obj, typeof(GameObject), true);

    if(GUILayout.Button("判断对象是否被选中"))
    {
        if (Selection.Contains(obj))
            Debug.Log("对象有被选中");
        else
            Debug.Log("对象没有被选中");
    }
}



筛选对象

从当前选择对象中,筛选出想要的内容
Selection.GetFiltered(类型, 筛选模式)
Selection.GetFiltered<类型>(筛选模式)

筛选模式:SelectionMode
Unfiltered: 不过滤
TopLevel: 只获取最上层对象,子对象不获取
Deep: 父对象、子对象都获取
ExcludePrefab: 排除预设体
Editable: 只选择可编辑的对象
OnlyUserModifiable: 仅用户可修改的内容
Assets: 只返回资源文件夹下的内容
DeepAssets: 如果存在子文件夹,其中的内容也获取
如果要混用 位或 | 即可

private void OnGUI()
{
    // 筛选对象
    if(GUILayout.Button("筛选所有对象"))
    {
        Object[] objs = Selection.GetFiltered<Object>(SelectionMode.Assets | SelectionMode.DeepAssets);
        // Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets | SelectionMode.DeepAssets);
        for (int i = 0; i < objs.Length; i++)
        {
            Debug.Log(objs[i].name);
        }
    }
}

当选中变化时会调用的委托

Selection.selectionChanged += 函数;//选择的物体变化时调用

private void SelectionChanged()
{
    Debug.Log("选择的对象变化了");
}
private void OnEnable()
{
    Selection.selectionChanged += SelectionChanged;
}

private void OnDestroy()
{
    Selection.selectionChanged -= SelectionChanged;
}

总结

Selection公共类主要是帮助我们获取到选择的对象的,我们可以利用它对选中对象进行一些处理。

Selection公共类更多API:
Unity Documentation


21.2 知识点代码

Lesson21_Selection_常用静态方法

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

public class Lesson21_Selection_常用静态方法 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 判断某个对象是否被选中

        //Contains 判断某个对象是否被选中

        #endregion

        #region 知识点二 筛选对象

        //从当前选择对象中,筛选出想要的内容
        //Selection.GetFiltered(类型, 筛选模式)
        //Selection.GetFiltered<类型>(筛选模式)

        //  筛选模式:SelectionMode
        //  Unfiltered: 不过滤
        //  TopLevel: 只获取最上层对象,子对象不获取
        //  Deep: 父对象、子对象都获取
        //  ExcludePrefab: 排除预设体
        //  Editable: 只选择可编辑的对象
        //  OnlyUserModifiable: 仅用户可修改的内容
        //  Assets: 只返回资源文件夹下的内容
        //  DeepAssets: 如果存在子文件夹,其中的内容也获取
        //  如果要混用 位或 | 即可

        #endregion

        #region 知识点三 当选中变化时会调用的委托

        //Selection.selectionChanged += 函数;//选择的物体变化时调用

        #endregion

        #region 总结

        //Selection公共类主要是帮助我们获取到选择的对象的
        //我们可以利用它对选中对象进行一些处理

        //Selection公共类 更多API
        //https://docs.unity.cn/cn/2022.1/ScriptReference/Selection.html

        #endregion
    }
}

MySelectionLearnWindow

using System.Text;
using UnityEditor;
using UnityEngine;

public class MySelectionLearnWindow : EditorWindow
{
    [MenuItem("编辑器拓展教程/MySelectionLearnWindow")]
    private static void OpenMySelectionLearnWindow()
    {
        MySelectionLearnWindow win = EditorWindow.GetWindow<MySelectionLearnWindow>("Selection学习窗口");
        win.Show();
    }

    #region Lesson20_Selection_常用静态成员

    private StringBuilder str = new StringBuilder("没有选择");
    private StringBuilder str2 = new StringBuilder("没有选择");
    private StringBuilder str3 = new StringBuilder("没有选择");
    private StringBuilder str4 = new StringBuilder("没有选择");

    #endregion

    #region Lesson21_Selection_常用静态方法

    private Object obj;

    private void SelectionChanged()
    {
        Debug.Log("选择的对象变化了");
    }

    private void OnEnable()
    {
        Selection.selectionChanged += SelectionChanged;
    }

    private void OnDestroy()
    {
        Selection.selectionChanged -= SelectionChanged;
    }

    #endregion

    private void OnGUI()
    {
        #region Lesson20_Selection_常用静态成员

        //1.当前选择的Object
        if (GUILayout.Button("获取当前选择的Object的名字"))
        {
            if (Selection.activeObject != null)
            {
                str.Clear();
                str.Append(Selection.activeObject.name);

                if (Selection.activeObject is GameObject)
                    Debug.Log("它是游戏对象");
                else if (Selection.activeObject is Texture)
                    Debug.Log("它是一张纹理");
                else if (Selection.activeObject is TextAsset)
                    Debug.Log("它是一个文本");
                else
                    Debug.Log("它是其他类型的资源");
            }
            else
            {
                str.Clear();
                str.Append("没有选择");
            }
        }

        EditorGUILayout.LabelField("当前选择的对象", str.ToString());


        //2.当前选择的GameObject
        if (GUILayout.Button("获取当前选择的GameObject的名字"))
        {
            if (Selection.activeGameObject != null)
            {
                str2.Clear();
                str2.Append(Selection.activeGameObject.name);
            }
            else
            {
                str2.Clear();
                str2.Append("没有选择");
            }
        }

        EditorGUILayout.LabelField("当前选择GameObject对象", str2.ToString());

        //3.当前选择的Transform
        if (GUILayout.Button("获取当前选择的Transform的名字"))
        {
            if (Selection.activeTransform != null)
            {
                str3.Clear();
                str3.Append(Selection.activeTransform.name);
                Selection.activeTransform.position = new Vector3(10, 10, 10);
            }
            else
            {
                str3.Clear();
                str3.Append("没有选择");
            }
        }

        EditorGUILayout.LabelField("当前选择Transform对象", str3.ToString());

        //4.当前选择的所有Object
        if (GUILayout.Button("获取当前选择的所有Object的名字"))
        {
            if (Selection.count != 0)
            {
                str4.Clear();
                for (int i = 0; i < Selection.objects.Length; i++)
                {
                    str4.Append(Selection.objects[i].name + "||");
                }
            }
            else
            {
                str4.Clear();
                str4.Append("没有选择");
            }
        }

        EditorGUILayout.LabelField("当前选择的所有Object对象", str4.ToString());

        //5.当前选择的所有GameObject
        //Selection.gameObjects 略

        //6.当前选择的所有Transform
        //Selection.transforms 略

        #endregion

        #region Lesson21_Selection_常用静态方法

        //判断某个对象是否被选中
        obj = EditorGUILayout.ObjectField("用于判断是否被选中的对象", obj, typeof(GameObject), true);

        if (GUILayout.Button("判断对象是否被选中"))
        {
            if (Selection.Contains(obj))
                Debug.Log("对象有被选中");
            else
                Debug.Log("对象没有被选中");
        }

        //筛选对象
        if (GUILayout.Button("筛选所有对象"))
        {
            Object[] objs = Selection.GetFiltered<Object>(SelectionMode.Assets | SelectionMode.DeepAssets);
            // Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets | SelectionMode.DeepAssets);
            for (int i = 0; i < objs.Length; i++)
            {
                Debug.Log(objs[i].name);
            }
        }

        #endregion
    }
}


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

×

喜欢就点赞,疼爱就打赏