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

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后,通过参数传入的内容会被莫名替换成默认的

楼主你好,给节点添加TextMeshPro组件时,编辑器会报以下错误,版本2.4.11

error: TypeError: Cannot read property ‘type’ of undefined
at C:\ProgramData\cocos\editors\Creator\2.4.11\resources\engine\bin.cache\dev\cocos2d\core\node-activator.js:59:8
at CCClass.activateComp (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\engine\bin.cache\dev\cocos2d\core\node-activator.js:317:13)
at cc_Node.addComponent (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\engine\bin.cache\dev\cocos2d\core\utils\base-node.js:1013:34)
at Object.addComponent (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor\page\scene-utils\utils\scene.ccc:1:8212)
at C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor\builtin\scene\panel\messages\scene-operation.ccc:1:1664
at o (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor\builtin\scene\panel\messages\scene-operation.ccc:1:348)
at HTMLElement.add-component (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor\builtin\scene\panel\messages\scene-operation.ccc:1:1624)
at Object._dispatch (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor-framework\lib\renderer\panel.ccc:1:1750)
at EventEmitter. (C:\ProgramData\cocos\editors\Creator\2.4.11\resources\app.asar\editor-framework\lib\renderer\ipc.ccc:1:2816)

感谢指出问题,这个报错是因为在编辑器下添加脚本后,初次设置材质参数的时候对应的材质还没加载完成。这个报错对实际运行倒是没啥影响的。

你可以先在TextMeshPro.ts脚本中TmpUniform.init函数中添加我框出来的代码,就不会报错了,等有空了我就会把这个修改同步到Git仓库的。
image

导入资源的时候如果工程路径带有空格会报错image
修改工具源码这里就好了

1赞

W/renderer (225): Failed to set technique property texture6, value not found

报了个错

能发下你报错的demo或者有问题的字体文件吗