Spine在Unity中动态加载

本文介绍了在Unity中如何通过AssetBundle动态加载Spine动画资源,特别是针对Android平台出现Shader丢失问题的解决方案。通过AssetBundle加载后,需要手动设置Shader以确保动画正常显示。详细步骤包括加载SkeletonDataAsset、Material以及指定Shader。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spine在Unity中动态加载
在Unity中使用Spine是非常平常的事情,一般的做法是把每一个动画做成预设然后Clone就好,但是如果要动态加载动画资源呢?把所有的动画做成一个预设,Clone之后再动态改变其动画内容:
下面展示一些 内联代码片

// An highlighted block
SkeletonDataAsset sda = Resource.Load("resource_SkeletonData",typeof(SkeletonDataAsset)) as SkeletonDataAsset;
obj.GetComponent<SkeletonAnimation>().skeletonDataAsset = sda;
obj.GetComponent<SkeletonAnimation>().Initialize(true);
obj.GetComponent<SkeletonAnimation>().initialSkinName = "defaultSkin;

但是这个方法仅在通过Resource.Load方法加载资源有效,如果涉及到热更新,就必须用到AssetBundle。经过测试发现,通过AssetBundle方法加载Spine动画在Android系统中会出现Shader丢失的情况,就是虽然加载到了舞台上,但是没有动画播放,需要手动切换一下Shader才会出现动画。

经过多次尝试,得出解决方案:

// An highlighted block
AssetBundle ab = BetterStreamingAssets.LoadAssetBundle(path);
SkeletonDataAsset skda = ab.LoadAsset("AnimationName_SkeletonData") as SkeletonDataAsset;
//加载同级目录中的材质文件
var m = ab.LoadAsset<Material>(path + "_Material");
if (m) 
{
  //手动指定Shader
  m.shader = Shader.Find("Spine/Skeleton");
}
if (skda)
{
  animation.skeletonDataAsset = skda;
  animation.Initialize(true);
  animation.initialSkinName = defaultSkin;
}
ab.Unload(false);

原文地址:http://doowind.cc/2018/05/25/Spine%E5%9C%A8Unity%E4%B8%AD%E9%80%9A%E8%BF%87AssetBundle%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值