zoukankan      html  css  js  c++  java
  • Editor Scripting学习笔记之Menu Item

    主要用到:
        MenuItem属性
        MenuCommand参数
    可能用到:
        EditorApplicationSelectionGameObjectUtilityFileUtilUndo类
        以及各种工具类,视情况而定

    Menu Item是编辑器扩展中最简单的一种扩展方式,主要用于对常用操作进行封装,使之成为菜单,方便调用。用法非常简单,直接上代码

    using UnityEngine;
    using UnityEditor;
    
    public class MenuTest
    {
        // Add a menu item to create custom GameObjects.
        [MenuItem ("GameObject/MyCategory/Custom GameObject #g", false, 10)]
        static void CreateCustomGameObject (MenuCommand command)
        {
            // Create a custom game object
            GameObject go = new GameObject ("Custom GameObject");
    
            // 如果当前有选择的游戏对象时,让go作为该游戏对象的子对象;否则为顶层对象
            GameObjectUtility.SetParentAndAlign (go, Selection.activaObject);
    
            // Register the creation in the undo system
            Undo.RegisterCreatedObjectUndo (go, "Create " + go.name);
            Selection.activeObject = go;
        }
    }

    其中,对于这种扩展方式,需要注意的只有5点:

    1. 特殊菜单项:
    2. 快捷键
    3. 是否是验证函数
    4. 优先级
    5. 传递的参数

    下面就对这些注意点做出一些解释

    特殊菜单项包括CONTEXT。因为MenuItem主要对主菜单和Inspector中组件的context菜单进行定制
    快捷键有:%(ctrl/cmd) #(shift) &(alt) _ 这4个特殊字符,还有LEFT, RIGHT, UP, DOWN, F1, F2, ..., F12, HOME, END, PGUP, PGDN
    MenuItem属性的第2个参数用来决定下面的函数是否为验证函数,true为验证函数,false为非验证函数(默认)。验证函数返回true时,该菜单项才可用。
    MenuItem属性的第3个参数用来控制优先级。Unity会自动根据你指定的优先级大小进行排序,优先级小的菜单在上面,优先级大的菜单在下面。如果相邻的两个菜单项之间的优先级相差超过10,那么会自动在这两个菜单项中间插入一个分隔符。系统本身的菜单项的优先级可以通过一些工具来查看,比如.net的Reflector。但好像并不能查看所有的菜单项的优先级,只有Window下面的一些菜单可以查到,别的菜单我是没有查出来。
    另外,函数可以传递一个MenuCommand类型的参数,该参数主要用于context类型的菜单,比如Hierarchy视图和Project视图中的右键菜单以及Inspector面板中组件的菜单。可以使用该参数中的context字段来获取该菜单命令的作用对象。


    相关类的使用:

    ContextMenu属性的使用(等同于MenuItem (CONTEXT/ComponentName/...), 同样是实例函数) ContextMenuItem属性的使用(注意该函数是实例函数而不再是静态函数)

    下面就来实战一下,我会在主菜单中定制一个工具,用来切换场景(这样就不用在Project视图中查找了)

    using UnityEngine;
    using UnityEditor;
    using System.Collections;
    
    public class SwitchScene
    {
        [MenuItem ("OpenScene/StartScene")]
        public static void StartScene ()
        {
            EditorApplication.SaveCurrentSceneIfUserWantsTo ();
            EditorApplication.OpenScene ("Assets/Scenes/StartScene.unity");
        }
    
        [MenuItem ("OpenScene/MainScene")]
        public static void MainScene ()
        {
            EditorApplication.SaveCurrentSceneIfUserWantsTo ();
            EditorApplication.OpenScene ("Assets/Scenes/MainScene.unity");
        }
    
        [MenuItem ("OpenScene/LoseScene")]
        public static void LoseScene ()
        {
            EditorApplication.SaveCurrentSceneIfUserWantsTo ();
            EditorApplication.OpenScene ("Assets/Scenes/LoasScene.unity");
        }
    
        [MenuItem ("OpenScene/WinScene")]
        public static void WinScene ()
        {
            EditorApplication.SaveCurrentSceneIfUserWantsTo ();
            EditorApplication.OpenScene ("Assets/Scenes/WinScene.unity");
        }
    }


    这个只是一个很简单的例子,项目中有四个场景文件,然后自定义一个菜单工具在这四个场景之间切换。当然,也可以使用C#中的一些文件操作来动态查找项目中的场景文件(后缀名为.unity),然后提取路径,把该路径做相应处理后作为参数传递给MenuItem和OpenScene,这样就可以动态地改变菜单项了。(由于本人C#基础不太好,目前正在学习中,所以就没有实现该功能。随后,我会翻看一下C#中的文件相关的类,来实现该功能)
    好吧,我承认的确不是那么容易实现的,没有方法动态创建函数,并且MenuItem好像也不能用在函数里面。这个问题先放这吧,以后有解决办法在写出来吧。
  • 相关阅读:
    第一次通过CLR Profile解决内存占用过高的问题
    未处理的异常
    var和dynamic的区别及如何正确使用dynamic?
    C#添加本地打印机
    CSS样式
    CSS选择器
    Winform 数据绑定
    [CLR via C#]值类型的装箱和拆箱
    Java Object
    设计模式_创建型模式
  • 原文地址:https://www.cnblogs.com/champ/p/4155101.html
Copyright © 2011-2022 走看看