Untiy中如何使用Spine骨骼动画

前言


    我们在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;

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容