cocos / cocos-engine

Cocos simplifies game creation and distribution with Cocos Creator, a free, open-source, cross-platform game engine. Empowering millions of developers to create high-performance, engaging 2D/3D games and instant web entertainment.
https://www.cocos.com/en/creator
Other
8.87k stars 2.06k forks source link

[Spine相关] 随机出现 BindingError: Cannot pass non-string to std::string 错误 #17621

Open finscn opened 2 months ago

finscn commented 2 months ago

Cocos Creator version

3.8.3

System information

all

Issue description

完整错误如下:

image

使用的都是标准的api, 跟踪不到根本原因是什么.

Relevant error log output

No response

Steps to reproduce

如上

Minimal reproduction project

No response

finscn commented 2 months ago

我项目里引起这个错误的代码如下

const node = cc.instantiate(一个包含spine动画的预制体);
node.parent = 一个已经存在且没什么问题的父节点
const spine = node.getComponent(sp.Skeleton);
spine.enabled = false
//  一些其他无关紧要的代码
node.active = false

// 在其他地方, 其他帧里 激活 node
node.active = true;  // 执行到这里时报错

后来经过摸索 我手动执行 spine组件的 _updateSkeletonData() 方法, 就不会报错了.

const node = cc.instantiate(一个包含spine动画的预制体);
node.parent = 一个已经存在且没什么问题的父节点
const spine = node.getComponent(sp.Skeleton);
spine._updateSkeletonData();   // 手动执行.
spine.enabled = false;
//  一些其他无关紧要的代码
node.active = false

// 在其他地方, 其他帧里 激活 node
node.active = true;

虽然这么做能解决我的问题, 但是需要手动执行 _updateSkeletonData 显然是不对的. 不知道真正的原因是什么.

貌似是 spine组件的 __preload() 方法调用时机不当引起的, 或者是 向wasm传参不对.