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/