Skip to content

[Spine相关] skeleton.ts 中 setAnimation 和 addAnimaton 在使用spine 的api 时, 逻辑不一致 导致行为差异(一错一对) #18522

@finscn

Description

@finscn

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugNeeds TriageNeeds to be assigned by the team

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions