废话不多说,直接上代码
using System.Reflection;
using HarmonyLib;
using UnityEngine;
using System.Collections;
using System.Linq.Expressions;
namespace Harmony_FontAtlasReloader
{
internal class CoreModule : IModApi
{
private static UIFont newFont;
/// <summary>
/// Dll程序集入口,常用于初始化或挂载脚本
/// </summary>
/// <param name="_modInstance"></param>
public void InitMod(Mod _modInstance)
{
//1.开启一个协程,用于加载外部Unity资源(字体)
GameManager.Instance.StartCoroutine(LoadFontAsset());
//2.使用当前类型创建Harmony对象
var harmony = new Harmony(base.GetType().Name);
//3.创建HarmonyMethod/补丁方法 对象 => UILabel_Patch.ReplaceFontAtlas(any...)
HarmonyMethod hPrefix_FontSetter = new HarmonyMethod(AccessTools.Method(typeof(UILabel_Patch), nameof(UILabel_Patch.ReplaceFontAtlas)));
//4.借助harmony对象调用Patch将补丁方法注入目标成员(UILabel类下font属性的Setter部分)
harmony.Patch(AccessTools.PropertySetter(typeof(UILabel), "font"), hPrefix_FontSetter);
}
/// <summary>
/// 加载字体资源的协程函数
/// </summary>
/// <returns></returns>
private IEnumerator LoadFontAsset()
{
//考虑到游戏分辨率过小会造成字体显示出现问题,加入判断如整体分辨率低于1024*768则直接跳出协程不使用(加载新字体)
if (Screen.width < 1024 || Screen.height < 768) yield break;
//使用DataLoader.LoadAsset热加载字体资源包[泛型参数T:资源类型(必须隶属于u3d.Object)、参数_uri:资产路径]
GameObject fontPrefab = DataLoader.LoadAsset<GameObject>("#" + Application.streamingAssetsPath + "/ResourceData_GameFont?Main");
//同理,如果加载错误则直接跳出协程
if (fontPrefab == null) yield break;
//加载成功:获取资源包内的UIFont组件也就是字体,并赋值给"newFont"方便以后使用
newFont = fontPrefab.GetComponent<UIFont>();
//返回协程
yield return newFont;
}
/// <summary>
/// UILabel补丁类
/// </summary>
private class UILabel_Patch
{
/// <summary>
/// (HarmonyPrefix)补丁方法
/// </summary>
/// <param name="__instance"></param>
/// <param name="___mTrueTypeFont"></param>
/// <param name="___mFont"></param>
/// <returns></returns>
public static bool ReplaceFontAtlas(UILabel __instance, ref Font ___mTrueTypeFont, ref Object ___mFont)
{
__instance.RemoveFromPanel();
//将___mFont修改为我们自己的字体(来自newFont的值)
___mFont = newFont;
___mTrueTypeFont = null;
__instance.MarkAsChanged();
//指定返回false不执行元代码,否则会被覆盖掉
return false;
}
}
}
}
不明觉厉!
专业定制商业服+Q:3540500487,技术售后顶流!
大佬给力!
一位七日杀模组创作爱好者,期待与你共探游戏世界的无限可能!
大佬A21 的切换第三人称MOD 求更新啊,准备好了金币和掌声。
可以出个简单的unity导出字体文件resource的教程嘛?七日杀的默认字体有些问题,比如“复活”的“复”字,看起来少一半,像是个偏旁。