MenuItem属性学习

2021-07-15  本文已影响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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读