因為有的時候涉及到場景編輯器或者是自定義編輯器等功能,所以有時候需要在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,射線也可以檢測到兩個物體的層級