• 注册
  • 攻略教程 攻略教程 关注:712 内容:221
    DLL

    【教程】使用脚本轻松替换游戏原版字体

  • 查看作者
  • 打赏作者
  • 当前位置: 七日杀中文网 > 攻略教程 > 正文
  • 攻略教程
  • 大版主
    LV.4
    爱我走心

    废话不多说,直接上代码

    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;
                }
            }
        }
    }

    "点赞是美意,打赏是鼓励"

    不明觉厉!

    回复
    Lv.7
    武林萌主
    打赏了66金币

    专业定制商业服+Q:3540500487,技术售后顶流!

    回复

    大佬给力!

    一位七日杀模组创作爱好者,期待与你共探游戏世界的无限可能!

    回复

    大佬A21 的切换第三人称MOD 求更新啊,准备好了金币和掌声。

    回复
    Lv.2

    可以出个简单的unity导出字体文件resource的教程嘛?七日杀的默认字体有些问题,比如“复活”的“复”字,看起来少一半,像是个偏旁。

    回复
    因恶意刷帖用户过多,本版块已取消回帖金币奖励,请签到获取!>>>金币获取指南<<<

    请登录之后再进行评论

    登录
    • 大版主
    • 小版主
  • yichen
  • 柒月白风清
    柒月白风清
    一只小萌新,万年摸鱼党!已经脱坑了。。。
  • Cure_805
    Cure_805
    晚上在睡觉,白天在工作,不一定能及时回复,有事可以留言!
  • 至善丶丶
    至善丶丶
    群:1050040662 定制/开服/地图制作/价格公道
  • 东方清华EX
    东方清华EX
    一个爱玩七日杀的妹纸
  • 暂没有数据

    赞助广告位

  • 点击展示图片即可一键加入QQ群
    赞助广告:100R/月 目前空缺广告位:0

    分享网站

  • 繁体中文
  • 任务
  • 动态
  • 到底部
  • 帖子间隔 侧栏位置: