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

1
2
3
4
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才会出现动画。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);