【CocosTextMeshPro】一个文本渲染解决方案——支持字体颜色渐变、斜体、下划线、删除线、描边、镂空、阴影、辉光、顶点动画、新的排版模式

太好了,建议官方收录改进

大佬有个问题,有个情况用插件导出之后,多个预制体用了这个组件,下次加字之后可能会达到多张贴图,但预制体里面引用是没有更新的,因为我没有重新打开那个预制体,导致运行会报错,这个有什么好的方法刷新一下吗?

之前确实没考虑到这种情况,暂时想到的思路是可以写一个插件去修改scene和prefab的数据。

  1. 读取有改动的字体json,得到字体json的uuid和里面记录的所有图片名
    image
  2. 根据图片路径,获取所有图片的uuid
  3. 遍历项目内scene和prefab,在搜索到含有目标字体uuid的组件数据中将textures修正为之前获取到的图片uuid
    image

好的,我试试

mark~~

2022.11.2更新

新增富文本支持,最新内容请见GitHub地址
更新说明贴:【CocosTextMeshPro】更新支持富文本——效果更多、兼容性更好的富文本组件

mark~~

最近遇到一个问题,在微信小游戏平台,图片资源和JSON资源放服务器远程加载,加起来大概2M左右,会导致字体显示不出来,排查后发现是onEnable里面调用的forceUpdateRenderData感觉没有生效,加了一个延时0.2秒再调用一次forceUpdateRenderData才生效;大佬有没有什么头绪

确认下几个问题:
你用的是2.4.x版的吗?资源是拖到组件上的还是代码动态加载的,有勾选延迟加载吗?是否确定组件onEnable的时候json和图片资源都已经完成加载了?

2.4.9版本,资源是拖到一个prefab上的,这个prefab是另外一个prefab引用的,是动态加载的;没有勾选延迟加载,组件onEnable的时候看输出是都加载完成了的

可以麻烦给一个尽量精简的demo看看吗

我尝试打了个微信小游戏的包测试后没遇到问题。动态加载的prefab,上面静态引用了字体资源,字体图片和json放在资源服务器远程加载。

后续测试了下确实是延时加载的问题,打包的时候用脚本统一改了,导致网页上看着没问题;这个prefab有办法在延时加载也能立即渲染吗

延迟加载会影响texture的加载时机,用下面的代码修改一下TextMeshPro.ts文件的onEnable就行了。

protected onEnable(): void {
    super.onEnable();
    this.node.on(cc.Node.EventType.SIZE_CHANGED, this._nodeSizeChanged, this);
    this.node.on(cc.Node.EventType.ANCHOR_CHANGED, this["setVertsDirty"], this);

    // 兼容资源延迟加载
    let arr: Promise<void>[] = [];
    for (let i = 0; i < this.textures.length; i++) {
        arr.push(this._waitTextureLoad(this.textures[i]));
    }
    Promise.all(arr).then(() => {
        this.forceUpdateRenderData();
    });
}

private _waitTextureLoad(texture: cc.Texture2D): Promise<void> {
    return new Promise((resolve, reject) => {
        if (texture.loaded) {
            resolve();
            return;
        }
        texture.once('load', () => {
            resolve();
        });
    });
}

哇擦NB啊

2.4.x 描边、阴影之类的都无法合批吗?

对,描边阴影参数不同的话不能合批

:cow: :beer:

牛逼克拉斯

Mac 上命令启动hiero后,传入的textStr会被替换成默认的,所以通过插件始终无法得到自己想要是字体文件,手动使用hiero生成.fnt倒是可以;
插件命令启动hiero后,通过参数传入的内容会被莫名替换成默认的