3.8.3 两个 spine 组件使用同一个 spine 动画资源的问题

使用 3.8.1 / 3.8.3 / 3.8.5 引擎版本都会出现以下问题。

在项目中使用 两个 spine 组件 加载同一个 spine 文件资源,在进行骨骼旋转的时候出现以下几个问题。

  1. 在加载完成不使用播放动画的时候,使用下面代码可以旋转骨骼
onTouchMove(event: EventTouch) {
        const delta = event.getDelta();
        const bone = this.leftSpine.findBone(this.boneName);
        if (!bone) {
            console.error(`Bone ${this.boneName} not found`);
            return;
        }

        const rotationSpeed = 0.5;  // 调整旋转速度
        if (0) {
            // 可以设置 动画 但是会出现同一个 spine 资源同时被旋转的情况
            bone.data.rotation += delta.x * rotationSpeed;
        }
        else {
            // 不能设置动画 可以使用 同一个 spine 资源
            bone.rotation += delta.x * rotationSpeed;
        }
    }

当加载完spine动画以后并播放动画就会出现,操作不能实现骨骼旋转了。

  1. 加载完 spine 文件资源播放动画的时候,把上面的代码段修改为以下
if (1) {
            // 可以设置 动画 但是会出现同一个 spine 资源同时被旋转的情况
            bone.data.rotation += delta.x * rotationSpeed;
        }
        else {
            // 不能设置动画 可以使用 同一个 spine 资源
            bone.rotation += delta.x * rotationSpeed;
        }

虽然可以旋转骨骼了,但是会出现两个 spine 组件的骨骼都被旋转了。

有什么的方案能解决上面的骨骼旋转问题吗?

spine 里面缓存模式 REALTIME / SHARED_CACHE / PRIVATE_CACHE,都作为尝试了

data显然只会有一份,你直接去改动data的数值,当然会使得两个用同一份data的spine组件产生同样的变化

是的,这个也是没办法才用了这个方式。而且也并没有达到最终的效果。

通常来说,这个系统设计出来就不是让你这么用的。
这个需求最好是让spine那边制作相应的动画去处理。

使用REALTIME模式,然后你需要旋转的骨骼让动画人员不要K旋转变换的帧,交给程序控制,这样子你播放动画的时候就可以按照你设定的旋转变换,修改bone.rotation的值即可,不能修改bone.data 因为这个是spine本身初始数据。

感谢大佬解惑。

在spine 里面去掉了动画模式下的旋转。


在使用 bone.rotation += delta.x * rotationSpeed; 控制骨骼的旋转,并没有达到旋转骨骼的效果,是需要哪里再修改吗

刚才没有移除干净 ,按照你说的,把需要用代码控制旋转的骨骼,在 spine 中去掉旋转属性,生效了。