如题如题如题如题
自己写个组件,继承label,初始化的时候设置字体,最简单快捷
2赞
做个预制体放到节点预制库
2赞
继承lab组件新写一个是最合适的 ,也可以在项目初始化时 改变 cc.Label.prototype.onLoad,在里面对font进行设置
2.x如图, 3.x应该也差不多
2赞
我同事有写一个,感觉思路蛮好的,不过我作为UI仔,还是习惯一个个设置或者复制
,不出差错。
贴人家封装的工具不太好,就分享一下思路:主要是@executeInEditMode 可以让一个工具Component类在编辑器状态下就运行。然后在这个类onload的时候去遍历所有的子孙节点,寻找Label,RichText进行更换font,执行完后这个工具类自己销毁自己。这样就是将这个类拖到某个节点上,所有字体都就换好了,并且这个类也不侵入执行过程。
参考资料:
1赞
但凡打开任意AI,把你提问的内容复制黏贴,都能1分钟内解决 
1赞
import { Label, Font, resources, TTFFont, director, Director } from ‘cc’;
import { EDITOR, JSB } from ‘cc/env’;
// 仅在游戏运行时执行(编辑器/JSB环境直接跳过)
if (!EDITOR && !JSB) {
// 缓存加载好的字体(避免重复加载)
let CUSTOM_FONT: Font | null = null;
// 标记字体是否正在加载,避免重复请求
let isLoading = false;
// 修复1:补全Promise的resolve,移除async/await避免阻塞
const loadCustomFont = (callback: (font: Font | null) => void) => {
// 已加载完成,直接回调
if (CUSTOM_FONT) {
callback(CUSTOM_FONT);
return;
}
// 正在加载中,等待即可
if (isLoading) return;
isLoading = true;
resources.load('i18n/Maplestory-OTF-Bold', TTFFont, (err, data) => {
isLoading = false;
CUSTOM_FONT = data;
// 补全resolve逻辑(改为回调更安全)
callback(data);
});
};
// 修复2:安全设置Label字体(延迟到下一帧,避免装配器null)
const setLabelFontSafe = (label: Label) => {
if (!label || !label.isValid || !CUSTOM_FONT) return;
if (!label.useSystemFont) {
return;
}
// 延迟到下一帧执行,确保装配器初始化完成
director.once(Director.EVENT_AFTER_UPDATE, () => {
if (label.isValid) {
label.useSystemFont = false; // 关闭系统字体
label.font = CUSTOM_FONT!; // 设置自定义字体
label['_isSystemFontUsed'] = false;// 覆盖内部变量,防止回滚
}
});
};
// 核心:改写Label的onEnable - 移除async/await,保留你的核心逻辑
const originalOnEnable = Label.prototype.onEnable;
Label.prototype.onEnable = function (this: Label) {
// 1. 先执行Label原生的onEnable逻辑(保留所有默认行为)
originalOnEnable.call(this);
// 2. 加载自定义字体(改用回调,不阻塞onEnable)
loadCustomFont((font) => {
if (font) {
// 3. 安全赋值,避免reset空指针
setLabelFontSafe(this);
}
});
};
// 可选:游戏启动时提前加载字体,减少Label等待
loadCustomFont(() => { });
}
// 导出空对象避免TS报错
export { };
ai写mcp,让ai去做就好了
如果你只是编辑器下懒的拖拽字体倒是可以这样子做,差点忘了说我是v3.8.4

