Unity如何在Scene中進行一系列操作,例如事件監聽和射線


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM