1. 程式人生 > >拓展編輯器(八)

拓展編輯器(八)

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默認不勾選。

拓展編輯器(八)