creator2.4.13关于释放spine的bug

Creator版本2.4.13
目标平台:Android
构建发布之后,用AndroidStudio调试项目,在场景切换时候报错this._nativeSkeleton.destroy is not a function。Error 5000, please go to https://github.com/cocos/cocos-engine/blob/v3.8.4/EngineErrorMap.md#5000
就是spine被多次释放,导致程序报错卡死。然后我删除项目所有的spine资源,以及引用的地方,再次构建发布,项目可以正常运行,最后尝试加入一个spine动画,然后再次构建发布,运行依然报错。
最后切回版本2.4.12,添加spine动画,构建发布,运行一切正常,在此记录一下,希望能帮助遇到此错误的同学,也希望引擎组的大大们,能够fix一下。

2赞

2.4放弃吧,以后新项目最好是用3.x

2.4.14,同样

确实,2.4.14仍然存在

刚从2.4.11升级到2.4.15 就报了这个错, 15版本还没修复吗??

我用的2.4.12

只能降级 不然没办法

可以解决, 以下是AI给出的解决方案, 测试可行

/******************************************** start ****************************************************/

报错: this._nativeSkeleton.destroy is not a function 终极解决方案

这个报错 100% 是升级 2.4.15 后最典型的龙骨(DragonBones)/Spine 兼容问题 ,我直接给你最精准的原因和一键修复方案。

一、报错根本原因

  1. 2.4.11 → 2.4.15 引擎内部修复了骨骼动画底层
  • 旧版: _nativeSkeleton节点 / 对象 ,有 destroy() 方法
  • 新版: _privateSkeleton / _nativeSkeleton 变成了 纯数据对象没有 destroy () 方法
  1. 你代码里手动调用了:

js

this._nativeSkeleton.destroy(); 
// 新版不存在这个方法,直接报错
  1. 这个变量 不需要手动销毁 ,引擎会自动管理,强行调用就报错。

二、最快修复(2 秒搞定)

方案 1:直接删除这行代码(推荐)

找到报错的代码行, 直接删掉

js

// 删掉这一行!
this._nativeSkeleton.destroy();

方案 2:加判断兼容新旧版本(稳妥)

如果你不想删,就加个判断:

js

// 安全写法,有方法才调用
if (this._nativeSkeleton && this._nativeSkeleton.destroy) {
    this._nativeSkeleton.destroy();
}

三、90% 的人报错位置在这里

你大概率是在 龙骨 / Spine 组件销毁、场景切换 的地方写了:

js

// 错误代码(2.4.15 废弃)
onDestroy() {
  this._nativeSkeleton.destroy(); 
}

正确写法(新版 2.4.15)

js

onDestroy() {
  // 只需要销毁组件本身即可
  if (this.dragonBone) {
    this.dragonBone.destroy();
  }
  // 不要动 _nativeSkeleton 这个内部变量!
}

四、为什么升级后突然报错?

  • _nativeSkeleton引擎内部私有变量 (下划线开头 = 不允许外部调用)
  • 2.4.12+ 官方重构了骨骼动画底层
  • 私有变量结构变了, 你强行调用就会崩

五、额外检查(避免后续再崩)

  1. 检查项目中所有 dragonBones.ArmatureDisplay 代码
  2. 不要直接操作:
  • _nativeSkeleton
  • _privateSkeleton
  • _armature
  1. 这些都是 引擎内部变量 ,外部禁止调用、禁止销毁

总结

  1. 报错原因: 新版引擎移除了 _nativeSkeleton.destroy() 方法
  2. 修复: 直接删除这行代码 即可
  3. 规则: 下划线开头的引擎私有变量,不要手动 destroy

你把报错那行代码删掉,立刻就能正常运行!

/******************************************** end ****************************************************/

我的改动是,android工程编译后 在\jsb-link\jsb-adapter 下找到jsb-engine.js
注释掉 this._nativeSkeleton.destroy();

打包测试,正常运行。
麻烦的是可能每次生成Android工程都要手动改一下

1赞

:+1:牛啊,兄弟