拓展編輯器(八)
阿新 • • 發佈:2018-10-31
image 腳本 orm mage idt 監聽 pup http osi
重寫菜單:
前面我們已經知道了Hierarchy視圖中的菜單可以在原有基礎上拓展,同樣的我們可以徹底拋棄它的菜單項,完全使用自己的菜單項。代碼如下:
using UnityEngine; using UnityEditor; public class 重寫菜單 { [MenuItem("Window/Test/OverrideMenu1")] static void Test() { } [MenuItem("Window/Test/OverrideMenu2")] static void Test1() { } [MenuItem("Window/Test/OverrideMenu3/MO")] static void Test2() { } [InitializeOnLoadMethod] static void StartInitializeOnLoadMethod() { EditorApplication.hierarchyWindowItemOnGUI += OnHierachyGUI; } static void OnHierachyGUI(int instanceID, Rect selectionRect) {if (Event.current != null && selectionRect.Contains(Event.current.mousePosition) && Event.current.button == 1 && Event.current.type <= EventType.MouseUp) { GameObject selectionGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;//這裏可以判斷selectionGameObject的條件 if (selectionGameObject) { Vector2 mousePosition = Event.current.mousePosition; EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x , mousePosition.y, 0, 0), "Window/Test", null); Event.current.Use(); } } } }
在上述代碼中使用Event.current來獲取當前的事件。當監聽到鼠標擡起的事件後,並滿足遊戲對象的選中狀態,開始執行自定義事件。其中,EditorUtility.DisplayPopupMenu用於彈出自定義的菜單,Event.current.Use()的含義是不再執行原有的操作,所以就實現了重寫菜單。
效果如圖所示:
我們先用鼠標選擇一個遊戲對象,點擊右鍵即可彈出我們的重寫菜單,這個菜單項已經和Unity自帶的完全不一樣了,它的工作原理就是上述代碼的監聽點擊的事件,打開一個新的菜單窗口。
除此之外,Hierarchy視圖還可以重寫系統自帶的菜單行為。例如,我們可以腹瀉Unity創建的Image組建,代碼如下所示:
using UnityEngine; using UnityEditor; using UnityEngine.UI; public class 重寫Image組建 { [MenuItem("GameObject/UI/Image")] static void CreatImage() { if (Selection.activeTransform) { Image image = new GameObject("image").AddComponent<Image>(); image.raycastTarget = false; image.transform.SetParent(Selection.activeTransform, false); //設置選中狀態 Selection.activeTransform = image.transform; } } }
由於重寫了菜單,所以需要通過腳本自行創建Image對象和組建。接著,獲取到image組件對象,這屆設置它的RaycastTarget屬性即可(關於RaycastTarget:UI事件會在EventSystem在Update的Process觸發。UGUI會遍歷屏幕中所有RaycastTarget是true的UI,接著就會發射線,並且排序找到玩家最先觸發的那個UI,在拋出事件給邏輯層去響應。在實際開發中,並非每一個UI都需要對發射的射線進行響應的,對於那些不需要做出響應的UI,取消勾選RaycastTarget在一定程度上可以減小性能的消耗。)
效果如圖所示:
通過上述的代碼就實現了復寫創建Image組建的邏輯,讓RaycastTarget默認不勾選。
拓展編輯器(八)