在 Unity 中,常常使用 Spine 来制作一些动画,引擎本身并不能直接播放 Spine 动画,需要额外导入一个 RunTime 插件库才能支持。

运行库导入

关于运行库的导入,有两种方式:

1. 从开源库导入

下载 Spine 的 runtime 库:EsotericSoftware/spine-runtimes ,只需要将其中的 spine-csharpspine-unity 两个部分导入到 Unity 中即可。

2. 从官网插件导入

当然,也可以到 Spine 官网关于 Unity 插件的下载地址spine-unity-download 直接下载最新的插件包,例如:Spine-Unity 3.6 runtime unitypackage ,然后直接导入工程中。

第二种方式是比较常用而且方便的,因为在导入插件核心库的同时,还是导入一些 demo 例子,帮助我们快速上手使用插件的 API ,因此这里我也选择使用第二种方式导入插件。建议新建一个空工程来导入相关 demo 了解插件的使用,而正式工程只导入 spine-csharpspine-unity 两个部分即可。

插件导入步骤

  • 在 Unity 菜单中依次点击:Assets->Improt Package->Custom Package

  • 选中 Spine-Unity 3.6 runtime unitypackage 并导入,去掉 Spine Examples 的勾选(假如需要查看 demo 则点击 All );

  • 点击 Import 完成导入,导入完成后在工程 Assets 下会多出一个 Spine 目录,表示导入成功。

Spine 资源导入步骤

通常制作好的 Spine 动画导出时会有三个文件: .png.json.atlas

  • 在导入 Unity 之前需要将 .atlas 后缀的文件改为 .atlas.txt 后缀(不修改可能会有问题);

  • 将三个文件拖到 Unity 的 Project 面板中,假如运行库导入正常,此时会生成三个新的文件:_Atlas_Material_SkeletinData ,并且在 Console 面板中会打印导入成功的日志:

    三个文件的作用:

    • _Material资源包含一个着色器引用和.png纹理。

    • _Atlas资源包含一个材质引用和.atlas.txt

    • _SkeletonData资源包含一个json引用和_Atlas资源。

在 UGUI 中使用 Spine

Hierarchy 面板中,右键 Spine->SkeletonGraphic(UnityUI)

然后将 Spine 资源导入时生成的 _SkeletinData 文件拖到动画 UI 对象的 Skeleton Data Asset 属性中,且可以编辑相应的动画控制属性:

勾选 Starting Loop 然后运行场景即可看到当前 Starting Animation 所选中动画的效果,并能动态切换其他动画。

程序控制

很多时候,动画需要通过程序控制实现动态创建、切换和销毁,主要会用到几个组件:SkeletonAnimationSkeletonGraphicSkeletonRenderer

  • SkeletonAnimation 动画基本控制组件:

    skeletonAnimation.timeScale = 1.5f;
    skeletonAnimation.loop = true;
    skeletonAnimation.AnimationName = "run";

    这里用于设置动画的播放速度,是否循环,还有切换动画,如下脚本,将其挂在带 SkeletonAnimation 或继承自 SkeletonAnimation 的组件的物体上,用于播放一次动画:

    using UnityEngine;
    ​
    public class TestSpineAnimCtl : MonoBehaviour {public SkeletonAnimation sa;
    ​// Use this for initializationvoid Start () {sa = sa ?? gameObject.GetComponent<SkeletonAnimation>();PlayAnim("run2");}
    ​public void PlayAnim(string animName) {sa.state.SetAnimation(0, animName, false);}
    }

    通过获取其 state 属性,其实是 Spine.AnimationState 对象。

  • SkeletonGraphic 用于 Unity 的 UI 中:

    using UnityEngine;
    ​
    public class TestSpineAnimCtl : MonoBehaviour {public SkeletonGraphic sgp;
    ​// Use this for initializationvoid Start () {sgp = sgp ?? gameObject.GetComponent<SkeletonGraphic>();PlayAnim("run2");}
    ​public void PlayAnim(string animName) {sgp.AnimationState.SetAnimation(0, animName, false);}
    }

    通过其 AnimationState 组件来控制动画,其实也是获取一个 Spine.AnimationState 对象。

  • SkeletonRenderer 还没用到,暂不记录。

  • Spine.AnimationState 主要需要了解其事件和回调:Spine事件 & AnimationState回调

效率优化

上面提到从 Spine 导出的文件有三种:.png.json.atlas ,但使用 .json 格式读取动画数据是比较慢且运行效率较低的方式。Spine 新版本其实还支持更快的数据导出方式,即 Binary format ,那就是二进制的数据导出,采用这种方式导出的格式是:.png.skel.atlas

