目录
一.导入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
目录,表示导入成功
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大全:
三.效率优化
1.Binary format 二进制数据格式 (比Json运行更快)
上面提到从 Spine 导出的文件有三种:.png 、.json ,但使用 .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 之间,0为 没有约束,1为 满约束)
bone.Skeleton.FindIkConstraint(IK骨骼的名字(string)).Mix = 1;
设置骨骼的位置
可以通过这个方法来操控 IK,一用来实现 手臂 跟随 鼠标的效果(我这里设置的位置是鼠标的位置)
bone.SetLocalPosition(要设置的位置(Vector2));
六.常见的spine问题
1.spine 显示有黑色底图
因为导入时候spine的材质球 自动选择的 有问题,需要手动 选择
这样就正常了