码迷,mamicode.com
首页 > 其他好文 > 详细

拓展编辑器(八)

时间:2018-10-30 22:50:49      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:idt   onload   int   排序   test   rac   current   Edito   ali   

重写菜单:

  前面我们已经知道了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默认不勾选。

拓展编辑器(八)

标签:idt   onload   int   排序   test   rac   current   Edito   ali   

原文地址:https://www.cnblogs.com/llllllvty/p/9880072.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!