有没有办法在创建Label的时候就自动设置好项目中的某个字体

如题如题如题如题

自己写个组件,继承label,初始化的时候设置字体,最简单快捷

2赞

做个预制体放到节点预制库

2赞

继承lab组件新写一个是最合适的 ,也可以在项目初始化时 改变 cc.Label.prototype.onLoad,在里面对font进行设置image
2.x如图, 3.x应该也差不多

2赞

我同事有写一个,感觉思路蛮好的,不过我作为UI仔,还是习惯一个个设置或者复制 :monkey:,不出差错。
贴人家封装的工具不太好,就分享一下思路:主要是@executeInEditMode 可以让一个工具Component类在编辑器状态下就运行。然后在这个类onload的时候去遍历所有的子孙节点,寻找Label,RichText进行更换font,执行完后这个工具类自己销毁自己。这样就是将这个类拖到某个节点上,所有字体都就换好了,并且这个类也不侵入执行过程。
参考资料:



1赞

https://store.cocos.com/app/detail/4012
这个插件里面有类似逻辑, 可以参考

2赞

但凡打开任意AI,把你提问的内容复制黏贴,都能1分钟内解决 :rofl:

1赞

:yum:如果你只是编辑器下懒的拖拽字体倒是可以这样子做,差点忘了说我是v3.8.4



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去做就好了