前言
我们在Unity研发项目中,美术同学可能会使用Spine来设计制作一些2D骨骼动画,而Unity引擎本身不能直接播放Spine动画,这时需要我们额外的导入Spine动画相关的插件库才能使用。
Spine动画导出
Spine->导出...( 快捷键 Ctrl+E)
Spine支持两种数据格式的导出:
JOSN
导出相关设置
纹理打包器设置
导出文件相关命名设置
xxxxxx.atlas -> xxxxxx.atlas.txt(如果纹理打包器设置已修改,导出后该名字已修改为最终格式)
xxxxxx.json -> xxxxxx.json
xxxxxx.png -> xxxxxx.png
二进制
导出相关设置
纹理打包器设置
导出文件相关命名设置
xxxxxx.atlas -> xxxxxx.atlas.txt (如果纹理打包器设置已修改,导出后该名字已修改为最终格式)
xxxxxx.png -> xxxxxx.png
xxxxxx.skel -> xxxxxx.skel.bytes(需要手动修改)
两种数据格式导出设置基本相同,这种主要提一点是关于 图集扩展名,其初始是.atlas,要将其更改为.atlas.txt(如果导出的时候没有修改,则需要手动将对应文件的格式.atlas改为.atlas.txt),否则导入Unity后,不会自动产生相关需要的文件。
插件库导入
关于运行库的导入,有两种方式:
1. 从开源库导入
下载Spine的runtime库: EsotericSoftware/spine-runtimes ,只需要将其中的 spine-csharp 和 spine-unity 两个部分导入到 Unity 中即可。
2. 从官网插件导入
可以到Spine官网Unity插件的下载地址 spine-unity-download 直接下载最新的插件包,然后直接导入工程中。
针对新手同学建议使用第二种方式,因为第二种方式的插件包内不仅带有插件的核心库,更有一些官方的Demo示例可以参考,可以帮助快速上手使用Spine库内相关的API。当然如果对Spine动画已经使用过,可以直接通过第一种方式将 其中的 spine-csharp 和 spine-unity 两个部分导入到 Unity 中即可 。具体采用哪种方式建议根据自己的实际情况选择。
Spine动画导入Unity步骤
本次只介绍二进制数据格式的导入,关于Josn数据格式的大家可以去网上搜索一下哈
导出制作好的Spine动画后会生成3个相关的文件(该图中已将相关文件的后缀修改成导入的格式了):
将三个文件导入到 Unity 中,如果导入过程正常,则会生成三个新的文件:_Atlas 、_Material 和 _SkeletinData ,并且在 Console 面板中会打印导入成功的日志:
新生成三个文件的作用:
_Material资源包含一个着色器引用和.png纹理。
_Atlas资源包含一个材质引用和.atlas.txt 。
_SkeletonData资源包含一个json引用和_Atlas资源。
UGUI中 使用 Spine动画
在 Hierarchy 面板中,右键 Spine->SkeletonGraphic(UnityUI) :
PS:生成的该对象也需要挂在到Canvas节点下,使用和层级管理方式与Image类似。
然后将 Spine 资源导入时生成的 _SkeletinData 文件拖到动画 UI 对象的 Skeleton Data Asset 属性中,在Game面板内就可以看到该动画初始的图像:
API使用
SkeletonAnimation 组件:
ani.timeScale =3f;//播放速度
ani.loop =true;//循环播放
ani.AnimationName ="flying";//切换的动画名称
usingUnityEngine;
public class TestSpineAni:MonoBehaviour{
private SkeletonAnimation m_spineAni;
void Start(){
m_spine Ani= gameObject.GetComponent<SkeletonAnimation>();
PlayAnim("flying");
}
public void PlayAnim(stringanimName){
m_spineAni.state.SetAnimation(0, animName,false);
}
}
SkeletonGraphic 组件(用于Unity的UI中):
using UnityEngine;
public class TestSpineAni2:MonoBehaviour{
private SkeletonGraphic m_spineAni;
void Start(){
m_spineAni = gameObject.GetComponent<SkeletonGraphic>();
PlayAnim("flying");
}
public void PlayAnim(stringanimName){
sgp.AnimationState.SetAnimation(0, animName,false);
}
}
SkeletonRenderer 还没用到,暂不记录。
Spine.AnimationState 主要需要了解其事件和回调: Spine事件 & AnimationState回调 。
效率对比
Json和二进制格式对比大家可以参考官网文档的介绍,这里就不一一讲解了。
插件自带材质
由于打包的时候资源需要打包成 Assetbundle ,有几个插件自带的材质球需要注意一下的:
spine-unity\Modules\SkeletonGraphic\Shaders 中的 SkeletonGraphicDefault.mat 和 SkeletonGraphicTintBlack.mat ;
spine-unity\Shaders\Utility 中也有 HiddenPass.mat ;
spine-unity\Modules\SlotBlendModes 中有 SkeletonPMAMultiply.mat 和 SkeletonPMAScreen.mat;
需要动态加载这些材质球的话,需要将这些材质球与其他材质球资源一起打包,否则在手机包会出现材质球丢失。