using UnityEditor; using UnityEngine; using UnityEngine.UI; using System; using System.IO; using EditorFramework; using UnityEngine.SceneManagement; namespace Stary.Evo.Editor { /// /// 设置字体面板 /// public class DefaultFontEditor : IFontChange { private static Font m_font; public void Creat() { EditorGUILayout.Space(); EditorGUILayout.LabelField("选择默认字体"); EditorGUILayout.Space(); m_font = (Font) EditorGUILayout.ObjectField(m_font, typeof(Font), true,GUILayout.MinWidth(100f),GUILayout.MinHeight(30)); EditorGUILayout.Space(); GUI.color = Color.green; if (GUILayout.Button("确定",GUILayout.MinWidth(200), GUILayout.MinHeight(50))) { ToolCacheManager.SaveFont(m_font); } } [MenuItem("GameObject/UI/DefaultText")] static void CreatImage() { Text text = CreateComponent(); if (text!=null) { text.font = ToolCacheManager.GetFont(); } } private static T CreateComponent() where T : Component { string name = typeof(T).Name; GameObject go = new GameObject(name); Transform parent = GetUIParent(); go.transform.SetParent(parent, false); T com = go.AddComponent(); return com; } private static Transform GetUIParent() { Transform select = Selection.activeTransform; if (select) { if (select.GetComponentInParent()) { return select; } else { Canvas canvas = select.GetComponentInChildren(); if (canvas == null) { canvas = InstanceCanvas(select); } return canvas.transform; } } else { Canvas canvas = GetCanvasInScene(); if (canvas == null) { canvas = InstanceCanvas(); } return canvas.transform; } } /// /// 参考PrefabStageUtility.HandleUIReparentingIfNeeded /// /// static Canvas GetCanvasInScene() { Scene scene = SceneManager.GetActiveScene(); foreach (GameObject go in scene.GetRootGameObjects()) { var canvas = go.GetComponentInChildren(); if (canvas != null) return canvas; } return null; } /// /// 参考PrefabStageUtility.HandleUIReparentingIfNeeded /// /// private static Canvas InstanceCanvas(Transform parent = null) { const string kUILayerName = "UI"; GameObject root = EditorUtility.CreateGameObjectWithHideFlags("Canvas", HideFlags.DontSave); root.layer = LayerMask.NameToLayer(kUILayerName); Canvas canvas = root.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; root.AddComponent(); root.AddComponent(); if (parent) { canvas.transform.SetParent(parent, false); } return canvas; } } /// /// 缓存管理类 /// public class ToolCacheManager { private static string mFontDataPath = "Assets/Main/Tools/Font/FontData.asset"; private static string FontDataFolderPath { get { return Application.dataPath + "/Main/Tools/Font"; } } /// /// 保存设置的字体 /// /// public static void SaveFont(Font font) { CheckFontDataFolderExist(); EditorFrameworkUtils.DeleteFile(FontDataFolderPath, "FontData.asset"); FontData data = ScriptableObject.CreateInstance(); data.defaultFont = font; AssetDatabase.CreateAsset(data, mFontDataPath); EditorUtility.SetDirty(data); } /// /// 从FontData.asset获取字体 /// /// public static Font GetFont() { FontData fontData = AssetDatabase.LoadAssetAtPath(mFontDataPath); if (fontData != null) return fontData.defaultFont; else return null; } /// /// 确保存放FontData.asset文件夹存在 /// private static void CheckFontDataFolderExist() { if (!Directory.Exists(FontDataFolderPath)) { Directory.CreateDirectory(FontDataFolderPath); AssetDatabase.Refresh(); } } } [InitializeOnLoad] /// /// /// public class UnityUIEvent { static UnityUIEvent() { ObjectFactory.componentWasAdded += ComponentWasAdded; } private static void ComponentWasAdded(Component obj) { Text text= obj.gameObject.GetComponent(); if (text!=null) { text.font = ToolCacheManager.GetFont(); } } } }