美文网首页
MenuItem属性学习

MenuItem属性学习

作者: 虫小白 | 来源:发表于2021-07-15 11:12 被阅读0次

    1,使用MenuItem可以实现的功能:

    1)在编辑器菜单栏中添加自己的菜单项
    2)在Hierarchy的右键菜单中添加自己的菜单项
    3)在游戏对象组件的右键菜单中添加自己的菜单项

    2,简单代码实现

    //在编辑器菜单栏中添加自己的功能,
    //注意:
    //1)MyTools脚本放到Editor文件夹下。
    //2)using UnityEditor。
    //3)MyFunction1函数必须是静态的
    using UnityEngine;
    using UnityEditor;
    
    public class MyTools
    {
        [MenuItem("我的工具/方法1")]
        static void MyFunction1()
        {
            Debug.Log("fun1");
        }
    }
    //在Hierarchy的右键菜单中添加自己的功能,
    //注意:
    //1)菜单项必须放到“GameObject”选项下才能在右键菜单中显示。
    //2)测试时(版本2019.3)发现菜单项经常刷新不出来(尤其是使用中文时),修改一下名字再刷新就能显示了,不知道怎么回事。
    //3)priority值越小显示的越靠前
    public class MyTools
    {
        [MenuItem("GameObject/我的工具/方法1",priority =0)]
        static void MyFunction1()
        {
            Debug.Log("fun1");
        }
    }
    
    //在游戏对象组件的右键菜单中添加自己的功能
    //注意:1)必须使用“CONTEXT”开头
    using UnityEngine;
    using UnityEditor;
    
    public class MyTools
    {
        [MenuItem("CONTEXT/Player/Init")]
        static void MyFunction1()
        {
            Debug.Log("fun1");
        }
    }
    

    3.扩展

    在编辑器下使用右键创建预设体
    方式1:
    1)使用AssetDataBase加载资源(以Assets开头,必须要写全路径,包括后缀,如.prefab)
    2)使用PrefabUtility.InstantiatePrefab创建预设体,这种方式创建的对象是正常的预设体,修改预设体后创建的对象会一起改变

    using UnityEngine;
    using UnityEditor;
    
    public class MyTools
    {
        [MenuItem("GameObject/MyA/Cube",priority =0)]
        static void CreateCube()
        {
            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/Cube.prefab");
            GameObject prefabObj = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
            if (Selection.activeGameObject != null)
            {
                prefabObj.transform.SetParent(Selection.activeTransform);
            }
            prefabObj.transform.localPosition = Vector3.zero;
            Selection.activeGameObject = prefabObj;
        }
    }
    

    方式2:
    1)使用Resource.Load加载资源(资源要放到Resources文件夹下,不用写后缀)
    2)使用Instantiate创建预设体(要继承MonoBehaviour,创建的对象与预设体不再关联)

    using UnityEngine;
    using UnityEditor;
    
    public class MyTools:MonoBehaviour
    {
        [MenuItem("GameObject/MyA/Cube",priority =0)]
        static void CreateCube()
        {
            GameObject prefab = Resources.Load<GameObject>("Prefabs/Cube");
            GameObject prefabObj = Instantiate(prefab);
            if (Selection.activeGameObject != null)
            {
                prefabObj.transform.SetParent(Selection.activeTransform);
            }
            prefabObj.transform.localPosition = Vector3.zero;
            Selection.activeGameObject = prefabObj;
        }
    }
    

    相关文章

      网友评论

          本文标题:MenuItem属性学习

          本文链接:https://www.haomeiwen.com/subject/kleppltx.html