Unity编辑器拓展(五)-Selection公共类

Selection公共类

一、Selection公共类的作用是什么

1.1 Selection公共类的作用是什么

  • 主要用来获取当前在Unity编辑器中选择的对象
  • 只能用于编辑器开发中

二、Selection中常用静态成员

2.1 获取当前选择的Object

  1. 作用:
  • 获取当前在面板上选择的游戏物体Object,未选择则返回Null
  • 选择多个则返回最后一个选择的游戏物体
  1. 方法
1
Selection.activeObject

2.2 获取当前选择的GameObject

  1. 作用:
  • 获取当前在面板上选择的游戏物体GameObject,未选择则返回Null
  • 选择多个则返回最后一个选择的游戏物体
  1. 方法
1
Selection.activeGameObject

2.3 获取当前选择的Transform

  1. 作用
  • 获取当前在面板上选择的游戏物体的Transform,未选择则返回Null
  • 选择多个则返回最后一个选择的游戏物体
  • 只能获取到场景中(Hierarchy)的对象的Transform
  1. 方法
1
Selection.activeTransform

2.4 获取当前选择的所有Object

  1. 作用:
  • 获取当前在面板上选择的物体数组,未选择则返回Null
  1. 方法
1
Selection.objects 

2.5 获取当前选择的所有GameObject

  1. 作用:
  • 获取当前在面板上选择的游戏物体或Project中预设体 GameObject数组
  • 未选择则返回Null
  1. 方法
1
2
Selection.gameObjects
//可以遍历获取所有信息

2.6 获取当前选择的所有Transform

  1. 作用
  • 获取当前在面板上选择的游戏物体Transform数组,未选择则返回Null
  1. 方法
1
2
Selection.transforms
//可以遍历获取所有信息

2.7 前面6中情况使用

  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
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("没有选择");
//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
  1. 效果
  • 选择代码对象
  • 多选场景对象

三、Selection常用静态方法

3.1 判断某个对象是否被选中

  1. 方法
    选择多个对象时,只要在里面也能判断为被选中
1
Contains //判断某个对象是否被选中(选择多个对象时,只要在里面也能判断为被选中)
  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<类型>(筛选模式)

// 筛选模式:SelectionMode
// Unfiltered: 不过滤
// TopLevel: 只获取最上层对象,子对象不获取
// Deep: 父对象、子对象都获取
// ExcludePrefab: 排除预设体
// Editable: 只选择可编辑的对象
// OnlyUserModifiable: 仅用户可修改的内容
// Assets: 只返回资源文件夹下的内容
// DeepAssets: 如果存在子文件夹,其中的内容也获取
// 如果要混用 位或 | 即可
  1. 示例
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. 方法
1
Selection.selectionChanged += 函数;//选择的物体变化时调用
  1. 示例
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