2.4.4Spine的bug汇总,一堆bug没人管

v2.4.4 ,spine3.8.99
setAnimation
在 REALTIME模式,正常返回。
在SHARE_CACHE模式,返回为null。

如果返回为null,就无法去 setTrackEventListener 设置动画播放结束的回调了

1赞

2.4.4 spine一堆bug,反馈了估计也没人回。

相比1.9.3版本,2.4.4版本的spine确实是渣

问题1:
skeleton.clearTracks()
2.4.4会执行上一次setEndListener 的回调。

spine文件 为二进制时,100%复现;

spine文件 为json格式,第一次正常,第二种执行clearTracks语句会先执行EndListener回调,后面setAnimation之后,再setEndListener的回调不会执行,100%复现

private wordAni(skeleton: sp.Skeleton | null, animName = ‘animation’, completeCB?: () => void) {

    if (skeleton) {

        skeleton.clearTracks();

        skeleton.node.position = cc.v2();

        skeleton.node.active = true;

        skeleton.setAnimation(0, animName, false);

        skeleton.setEndListener(() => {

            if (skeleton) {

                skeleton.node.active = false;

            }

            if (completeCB) {

                completeCB();

            }

        });

    }

}

复现demo

在第二次执行 wordAni的时候,执行到clearTracks,会直接执行上一次setEndListener的回调

问题2:
setToSetupPose 之后,setAnimation,会立即执行 setEndListener 的回调。

private wordAni(skeleton: sp.Skeleton | null, animName = ‘animation’, completeCB?: () => void) {

    if (skeleton) {

        skeleton.setToSetupPose();

        skeleton.setEndListener(() => { });

        skeleton.node.position = cc.v2();

        skeleton.node.active = true;

        skeleton.setAnimation(0, animName, false);

        skeleton.setEndListener(() => {

            if (skeleton) {

                skeleton.node.active = false;

            }

            if (completeCB) {

                completeCB();

            }

        });

    }

}

问题3:
setEndListener 在第一次setsetAnimation 执行完成之后,不会执行。
第二次播放才会执行end 回调。

使用的是 官方的测试用例 spineBoy.fire场景。
walk() {

    this.spine.setEndListener(trackEntry => {

        console.log('walk')

    })

    this.spine.setAnimation(0, 'walk', false);

    this._hasStop = false;

},

这是改写的 walk接口,100%复现

:rofl:我最近也遇到个,很难受,原本监听的是setEndListener,本来会生效,后来不知道改到啥了,死活不生效了,只能改成setCompleteListener监听了

2.4.4 升的我压抑不住的气啊,一堆bug,提了基本没人理

专注3.0走向世界呢,别急。

这个是对的,你setAnimation相当于结束上一个动画,上一个动画的setEndListener当然会执行。

setEndListener你可以理解为切换动画时会触发的回调。

完成就用setCompleteListener

spine的可以主要@mmyduckx

我感觉问题都出在对setEndListener有误解 :rofl:

setCompleteListener 是可以的,我也是改成了setCompleteListener。
setEndListener这玩意之前版本是可以的,改成2.4.4后,spine升级到3.8.8后出了问题。

spine的二进制格式和 json格式的表现也会不一样,你可以试下上面我说的。

我之前也这么恶心过,测试后得出我上面说的结论。setEndListener变成了动画发生改变时触发的回调了

这个不应该吧,你确定美术导出没问题吗 :rofl:

美术没问题,问题是美术已经将资源升级为3.88之后,不能回退3.7了,那才是真的坑

这个意思是loop=false的时候播放完成也不会调用endlistener了?

:rofl:我以前也遇到过,美术自己想办法回退了,应该是有老版文件

对啊,你动画没变只是播放完了