如何在运行时加载平台特定字体



我正在尝试使该应用程序设置基于平台的一些资产。

第一步是根据OS,Android的Roboto和iOS的Sanfrancisco进行FONT。

简单地说,Unity不能在运行时导入字体,与其他任何跨平台IDE相比,相当多的缺点,但我们在这里没有判断。另一个解决方案是使用AssetBundle,出于不可解释的原因使我失败了...

最重要的是,它并未被广泛构想以将基本资产(例如字体(作为字体以外的东西。

所以我的最终解决方案是这个丑陋的脚本:

class FontFamily
{
     [Header("Android")]
     [SerializeField]
     private Font regularAndroid = null;
     [SerializeField]
     private Font boldAndroid = null;
     [SerializeField]
     private Font italicAndroid = null;
     [Header("iOS")]
     [SerializeField]
     private Font regularIOS = null;
     [SerializeField]
     private Font boldIOS = null;
     [SerializeField]
     private Font italicIOS = null;
     public Font Regular
     {
         get
         {
 #if UNITY_ANDROID
             return this.regularAndroid;
 #elif UNITY_IOS
             return this.regularIOS;
 #endif
         }
     }
     public Font Bold
     {
         get
         {
 #if UNITY_ANDROID
             return this.boldAndroid;
 #elif UNITY_IOS
             return this.boldIOS;
 #endif
         }
     }
     public Font Italic
     {
         get
         {
 #if UNITY_ANDROID
             return this.italicAndroid;
 #elif UNITY_IOS
             return this.italicIOS;
 #endif
         }
     }
 }

只是寻找一种改进的方法,从长远来看,这不是一个可行的解决方案。我什至无法在转换时丢失宏。

我在想一些Prebuild脚本,也许基本上是,您该怎么做?

实际上,Unity可以在不使用ABS的情况下在运行时导入字体,而仅使用Font.CreateDynamicFontFromOSFont

非常简单的脚本,该脚本加载了iOS中的Android和旧金山的Roboto字体:

using UnityEngine;
public class LoadFontFromOS : MonoBehaviour {
    const string ANDROID_FONT_NAME = "Roboto";
    const string IOS_FONT_NAME = "SanFrancisco";
    string[] OSFonts;
    static Font selectedFont;
    public static Font SelectedFont {
        get {
            return selectedFont;
        }
    }
    static bool isFontFound;
    public static bool IsFontFound {
        get {
            return isFontFound;
        }
    }
    private void Awake() {
        isFontFound = false;
        OSFonts = Font.GetOSInstalledFontNames();
        foreach (var font in OSFonts) {
#if UNITY_ANDROID
            if (font == ANDROID_FONT_NAME) {
                selectedFont = Font.CreateDynamicFontFromOSFont(ANDROID_FONT_NAME, 1);
                isFontFound = true;
            }
#elif UNITY_IOS
            if (font == IOS_FONT_NAME) {
                selectedFont = Font.CreateDynamicFontFromOSFont(IOS_FONT_NAME, 1);
                isFontFound = true;
            }
#endif
        }
    }
}

然后,您可以使用简单

更改所有Text类型的字体
text.font = LoadFontFromOS.IsFontFound ? LoadFontFromOS.SelectedFont : text.font;

在需要的地方。

我在Android上进行了测试,并且它可以工作,我没有iOS设备可以测试它,但它应该可以工作。

相关内容

  • 没有找到相关文章

最新更新