【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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!