Spine在Unity中动态加载

it2026-08-04  10

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/

最新回复(0)