Unity 编辑器方法

1.扩展Unity组件方法

[MenuItem("CONTEXT/Button/AddBtnAni")]

2.编辑器下代码保存预制体

        /// <summary>
        /// 添加按钮动画
        /// </summary>
        /// <param name="cmd"></param>
        [MenuItem("CONTEXT/Button/AddBtnAni")]
        public static void AddBtnAni(MenuCommand cmd)
        {
            Button btn = cmd.context as Button;
            if (btn != null)
            {
                var uiBtnAni = btn.gameObject.GetComponent<UIButtonAni>();
                if (uiBtnAni == null)
                {
                    btn.gameObject.AddComponent<UIButtonAni>();
                }
                else
                {
                    uiBtnAni.Reset();
                }

                //保存修改预制体
                if (PrefabUtility.GetPrefabAssetType(btn) == PrefabAssetType.Regular)
                {
                    GameObject rootGo = PrefabUtility.GetNearestPrefabInstanceRoot(btn);
                    string assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(btn);
                    PrefabUtility.SaveAsPrefabAssetAndConnect(rootGo, assetPath, InteractionMode.AutomatedAction);
                }
                else
                {
                    EditorUtility.SetDirty(btn);
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh(); 
                }
            }
        }

3.添加unity组件时,做一些初始设定

步骤:先反射拿到unity内置的添加组件方法,再进行自己的个性化设定。

比如添加Image组件时自动去除勾选raycastTarget和maskable。

using System.Collections.Generic;
using Boom.BoomA.UI.UICommon;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class ComponentAddListener
{
    private static System.Type type = null;
    public static System.Type GetMenuOptionsClass()
    {
        if (type == null)
        {
            type = System.Type.GetType("UnityEditor.UI.MenuOptions,UnityEditor.UI");
        }
    
        return type;
    }
    
    private static Dictionary<string, System.Reflection.MethodInfo> dict = new Dictionary<string, System.Reflection.MethodInfo>();
    /// <summary>
    /// 拿Unity内置的添加组件方法,创建组件
    /// </summary>
    /// <param name="funcName"></param>
    /// <param name="menuCommand"></param>
    /// <returns></returns>
    public static GameObject Invoke(string funcName, MenuCommand menuCommand)
    {
        if (string.IsNullOrEmpty(funcName))
        {
            return null;
        }

        if (!dict.ContainsKey(funcName))
        {
            System.Type t = GetMenuOptionsClass();
            System.Reflection.MethodInfo func = t.GetMethod(funcName);

            if (func != null)
            {
                dict.Add(funcName, func);
            }
            else
            {
                Debug.LogError("找不到方法: " + funcName);
                return null;
            }
        }

        dict[funcName].Invoke(null, new System.Object[] { menuCommand });
        return Selection.activeGameObject;
    }
    
    /// <summary>
    /// 添加Image组件时做个性化设定
    /// </summary>
    /// <param name="menuCommand"></param>
    [MenuItem("GameObject/UI/Image")]
    public static void CreateImage(MenuCommand menuCommand)
    {
        GameObject go = Invoke("AddImage", menuCommand);
        if (go != null)
        {
            var img = go.GetComponent<Image>(); 
            img.raycastTarget = false;
            img.maskable = false;
        }
    }
}

4.常用api

4.1、拓展Project视图
右键菜单
[MenuItem(“Assets/My Tools/Tools 1”, false, 2)]
拓展布局
[InitializeOnLoadMethod]
EditorApplication.projectWindowItemOnGUI
4.2、拓展Hierarchy视图
右键菜单
[MenuItem(“GameObject/My Create/Cube”,false,0)]
拓展布局
[InitializeOnLoadMethod]
EditorApplication.hierarchyWindowItemOnGUI
4.3、拓展Inspector视图
拓展组件
[CustomEditor(typeof(Camera))]
public override void OnInspectorGUI()
拓展Context菜单
[MenuItem(“CONTEXT/Transform/New Context 1”)]
MenuCommand
4.4、拓展Scene视图
画线或3D物体
OnDrawGizmos
OnDrawGizmosSelected
画GUI
[CustomEditor(typeof(Camera))]
OnSceneGUI
Handles
4.5、拓展顶部菜单
带勾选的菜单
[MenuItem(“MenuTest/Test”, false, 3)]
Menu.GetChecked
Menu.SetChecked
带快捷键的菜单
[MenuItem(“Assets/HotKey %#d”,false,-1)]
%:表示Ctrl键
#:表示Shift键
&:表示Alt键

猜你喜欢

转载自blog.csdn.net/capricorn1245/article/details/134692554