Unity设置默认字体

unity并没有设置UI中Text默认字体这个参数,网上也没找到能用的,只好自己写一个了。

首先

创建一个窗口来选择默认字体,然后把字体信息存储在本地,这样一个工程设置一次就行了

    using UnityEngine;
    using UnityEditor;
    窗口类
    public class SetDefaultFont : EditorWindow
    {
        private static Font m_font;
        private static EditorWindow window;

        public static Font Font
        {
            get
            {
                return m_font;
            }
        }

        [MenuItem("CustomTool/设置默认字体")]
        public static void OpenWindow()
        {
            window = GetWindow(typeof (SetDefaultFont));
            window.minSize = new Vector2(500, 300);
            m_font = ToolCacheManager.GetFont();
        }

        private void OnGUI()
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("选择默认字体");
            EditorGUILayout.Space();
            m_font = (Font)EditorGUILayout.ObjectField(m_font, typeof (Font), true);
            EditorGUILayout.Space();
            if (GUILayout.Button("确定"))
            {
                ToolCacheManager.SaveFont(m_font);
                window.Close();
            }
        }
    }
缓存管理类
    public class ToolCacheManager
    {
        private static readonly string cachePath =
            Application.dataPath.Substring(0, Application.dataPath.Length - 6) + "Library/BlueToolkitCache/";

        private static void Init()
        {
            if (!Directory.Exists(cachePath))
            {
                Directory.CreateDirectory(cachePath);
            }
        }

        public static void SaveFont(Font font)
        {
            FontData data = ScriptableObject.CreateInstance<FontData>();
            data.defaultFont = font;
            AssetDatabase.CreateAsset(data, "Assets/ToolKit/Cache/FontData.asset");
        }

        public static Font GetFont()
        {
            FontData data = AssetDatabase.LoadAssetAtPath<FontData>("Assets/ToolKit/Cache/FontData.asset");
            return data.defaultFont;
        }
    }
数据类型
[System.Serializable]
    public class FontData : ScriptableObject
    {
        [SerializeField]
        public Font defaultFont;
    }

然后

我们就需要在创建新的Text时,把我们选择的Font赋值进去,但是我没有找到直接和Text对应的响应事件,所以迂回了一下,在编辑器响应事件里,添加我们的方法。

当Text被创建时,新建的物体是处于选中状态的,所以利用hierarchyWindowChanged这个系统回调,在hierarchy改变时,我们查找选中物体是否还有Text组件,有的话就赋值,没有就忽略。

 public class UnityUIEvent
    {
        [InitializeOnLoadMethod]
        private static void Init()
        {
            Action OnEvent = delegate
            {
                ChangeDefaultFont();
            };

            EditorApplication.hierarchyWindowChanged = delegate()
            {
                OnEvent();
            };
        }

        private static void ChangeDefaultFont()
        {
            if (Selection.activeGameObject != null)
            {
                Text text = Selection.activeGameObject.Get<Text>();
                if (text != null)
                {
                    text.font = ToolCacheManager.GetFont();
                }
            }
        }
    }

以上就是设置默认字体这个小插件的全部代码,可能有一两处需要修改的地方,因为我用了自己写的拓展方法,要用的话,就自己修改一下~

这个小工具收录在我自己写的工具集里面,这个工具集刚开始写,会慢慢完善,如果有大神看到,还望不吝赐教。
工具集地址:https://github.com/BlueMonk1107/BlueToolkit

猜你喜欢

转载自blog.csdn.net/zcaixzy5211314/article/details/79549149
今日推荐