因为有的时候涉及到场景编辑器或者是自定义编辑器等功能,所以有时候需要在Scene界面里进行一些操作,比如监听事件等
核心就是SceneView以及HandleUtility
如果我们需要自己的编辑器窗口进行操作的话,如下图
编辑器窗口的代码如下:
1 public class MyEditor : Editor 2 { 3 #if UNITY_EDITOR 4 [MenuItem("MyTest/MyEditor")] 5 #endif 6 public static void OpenEditorWindow() 7 { 8 MyEditorWindow.ShowWindow(); 9 } 10 11 }
Editor会打开我们写的EditorWindow类
然后,为了实现鼠标事件监听以及射线,需要在EditorWindow里写一些代码
1 public class MyEditorWindow : EditorWindow 2 { 3 public static MyEditorWindow instance; 4 5 public static void ShowWindow() 6 { 7 instance = GetWindow<MyEditorWindow>(); 8 9 instance.Init(); 10 } 11 12 public void Init() 13 { 14 SceneView.duringSceneGui += OnSceneGUI; 15 } 16 17 public void OnSceneGUI(SceneView sceneView) 18 { 19 //不能用input,因为不是运行时 20 if(Event.current.type == EventType.MouseDown && Event.current.button == 0) 21 { 22 Debug.Log("mouse left click!"); 23 }else if(Event.current.type == EventType.MouseDown && Event.current.button == 1) 24 { 25 //使用HandleUtility来进行编辑器的操作 26 Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); 27 RaycastHit hit; 28 if(Physics.Raycast(ray, out hit)) 29 { 30 if(hit.collider != null) 31 { 32 Debug.Log("mouse right click : " + hit.collider.gameObject.layer.ToString()); 33 } 34 } 35 } 36 } 37 }
HandleUtility中基本都是一些工具作用的函数,用来处理编辑器的一些问题
SceneView则是UnityEditor专门用来控制Scene界面的一个类,除了进行事件监听以外,还可以进行移动Scene Camera等操作
两个类详情见文档
结果示例
当点击鼠标左右键时,会出现相应的log,射线也可以检测到两个物体的层级