Unity笔记Spine的基础应用(小白入门)

目录

一.导入Spine环境

1.环境下载导入

 2.资源导入

二.基础应用

1.UI层

(1).初学手动 展示体会

(2).代码动态 简易实现

2.非UI层

 其他播放:

三.效率优化

1.Binary format 二进制数据格式 (比Json运行更快)

四.常见的接口封装 

五.Spine 动画骨骼的基础使用

获得IK骨骼

设置骨骼的位置

六.常见的spine问题

1.spine 显示有黑色底图​编辑


一.导入Spine环境

1.环境下载导入

首先直接去官网 spine-unity 下载     ,下载 对应Spine资源的环境版本

注意:这里要根据自己的unity版本选择,还要和你的spine资源版本一致

 导入unity时 ,如果需要查看 示例和用法, 勾选上Spine Examples

正式项目并且熟悉spine的可以去掉 Spine Examples 的勾选

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

这里是一些spine的基础介绍spine介绍和在Unity里面的应用_神话鼬的博客-CSDN博客_spine和unity

这里把官方文档链接也放进来 供有需求的小伙伴查看 spine-unity 运行时文档http://zh.esotericsoftware.com/spine-unity#SkeletonAnimation

 Spine版本兼容问题Spine降版本兼容问题处理_五仁烧饼的博客-CSDN博客_spine高版本转低版本Spine降版本兼容问题处理https://blog.csdn.net/shaobing32/article/details/122689160

 2.资源导入

普通的 Spine 动画导出时会有三个原文件: .png 、.json 和 .atlas 

在导入 Unity 之前需要将 .atlas 后缀的文件改为 .atlas.txt 后缀(一定要修改后缀);

将三个文件拖到 Unity 的 Project 面板中,假如运行库导入正常,此时会生成三个新的文件:_Atlas 、_Material 和 _SkeletinData

我这里是已经导入的资源截图

新生成三个文件的内容:

        _Material资源(材质球.mat)包含:  一个着色器引用和.png纹理。

        _Atlas资源(.asset文件)包含:  一个材质引用(_Material)和.atlas.txt 。

        _SkeletonData资源(.asset文件)包含:  一个json引用和_Atlas资源。

二.基础应用

1.UI层

(1).初学手动 展示体会

即在canvas下,UI层展示Spine

在Hierarchy视窗下,右键创建

 生成 New SkeletonGraphic后

Data文件托上去,

再设置一下动画名, 是否循环, 播放速度比例

 运行 即可正常展示spine动画

(2).代码动态 简易实现

 UI上主要是获取 SkeletonGraphic 这个核心控制组件,去设置一些运行参数,再去播放 

using UnityEngine;
using Spine.Unity;

public class TestUiSpine : MonoBehaviour
{
    public SkeletonGraphic sgp;
    void Start()
    {
        sgp = sgp?.gameObject.GetComponent<SkeletonGraphic>();
        //参数 1.层级, 2.要播放的动画名 , 3.是否循环
        sgp?.AnimationState.SetAnimation(0, "animation", true);
    }
}

 设置播放的一些参数

sgp.startingAnimation = "animation";
sgp.timeScale = 1.5f;
sgp.startingLoop = true;

2.非UI层

手动或者动态添加 组件: SkeletonAnimation 并手动或动态 赋上 SkeletonData 资源 即可

主要是获取 SkeletonAnimation 这个核心控制组件,去设置一些运行参数,再去播放 

using UnityEngine;
using Spine.Unity;

public class TestSpine : MonoBehaviour
{
     SkeletonAnimation ska;   
    void Start()
    {
        ska = gameObject.GetComponent<SkeletonAnimation>();
        ska.timeScale = 1.5f;
        ska.loop = true;
        ska.AnimationName = "animation";
        //参数 1.层级, 2.要播放的动画名 , 3.是否循环        
        ska?.AnimationState.SetAnimation(0, "animation", true);
    }
}

 其他播放:

