Unity如何在Scene中进行一系列操作,例如事件监听和射线

  因为有的时候涉及到场景编辑器或者是自定义编辑器等功能,所以有时候需要在Scene界面里进行一些操作,比如监听事件等

  核心就是SceneView以及HandleUtility

  如果我们需要自己的编辑器窗口进行操作的话,如下图  

Unity如何在Scene中进行一系列操作,例如事件监听和射线

  编辑器窗口的代码如下:

  

 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等操作

  两个类详情见文档

  结果示例

  Unity如何在Scene中进行一系列操作,例如事件监听和射线

  当点击鼠标左右键时,会出现相应的log,射线也可以检测到两个物体的层级

 

上一篇:Unity学习笔记--解决NavMeshAgent无法到达的点


下一篇:an exception occurred while initializing the database.