导入前需要将 .skel 后缀改成 .skel.bytes ,将 .atlas 后缀改成 .atlas.txt ,然后再拖入 Unity 中,不然 .skel 文件不会对应生成 Unity 可识别的 .asset 格式的数据文件。

插件自带材质

由于打包的时候资源需要打包成 Assetbundle ,有几个插件自带的材质球需要注意一下的:

  • spine-unity\Modules\SkeletonGraphic\Shaders 中的 SkeletonGraphicDefault.matSkeletonGraphicTintBlack.mat

  • spine-unity\Shaders\Utility 中也有 HiddenPass.mat

  • spine-unity\Modules\SlotBlendModes 中有 SkeletonPMAMultiply.matSkeletonPMAScreen.mat

需要动态加载这些材质球的话,需要将这些材质球与其他材质球资源一起打包,否则在手机包会出现材质球丢失。

手机包贴图丢失问题

当然,除了材质丢失,还有可能出现贴图丢失的问题,情况如下:

只有几个白色的方块,而正常的应该如下:

1. 问题分析

现在这就是贴图丢失了,看了 《unity 在代码中创建spine动画组件》 才发现项目中用到了spine 动画,使用 Assetbundle 打包后,在手机上运行会出现丢材质的情况。如果不进行打包,直接放到 Resources 目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更新。进过测试,发现在代码中创建 spine 组件是可以解决这个问题。

其实,最根本的问题是 :xxx_Altas.assetxxx_SkeletonData.asset 这两个资源打包到 Assetbundle 之后就取不出来了(偶尔能取出),从而导致了 SkeletonGraphicskeletonDataAsset 属性值变为 null 。

所以,要解决此问题可以干脆用代码动态创建两个对象替换这两个文件的作用即可:

    // 动态创建一个 spine 动画数据public static SkeletonDataAsset BuildSkeletonDataAsset(string skeletonPath, GameObject go) {SkeletonDataAsset sda;sda = ScriptableObject.CreateInstance<SkeletonDataAsset>();sda.fromAnimation = new string[0];sda.toAnimation = new string[0];sda.duration = new float[0];sda.scale = 0.01f;sda.defaultMix = 0.2f;AtlasAsset[] arrAtlasData = new AtlasAsset[1];for (int i = 0; i < arrAtlasData.Length; i++) {AtlasAsset atlasdata = ScriptableObject.CreateInstance<AtlasAsset>();atlasdata.atlasFile = ResourceManager.Instance.LoadAsset(skeletonPath + ".atlas.txt", typeof(TextAsset), go) as TextAsset;atlasdata.materials = new Material[1];atlasdata.materials[0] = ResourceManager.Instance.LoadAsset(skeletonPath + "_Material.mat", typeof(Material), go) as Material;arrAtlasData[i] = atlasdata;}sda.atlasAssets = arrAtlasData;sda.skeletonJSON = ResourceManager.Instance.LoadAsset(skeletonPath + ".skel.bytes", typeof(TextAsset), go) as TextAsset;return sda;}

步骤其实很简单,用代码动态创建一个 SkeletonDataAsset 对象,然后赋值给 SkeletonGraphic 中的 skeletonDataAsset 再调整相应的动画参数即可:

