Spine动画动态切换模型显示

问题:如何切换Spine模型显示?
在Spine的示例工程中有可以在动态生成一个新的Spine模型对象的场景,核心代码就是:

var sa = SkeletonAnimation.NewSkeletonAnimationGameObject(sda);
sa.transform.SetParent(thisTransform, false);
sa.Initialize(false);

这里sda是提前拖入到List的脚本变量中的,这里就有几个问题,我们每次新增Spine资源就要再去拖SkeletonDataAsset到脚本里,并且通过SkeletonAnimation.NewSkeletonAnimationGameObject生成一个全新对象,如果我们需要在这个新对象上需要额外添加一些控制脚本然后设置变量,那么就很不方便了,问题也会比较多,例如绑定了和Lua交互的脚本需要手动设置哪些对象映射到Lua那边访问,这个是不好做到也不直观的,所以我们会做成一个预设将使用到的脚本和变量直接都设置好,如下图:
在这里插入图片描述
做成预设之后,一切就很明了了,既然做成了预设,我们当然希望这个预设可以通用,可以动态设置显示的模型资源,如此一来我就遇到了一些坑,所以在此记录:

通过分析,发现只需要重新设置SkeletonAnimation中的skeletonDataAsset资源,然后点击后面Reload方法就可以了,然后我就去找点击这个按钮都执行了啥,结果就发现个der,一路追踪下去调用的方法都不适合运行时操作,但是不管怎样先试试再说:
第一步:首先加载SkeletonDataAsset资源,然后设置到SkeletonAnimation中的skeletonDataAsset变量中,不出所料果然没用,查看Inspector面板发现资源加载和设置都Ok了,就是MeshRender中的材质啥的都没有跟随自动刷新
那就进行第二步:将Spine资源中对应的材质也加载设置上去呗,试了之后灰常失望。

那看来上面那种常规的操作对于Spine切换模型资源显示毫无用处了,只能还是回到Spine相关的API中去找办法,上网搜没有,官网也没有,只能一个个的API调用来试了,万一成功了呢!不想啰嗦了直接上核心代码并附上注释:

SkeletonAnimation skeletonAnimation = gameObject.GetComponent<SkeletonAnimation>();
if (skeletonAnimation == null)
{
    Debug.LogError("当前对象没有绑定SkeletonAnimation组件");
    return;
}
//加载SkeletonDataAsset资源
SkeletonDataAsset res = ClientRoot.ResMgr.LoadSkeletonDataAsset(type, resName);
if (res == null)
    return;
//不清除一次之前的数据会有超出边界的报错啥的
skeletonAnimation.ClearState();
//将加载的资源赋值给SkeletonAnimation对象
skeletonAnimation.skeletonDataAsset = res;
//传递true强制初始化一次资源,这样才能真的刷新SkeletonAnimation和MeshReder中的资源和材质,并加载到当前对象中
skeletonAnimation.Initialize(true);

最后需要注意一点,就是skeletonAnimation更改资源后,之前通过她赋值的Spine.AnimationState和Spine.Skeleton对象也要重新赋值一次,这是方便用来切换动画、设置播放速度、是否翻转的相关对象:

/// 切换模型数据之后也要重新赋值spineAnimationState和skeleton
/// 有必要就默认播放待机动画
public void InitSkeleton(SkeletonAnimation sa)
{
    spineAnimationState = sa.AnimationState;
    skeleton = sa.Skeleton;
}

到此基本就OK了,我好多废话哦!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值