动画播放完毕时添加动画

调用AnimationState.AddAnimation这个方法

public SkeletonAnimation sa;
sa.AnimationState.AddAnimation(层级(int),要播放的动画名(string),是否循环(bool),延迟多久播放(float));

切换动画的bug:

由于spine在切换动画的时候自动补偿,用于动画的平稳过度。但是会导致残影等bug,这时候需要在SetAnimation前调用
skeletonAnimation.skeleton.SetToSetupPose ();
spineAnimationState.ClearTracks ();
来消除前一个动画的影响。

 一些常用API大全:

Unity之Spine笔记常用API_weixin_30379911的博客-CSDN博客

三.效率优化

1.Binary format 二进制数据格式 (比Json运行更快)


上面提到从 Spine 导出的文件有三种:.png 、.json 和 .atlas ,但使用 .json 格式读取动画数据是比较慢且运行效率较低的方式。

Spine 新版本其实还支持更快的数据导出方式:

Binary format ,是二进制的数据导出,采用这种方式导出的格式是:.png 、.skel 和 .atlas

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

四.常见的接口封装 

using UnityEngine;
using Spine.Unity;
using static Spine.AnimationState;
using System;

public class SpineAnimManager 
{
        private TrackEntryDelegate ac = null;
        /// <summary>
        /// 播放动画
        /// </summary>
        /// <param name="sg"></param>
        /// <param name="func"></param>
        /// <param name="index"></param>
        /// <param name="animName"></param>
        /// <param name="loop"></param>
        public void PlayAnim(SkeletonGraphic skeleton, Action func, int trackIndex, string animName, bool loop)
        {
            if (skeleton != null)
            {
                PlayAnim(skeleton, trackIndex, animName, loop);
                ac = delegate
                {
                    if (func != null)
                    {
                        func();
                    }
                    skeleton.AnimationState.Complete -= ac;
                    ac = null;
                };
                skeleton.AnimationState.Complete += ac;
            }
        }
        /// <summary>
        /// 停止动画播放
        /// </summary>
        /// <param name="sg"></param>
        /// <param name="trackIndex"></param>
        public void StopAnim(SkeletonGraphic sg, int trackIndex, float mixDuration)
        {
            sg.AnimationState.SetEmptyAnimation(trackIndex, mixDuration);
        }

        /// <summary>
        /// 播放动画
        /// </summary>
        /// <param name="sg"></param>
        /// <param name="index"></param>
        /// <param name="animName"></param>
        /// <param name="loop"></param>
        public void PlayAnim(SkeletonGraphic skeleton, int trackIndex, string animName, bool loop)
        {
            if (skeleton != null)
            {
                skeleton.AnimationState.SetAnimation(trackIndex, animName, loop);
            }
        }
    private static SpineAnimManager mgr_instance;
    public static SpineAnimManager instance
    {
        get
        {
            if (null == mgr_instance)
                mgr_instance = new SpineAnimManager();
            return mgr_instance;
        }
    }
}

五.Spine 动画骨骼的基础使用

引入命名空间(using Spine)(using Spine.Unity)

public Bone bone;
SkeletonAnimation ska;
void Start()
    {
        ska = gameObject.GetComponent<SkeletonAnimation>();
        bone = ska?.skeleton.FindBone("target1");
    }

获得IK骨骼

后面的  .Mix 是获得了  该IK骨骼的  混合值(即IK的控制力)(其值的范围在 到 之间,0为 没有约束,1为 满约束)

bone.Skeleton.FindIkConstraint(IK骨骼的名字(string)).Mix = 1;

设置骨骼的位置

可以通过这个方法来操控 IK,一用来实现  手臂 跟随 鼠标的效果(我这里设置的位置是鼠标的位置)

bone.SetLocalPosition(要设置的位置(Vector2));

六.常见的spine问题

1.spine 显示有黑色底图

 因为导入时候spine的材质球 自动选择的 有问题,需要手动 选择

这样就正常了 

 

 

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值