Selection公共类
一、Selection公共类的作用是什么
1.1 Selection公共类的作用是什么
- 主要用来获取当前在Unity编辑器中选择的对象
- 只能用于编辑器开发中
二、Selection中常用静态成员
2.1 获取当前选择的Object
- 作用:
- 获取当前在面板上选择的游戏物体Object,未选择则返回Null
- 选择多个则返回最后一个选择的游戏物体
- 方法
2.2 获取当前选择的GameObject
- 作用:
- 获取当前在面板上选择的游戏物体GameObject,未选择则返回Null
- 选择多个则返回最后一个选择的游戏物体
- 方法
1
| Selection.activeGameObject
|
- 作用
- 获取当前在面板上选择的游戏物体的Transform,未选择则返回Null
- 选择多个则返回最后一个选择的游戏物体
- 只能获取到场景中(Hierarchy)的对象的Transform
- 方法
1
| Selection.activeTransform
|
2.4 获取当前选择的所有Object
- 作用:
- 获取当前在面板上选择的物体数组,未选择则返回Null
- 方法
2.5 获取当前选择的所有GameObject
- 作用:
- 获取当前在面板上选择的游戏物体或Project中预设体 GameObject数组
- 未选择则返回Null
- 方法
- 作用
- 获取当前在面板上选择的游戏物体Transform数组,未选择则返回Null
- 方法
2.7 前面6中情况使用
- 示例
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| private StringBuilder str = new StringBuilder("没有选择"); private StringBuilder str2 = new StringBuilder("没有选择"); private StringBuilder str3 = new StringBuilder("没有选择"); private StringBuilder str4 = new StringBuilder("没有选择");
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());
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());
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());
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());
|
- 效果
- 选择代码对象
.png)
- 多选场景对象
.png)
三、Selection常用静态方法
3.1 判断某个对象是否被选中
- 方法
选择多个对象时,只要在里面也能判断为被选中
- 示例
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 28 29 30
| private Object obj; obj = EditorGUILayout.ObjectField("用于判断是否被选中的对象", obj, typeof(GameObject), true);
if (GUILayout.Button("判断对象是否被选中")) { if (Selection.Contains(obj)) Debug.Log("对象有被选中"); else Debug.Log("对象没有被选中"); } ```
## 3.2 筛选对象 1. 作用:从当前选择对象中,筛选出想要的内容 2. 方法 ```cs Selection.GetFiltered(类型, 筛选模式) Selection.GetFiltered<类型>(筛选模式)
|
- 示例
1 2 3 4 5 6 7 8 9
| if (GUILayout.Button("筛选所有对象")) { Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets | SelectionMode.DeepAssets); for (int i = 0; i < objs.Length; i++) { Debug.Log(objs[i].name); } }
|
3.3 当选中变化时会调用的委托
- 方法
1
| Selection.selectionChanged += 函数;
|
- 示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| private void OnEnable() { Selection.selectionChanged += SelectionChanged; }
private void OnDestroy() { Selection.selectionChanged -= SelectionChanged; } private void SelectionChanged() { Debug.Log("选择的对象变化了"); }
|
3.4 效果
- 判断某个对象是否被选中及当选中变化时会调用的委托

- 筛选对象(筛选了Editor下的内容及其子文件夹内容)

四、总结
- Selection公共类主要是帮助我们获取到选择的对象的
- 我们可以利用它对选中对象进行一些处理
Selection公共类 更多API:https://docs.unity.cn/cn/2022.1/ScriptReference/Selection.html