欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity设置默认字体

程序员文章站 2022-03-09 16:37:13
...

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

相关标签: Unity Editor UGUI