cocos-engine
cocos-engine copied to clipboard
希望spine组件 提供一个 可传入 skin对象的 `setSkin()`方法
Use Case
目前的 setSkin() 支持的 是字符串(skin名称) 但是有些场景 是需要 支持传入 skin对象的,
spine官方的cpp runtime是支持的.
void Skeleton::setSkin(Skin *newSkin) {
截图如下:
应用场景主要有两个:
- 程序动态创建 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
我看了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);
有点麻烦.
.