拓展编辑器(八)

重写菜单:

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

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

时间: 2024-10-12 20:58:11

拓展编辑器(八)的相关文章

UNITY3D拓展编辑器 - InspectorEditor(属性编辑器)1

前文: 本章节会对InspectorEditor(属性编辑器)的创建方式进行叙述. 正文: 1.代码最终效果 2. 架构阐述 一个InspectorEditor(属性编辑器)产生直接对应着一个继承MonoBehaviour的脚本文件,脚本文件中定义着不同的属性以供InspectorEditor(属性编辑器)去实现.我们可以通过EditorGUILayout/GUILayout来实现InspectorEditor(属性编辑器)界面. 3. EditorGUILayout脚本分析 EditorGUI

Unity3D研究院之在开始学习拓展编辑器(一)

Unity拥有非常丰富的拓展编辑器接口,如果是在网上下载过别人写的插件,你会发现为什么它的监测面板视图和普通的不一样?其实是他通过代码自己绘制的监测面板,这篇博文MOMO带大家来学习编辑器.如下图所示,这是我通过代码拓展的面板视图. 下一条简单的脚本,绑定挂在摄像机上. using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public Rect mRectValue ; public T

UNITY3D拓展编辑器 - 目录

前文: 最近在自学UNITY3D拓展器,对以上功能点做一些认知范围内的总结. 目录: 1. 属性编辑器 http://weizeteng.blog.51cto.com/5604545/1774431 2. 工具编辑器 3. 场景编辑器

unity3d拓展编辑器MenuItem的使用

MenuItem是自定义菜单栏显示 比如:[MenuItem("new/My Window")] 这样就会显示菜单new/My Window 把这个放在一个静态方法上就可以了.记住.方法一定要是静态的. Unity圣典上的解释: 也就是说类必须继承:EditorWindow.EditorWindow在命名空间using UnityEditor;中 跟着Unity圣典上的列子和网上的列子敲了一次,这样才能深入理解 1 using UnityEngine; 2 using System.C

拓展编辑器(四)

拓展布局 using UnityEngine; using UnityEditor; public class Script_03 { [InitializeOnLoadMethod] static void InitializeOnLoadMethod() { EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect) { //在project视图中选择一个资源 if (Select

拓展编辑器(十二)_Context菜单

点击组件中设置(鼠标右键),可以弹出Context菜单,我们可以在原有菜单中拓展出新的菜单栏,代码如下所示: using UnityEngine; using UnityEditor; public class Context菜单 { [MenuItem("CONTEXT/Transform/New Context 1")] public static void NewContext1(MenuCommand command) { //获取对象名 Debug.Log(command.c

拓展编辑器(二十)_面板拓展(Inspector面板

我们的Unity脚本挂在游戏对象上时,右侧会出现它的详细信息面板,这些信息是根据脚本中声明的public可序列化变量而来的.此外,也可以通过EditorGUI来对它进行绘制,让面板更具可操作性. Inspector面板: EditorGUI和GUI的用法几乎完全一致,目前来说前者多用于编辑器开发,后者多用于发布后调试编辑器.即他们都是起辅助作用的.EditorGUI提供丰富的组件非常丰富,常用的绘制元素包括文本,按钮,图片和滑动框等.做一个好的编辑器,是离不开EditorGUI的. 如图所示,我

拓展编辑器(六)

Heriarchy视图中出现的都是游戏对象,这些对象之间同样具有一定的关联关系.我们可以用树状结构来表示游戏对象之间复杂的父子关系.接下来会一起学习如何拓展Hierarchy视图. 拓展菜单: Heriarchy视图,也可以对Creat菜单项进行拓展. using UnityEngine; using UnityEditor; public class 拓展菜单 { [MenuItem("GameObject/My Creat/Cube", false, 0)] static void

拓展编辑器(九)

前面介绍了Hierarchy视图的拓展,接下来我们了解一下Inspector视图的拓展. Inspector视图可以用来展示组件以及资源的详细信息面板,每个组件的面板信息是各不相同的.系统提供同大量组件通常可以满足开发需求,但是我们偶尔还是希望能够在原有的组件上去拓展,比如添加一些按钮或者添加一些逻辑. 源生组件的拓展: using UnityEngine; using UnityEditor; [CustomEditor(typeof(Camera))] public class 拓展源生组建