using Spine.Unity;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 用于解决 Spine 动画在手机 ab 包资源管理模式下贴图丢失问题
/// </summary>
public class SkeletonGraphicABReseter : MonoBehaviour {private SkeletonGraphic skg;public string spinePath = "";public string animName = "";public bool loop = false;public float timeScale = 1.0f;
​// Use this for initializationvoid Start () {
#if UNITY_EDITOR
​
#elseskg = gameObject.GetComponent<SkeletonGraphic>();if(skg == null) {return;}ResetSkData();
#endif}
​void ResetSkData() {if(skg.SkeletonDataAsset == null && spinePath.Length > 0) {Debugger.Log("------------ 重置动画");SkeletonDataAsset sda = Utils.BuildSkeletonDataAsset(spinePath, gameObject);
​skg.skeletonDataAsset = sda;// 重置动画skg.Initialize(true);skg.AnimationState.SetAnimation(0, animName, loop);skg.AnimationState.TimeScale = timeScale;}}
}

在使用 SkeletonGraphic 的地方挂上此组件即可解决移动端材质丢失的问题。

参考

  • Spine Unity 官方文档

  • 将Spine动画导入unity

  • spine导出二进制文件怎么导入unity

  • unity 在代码中创建spine动画组件

  • 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

Unity 使用 Spine 动画相关推荐

  1. Unity使用spine动画

    Unity使用spine动画 在 Unity 中,常常使用 Spine 来制作一些动画,引擎本身并不能直接播放 Spine 动画,需要额外导入一个 RunTime 插件库才能支持. 官网插件导入 当然 ...

  2. Unity插件:Unity使用spine动画

    一.spine动画介绍 动画能给游戏带来生机和灵气.我们相信创作一段美妙的动画,不仅需要强大的软件工具,更需要一套牛 B 的工作流程.Spine 专注于此,为您创建惊艳的骨骼动画,并将其整合到游戏当中 ...

  3. Unity之Spine动画角色位置跟随

    using System.Collections; using System.Collections.Generic; using UnityEngine; using Spine; namespac ...

  4. unity获取Spine动画时间

    SkeletonAnimation skeletonAnimation;float = duration= skeletonAnimation.skeletonDataAsset.GetAnimati ...

  5. unity 在代码中创建spine动画组件

    项目中用到了spine动画,使用Assetbundle打包后,在手机上运行会出现丢材质的情况.如果不进行打包,直接放到Resources目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更 ...

  6. Unity骚操作:Spine动画打包成AssetBundle资源到安卓平台时,材质丢失的问题解决方案

    目录 Spine动画打包成AssetBundle资源到安卓平台时,材质丢失. 如果真的特别需要在u3d编辑器中显示为正常,可以手动在编辑器中的右边Inspector面板重新选择一下材质球的shader ...

  7. Unity中使用动画状态机控制Spine动画

    下载Spine-Unity 为了在Unity中支持Spine动画,在http://zh.esotericsoftware.com/spine-unity-download/#Download下载spi ...

  8. 随笔-Unity中一个简易的Spine动画控制器

    我们在Unity中使用Spine动画时,调整一个属性可能调用的是不同类,可能简简单单启动一个动画需要写很多个函数,于是我这边对Spine的动画控制做了一个简易的封装,在目前来说使用还是很方便的,也并不 ...

  9. Unity——Spine动画的使用

    一.Spine是什么? Spine是一个收费的跨平台的2D骨骼动画制作工具. 官方地址:http://zh.esotericsoftware.com/ 二.Spine导出的Unity资源 Spine导 ...

最新文章

  1. spring boot(八)RabbitMQ使用
  2. Eclipse导入项目:No projects are found to import
  3. SAP CRM WebClient UI如何将后台存储的timestamp时间戳转换成本地时间
  4. linux修改文件句柄数生效_linux修改句柄数
  5. python画苹果标志图片_Mac生成APP图标和启动图的脚本
  6. 刘作虎:一加新品将全系支持 5G
  7. 【06月18日】A股滚动市净率PB历史新低排名
  8. 开发工具Charles for Mac(信息抓取) v4.6.3b1
  9. 【进大厂必学】3W字180张图学习Linux基础总结
  10. h2o api java_h2o 准备
  11. 《白雪歌送武判官归京》古诗鉴赏
  12. 持续集成 -- Jenkins + Slack 配置
  13. Python | datetime与time模块
  14. oracle audit_actions,配置Oracle安全审计选项audit
  15. 网页设计HTML个人笔记
  16. 从数据库取String的值存放到Map中 按汉字首字母排序并输出
  17. Linux命令——修改root密码
  18. 树莓派android摄像头驱动开发,树莓派开发笔记(九):基于CSI口的摄像头拍照程序(同样适用USB摄像头)...
  19. cpu风扇转速调节怎么调?怎么查看CPU风扇的转速?所有的CPU风扇都可以调节风扇转速吗,怎么控制?...
  20. 【面经】腾讯U3d面试面经 帧同步方向(总)

热门文章

  1. 用数字和事实说话,让你直观感受:华为究竟有多强!
  2. UEFI引导损坏无法启动如何修复
  3. 三极管的工作条件及工作状态的判断
  4. UESTC1712 七夜雪寂,一世人心(SG)
  5. [内容有误,请看参考和评论区]Spring 注解配置(annotation-config 和 component-scan的不同)
  6. 0基础入门学PLC太难?谈谈PLC的学习方法
  7. bzoj1925【sdoi2010】地精部落
  8. 【Scikit-Learn 中文文档】高斯过程 - 监督学习 - 用户指南 | ApacheCN
  9. What inspires designers? Preferences on inspirational approaches during idea generation
  10. 计算机excel高级筛选操作大全,不看后悔的excel操作技巧