-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Description
Cocos Creator version
3.8.6
System information
all
Issue description
setAnimation() 和 addAnimaton() 功能不一样, 有差异是正常的.
但是问题出在 在使用 spine 的底层库时, 逻辑不对.
先看 setAnimation() :
if (this.isAnimationCached()) {
// cache模式暂时无视 , 我实际项目中没有使用 cache模式
} else {
this._animationName = name;
trackEntry = this._instance!.setAnimation(trackIndex, name, loop);
}
this.markForUpdateRenderData();通过 this._instance!.setAnimation() 来调用的 spine 底层库,
最后 还执行了 markForUpdateRenderData().
.
.
再看 addAnimaton()
if (this.isAnimationCached()) {
// cache模式暂时无视 , 我实际项目中没有使用 cache模式
} else if (this._skeleton) {
const animation = this._skeleton.data.findAnimation(name);
if (!animation) {
logID(7510, name);
return null;
}
return this._state?.addAnimationWith(trackIndex, animation, loop, delay);
}它是 通过 this._state?.addAnimationWith(trackIndex, animation, loop, delay) 调用的 spine 底层库.
最后 没有执行 markForUpdateRenderData().
( P.S. : setAnimation() 里的 markForUpdateRenderData() 貌似没有必要, 因为在后面 updateAnimation() 方法里markForUpdateRenderData()还会被执行一次. 只保留最后一次就行)
this._state 这个对象, 也有 setAnimationWith() 方法.
实际测试下来 , setAnimation() 方法也应该通过 this.state?.setAnimationWith() 调用spine 才对.
通过 this._instance!.setAnimation 调用会出现一些很诡异的情况.
尤其在用 自定义了 animationStart animationEnd 时, 或者 高频切换动画时.
另外 这两个方法 在处理 animaiton对象时的逻辑也不统一. 建议修改下.
最后那个 markForUpdateRenderData 是不是也要统一 我就不清楚了.
.
Relevant error log output
No response
Steps to reproduce
.
Minimal reproduction project
No response