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键