cocos-engine icon indicating copy to clipboard operation
cocos-engine copied to clipboard

希望spine组件 提供一个 可传入 skin对象的 `setSkin()`方法

Open finscn opened this issue 1 year ago • 1 comments

Use Case

目前的 setSkin() 支持的 是字符串(skin名称) 但是有些场景 是需要 支持传入 skin对象的,

spine官方的cpp runtime是支持的.

void Skeleton::setSkin(Skin *newSkin) {

截图如下: image

应用场景主要有两个:

  1. 程序动态创建 skin , 2) 跨动画文件(不同的spine组件) 互相传递 skin.

这两个需求不是我自己yy出来的, 实际项目中有用到.

        const skeletonData = anim.skeletonData.getRuntimeData();
        const skin = skeletonData.findSkin(skinName);
        const newSkin = new sp.spine.Skin(newSkinName);
        newSkin.copySkin(skin);
        // do something: 对 newSkin 进行若干修改.
        
        anim.setSkin(newSkin) ; // 此处将新skin对象设置给anim, 但是 cocos的runtime不支持.

( 最近在和某游戏公司合作, 我发现他们对 spine 的使用真的很深 各种复杂用法. 我之前提的关于 Attachment 的 也是源自他们的项目. 不过他们不是cocos项目, 用的是spine官方的runtime )

Problem Description

.

Proposed Solution

No response

How it works

No response

Alternatives Considered

.

Additional Information

No response

finscn avatar Jul 26 '24 06:07 finscn

我看了cocos的源码

   public setSkin (name: string): void {
        if (this._skeleton) this._skeleton.setSkinByName(name);
        this._instance!.setSkin(name);
        if (this.isAnimationCached()) {
            if (this._animCache) {
                this._animCache.setSkin(name);
            }
        }
        this._skinName = name;
        this.invalidAnimationCache();
    }

理论上我似乎可以直接使用下面代码来实现我的需求

        anim._skeleton.setSkin(skin);
        (anim as any)._skinName = skinName;

但是这个代码不会处理 _instance 和 cache , 而且还操作私有成员 _skinName , 并不是好办法.


另外 , 这个 _skeleton 既然是 public 的 , 能否 去掉 _ ? 或者 提供 get 方法?


顺便希望 findSkin 的路径能短一些, 现在要用

    const skeletonData = anim.skeletonData.getRuntimeData();
    const skin = skeletonData.findSkin(skinName);

有点麻烦.

.

finscn avatar Jul 26 '24 06:07 finscn