当前位置: 首页 > news >正文

【unity游戏开发——编辑器扩展】使用Selection类获取到选择的对象,并对选中对象进行一些处理

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前言
  • 一、获取当前选择的Object,及任意对象
    • 1、介绍
    • 2、示例
  • 二、获取当前选择的GameObject
    • 1、介绍
    • 2、示例
  • 三、获取当前选择的Transform
    • 1、介绍
    • 2、示例
  • 四、判断某个对象是否被选中
    • 1、介绍
    • 2、示例
  • 五、筛选选中的内容
    • 1、介绍
    • 2、示例
  • 六、当选中变化时会调用的委托
    • 1、介绍
    • 2、示例
  • 专栏推荐
  • 完结

前言

Selection公共类主要是帮助我们在当前Unity编辑器中获取到选择的对象的,我们可以利用它对选中对象进行一些处理。只能用于编辑器开发中。

一、获取当前选择的Object,及任意对象

1、介绍

  • Selection.activeObject:获取当前在面板上选择的游戏物体Object,未选择则返回Null。选择多个则返回第一个选择的游戏物体。
  • Selection.objects:获取当前在面板上选择的物体数组,未选择则返回Null。

2、示例

using System.Text;
using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private StringBuilder str = new StringBuilder("没有选择");private StringBuilder strs = new StringBuilder("没有选择");[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void OnGUI(){// 获取当前选择的Objectif (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("它是一个文本");elseDebug.Log("它是其他类型的资源");}else{str.Clear();str.Append("没有选择");}}EditorGUILayout.LabelField("当前选择的对象", str.ToString());// 获取当前选择的所有Objectif (GUILayout.Button("获取当前选择的所有Object的名字")){if (Selection.count != 0){strs.Clear();for (int i = 0; i < Selection.objects.Length; i++){strs.Append(Selection.objects[i].name + "|");}}else{strs.Clear();strs.Append("没有选择");}}EditorGUILayout.LabelField("当前选择的所有Object对象", strs.ToString());}
}

效果
在这里插入图片描述

二、获取当前选择的GameObject

1、介绍

  • Selection.activeGameObject:获取当前在面板上选择的游戏物体GameObject,未选择或者选择的不是游戏对象则返回Null,选择多个则返回第一个选择的游戏物体。
  • Selection.gameObjects:获取当前选择的所有GameObject数组,未选择则返回Null。

2、示例

using System.Text;
using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private StringBuilder str = new StringBuilder("没有选择");private StringBuilder strs = new StringBuilder("没有选择");[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void OnGUI(){// 获取当前选择的GameObjectif (GUILayout.Button("获取当前选择的GameObject的名字")){if (Selection.activeGameObject != null){str.Clear();str.Append(Selection.activeGameObject.name);}else{str.Clear();str.Append("没有选择");}}EditorGUILayout.LabelField("选择的GameObject", str.ToString());// 获取当前选择的所有GameObjectif (GUILayout.Button("获取当前选择的所有GameObject的名字")){if (Selection.count != 0){strs.Clear();for (int i = 0; i < Selection.gameObjects.Length; i++){strs.Append(Selection.gameObjects[i].name + "|");}}else{strs.Clear();strs.Append("没有选择");}}EditorGUILayout.LabelField("选择的所有GameObject", strs.ToString());        }
}

效果
在这里插入图片描述

三、获取当前选择的Transform

1、介绍

  • Selection.activeTransform:获取当前在面板上选择的游戏物体的Transform,只能获取Hierarchy窗口的对象,未选择则返回Null,选择多个则返回第一个选择的游戏物体。
  • Selection.transforms:获取当前选择的所有Transform,未选择则返回Null。

2、示例

using System.Text;
using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private StringBuilder str = new StringBuilder("没有选择");private StringBuilder strs = new StringBuilder("没有选择");[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void OnGUI(){// 获取当前选择的Transformif (GUILayout.Button("获取当前选择的Transform的名字")){if (Selection.activeTransform != null){str.Clear();str.Append(Selection.activeTransform.name);//修改位置Selection.activeTransform.position = new Vector3(10, 10, 10);}else{str.Clear();str.Append("没有选择");}}EditorGUILayout.LabelField("选择的Transform", str.ToString());// 获取当前选择的所有Transformif (GUILayout.Button("获取当前选择的所有Transform的名字")){if (Selection.count != 0){strs.Clear();for (int i = 0; i < Selection.transforms.Length; i++){strs.Append(Selection.transforms[i].name + "|");}}else{strs.Clear();strs.Append("没有选择");}}EditorGUILayout.LabelField("选择的所有Transform", strs.ToString());        }
}

效果
在这里插入图片描述

四、判断某个对象是否被选中

1、介绍

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

2、示例

using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private Object obj;[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void OnGUI(){// 判断某个对象是否被选中obj = EditorGUILayout.ObjectField("用于判断是否被选中的对象", obj, typeof(GameObject), true);if (GUILayout.Button("判断对象是否被选中")){if (Selection.Contains(obj))Debug.Log("对象有被选中");elseDebug.Log("对象没有被选中");}}
}

效果
在这里插入图片描述

五、筛选选中的内容

1、介绍

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

2、示例

using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private Object obj;[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void OnGUI(){// 筛选选中的内容if(GUILayout.Button("筛选选中的内容")){Object[] objs = Selection.GetFiltered<Object>(SelectionMode.Assets | SelectionMode.DeepAssets);for (int i = 0; i < objs.Length; i++){Debug.Log(objs[i].name);}}}
}

效果
在这里插入图片描述

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

1、介绍

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

2、示例

using UnityEditor;
using UnityEngine;public class EditorSelectionWindow : EditorWindow
{private Object obj;[MenuItem("编辑器拓展/自定义窗口拓展/Selection自定义窗口")]private static void OpenEditorGUIUtilityWindow(){EditorSelectionWindow win = EditorWindow.GetWindow<EditorSelectionWindow>("Selection知识面板");win.Show();}private void SelectionChanged(){Debug.Log("选择的对象变化了");}private void OnEnable(){Selection.selectionChanged += SelectionChanged;}private void OnDestroy(){Selection.selectionChanged -= SelectionChanged;}
}

效果
在这里插入图片描述


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】
【unity游戏开发——编辑器扩展】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

http://www.dtcms.com/a/192694.html

相关文章:

  • 【微信小程序】webp资源上传失败
  • 『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle
  • Codeforces Round 1023 (Div.2)
  • JAVA学习-练习试用Java实现“语音识别的基础 :如使用MFCC特征提取和简单的分类器”
  • 【AI论文】对抗性后期训练快速文本到音频生成
  • stm32使用freertos时延时时间间隔不对,可能是晶振频率没设置
  • 【Redis】压缩列表
  • Oracle统计信息收集时的锁持有阶段
  • UDP 多点通信
  • 高频交直流电流测量技术:射频PA与MEMS测试的简单解决方案
  • Buildroot 移植MiniGUI
  • Python高级进阶:Vim与Vi使用指南
  • 多模态大语言模型arxiv论文略读(七十七)
  • 一站式本地化方案,解决欧洲反向海淘多重难题
  • 【Linux】网络基础与socket编程基础
  • 【中级软件设计师】网络攻击(附软考真题)
  • [Harmony]大文件持久化
  • Spring Boot多数据源配置的陷阱与终极解决方案
  • 2025 年十大网络安全预测
  • 【问题记录】08 MAC电脑,安装HP打印机驱动,提示:此更新需要macOS版本15.0或更低版本
  • 汽车零部件冲压车间MES一体机解决方案
  • CAPL编程系列_04
  • Linux线程互斥锁
  • 【C++】set和multiset的常用接口详解
  • AWS Elastic Beanstalk控制台部署Spring极简工程
  • 【Java ee】关于抓包软件Fiddler Classic的安装与使用
  • React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
  • 观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等
  • 唐婉歆携作品VoyEase亮相2025米兰设计周,以多感官沉浸式设计重塑全球旅行体验
  • 2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式