反射 ------------------------------------------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using UnityEditor.UI;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using System.Reflection;
[InitializeOnLoad]
static internal class UIMenuOptionsExtend
{
// The reflected dafault methods.
private static MethodInfo m_miGetDefaultResource = null;
private static MethodInfo m_miPlaceUIElementRoot = null;
static UIMenuOptionsExtend()
{
L.LogError("UIMenuOptionsExtend");
Initialize();
}
private static void Initialize()
{
// Get all loaded assemblies.
Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
Assembly uiEditorAssembly = null;
foreach (Assembly assembly in allAssemblies)
{
AssemblyName assemblyName = assembly.GetName();
if ("UnityEditor.UI" == assemblyName.Name)
{
uiEditorAssembly = assembly;
break;
}
}
// Check if we find ui assembly.
if (null == uiEditorAssembly)
{
Debug.LogError("Can not find assembly: UnityEditor.UI.dll");
return;
}
// Get things we need.
Type menuOptionType = uiEditorAssembly.GetType("UnityEditor.UI.MenuOptions");
m_miGetDefaultResource = menuOptionType.GetMethod("GetStandardResources", BindingFlags.NonPublic | BindingFlags.Static);
m_miPlaceUIElementRoot = menuOptionType.GetMethod("PlaceUIElementRoot", BindingFlags.NonPublic | BindingFlags.Static);
}
[MenuItem("GameObject/UI/Text", false, 2000)]
static public void AddText(MenuCommand menuCommand)
{
GameObject go = DefaultControls.CreateText((DefaultControls.Resources)m_miGetDefaultResource.Invoke(null, null));
m_miPlaceUIElementRoot.Invoke(null, new object[] { go, menuCommand });
// Remove raycast target.
Text text = go.GetComponent<Text>();
text.font = AssetDatabase.LoadAssetAtPath<Font>("Assets/Resources/Windows/Font/MyArial.ttf");
text.raycastTarget = true;
}
}
-------------------------------------------------------------------------------------------------------------------------------------
扩展
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEditor;
using UnityEngine.EventSystems;
public class OverrideCreateUIMenu
{
// 如果第一次创建UI元素 可能没有 Canvas、EventSystem对象!
private static GameObject SecurityCheck()
{
GameObject canvas;
var cc = Object.FindObjectOfType<Canvas>();
if (!cc)
{
canvas = new GameObject("_Canvas", typeof(Canvas));
if (!Object.FindObjectOfType<EventSystem>())
{
GameObject eventSystem = new GameObject("_EventSystem", typeof(EventSystem));
}
}
else
{
canvas = cc.gameObject;
}
return canvas;
}
// 重写设置字体
[MenuItem("GameObject/UI/Text")]
static void CreatTexts()
{
var canvasObj = SecurityCheck();
if (!Selection.activeTransform) // 在根目录创建的, 自动移动到 Canvas下
{
// Debug.Log("没有选择对象");
Text().transform.SetParent(canvasObj.transform);
}
else // (Selection.activeTransform)
{
if (!Selection.activeTransform.GetComponentInParent<Canvas>()) // 没有在UI树下
{
Text().transform.SetParent(canvasObj.transform);
}
else
{
Text();
}
}
}
private static GameObject Text()
{
GameObject go = new GameObject("MyArialText", typeof(Text));
var text = go.GetComponent<Text>();
text.raycastTarget = false; //默认去掉点击事件
text.font = AssetDatabase.LoadAssetAtPath<Font>("Assets/Resources/Windows/Font/MyArial.ttf"); // 默认MyArial字体
go.transform.SetParent(Selection.activeTransform);
Selection.activeGameObject = go;
return go;
}
}