Unity - Spine
spine运行库导入
spine官方地址:http://zh.esotericsoftware.com/
spine-unity unitypackage下载路径spine-unity 下载
下载好后拖入unity资源即可,他为我们提供了官方api以及一些示例文件
spine骨骼动画使用
Spine 导出的 Unity 资源
Spine 导出的资源有 3 个文件
.json 存储了骨骼信息
.png 使用的图片图集
.atlas.txt 图片在图集中的位置信息
当我们把这三个资源导入到已经引入了 Spine 运行库的 Unity 工程后
会自动为我们生成
_Atlas 材质和.atlas.txt 文件的引用配置文件
Material 材质文件
SkeletonData json 和Atlas 资源的引用配置文件
使用Spine导出的骨骼动画
1.直接将_SkeletonData文件 拖入到场景
选择创建SkeletonAnimation对象
2.创建空对象 然后手动添加脚本进行关联
spine骨骼动画代码控制
SkeletonData JSON: 骨骼数据文件
Scale: 缩放大小
Skeleton Data Modifiers: 骨骼数据修改器
Blend Mode Materizls: 混合模式材质
Apply Additive Material: 是否使用叠加材质
Additive Materials: 叠加材质
Multiply Materials: 相乘材质
Screen Materials: 屏幕材质
Atlas Assets: 图集资源
Mix Settings: 混合设置
Animation State Data: 动画状态数据
Default Mix Duration: 默认混合持续时间
Add Custom Mix: 添加自定义混合(可以指定某两个动画之间的持续时间)
Animations: 动画
Setup Pose: 设置姿势(还原到默认姿势)
Create Animation Reference Assets: 创建动画参考资源
Slots: 插槽相关(一个部位有多张图片构成,可以在这预览)
SkeletonMecanim: 骨骼机制
Controller: 关联动画控制器
SkeletonMecanim 是 SkeletonAnimation 的替代品,它不是必须的
SkeletonData Asset: 关联的骨骼动画信息
Animation Name:当前播放的动画名
Loop:是否循环
Initial Skin:初始蒙皮
美术在制作时可能有几套蒙皮
一般情况下只有一套 不需要修改
Time Scale:时间缩放,值越大动画播放的越快
Root Motion:是否添加根运动的脚本
一般情况下不添加
将_SkeletonData文件拖入场景并选择SkeletonMecanim的话就可以通过状态机控制动画
代码控制
using Spine;
using Spine.Unity;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class lesson13 : MonoBehaviour
{private SkeletonAnimation sa;private float x;private float y;private int temp = 0;[SpineAnimation]public string jumpName;[SpineBone]public string boneName;[SpineSlot]public string slotName;[SpineAttachment]public string attachmentName;// Start is called before the first frame updatevoid Start(){sa = GetComponent<SkeletonAnimation>();//动画播放//方法一:直接改变SkeletonAnimation中的参数//sa.loop = true;//sa.AnimationName = "jump";//方法二:使用SkeletonAnimation中动画状态改变的函数//sa.AnimationState.SetAnimation(0,"jump", false);//排队播放//sa.AnimationState.AddAnimation(0,"walk",true,1.6f);//转向//sa.skeleton.scaleX = -1;//动画事件//动画开始播放//sa.AnimationState.Start += (t) => {// print("动画开始播放");//};//动画被中断或者清除//sa.AnimationState.Start += (t) => {// print("动画被中断或者清除");//};//动画完成播放//sa.AnimationState.Start += (t) => {// print("动画完成播放");//};//作动画时添加的自定义事件//sa.AnimationState.Event += (t, e) => {// print("作动画时添加的自定义事件");//};//便捷特性//动画特性//[SpineAnimation]//骨骼特性//[SpineBone]//插槽特性//[SpineSlot]//附件特性//[SpineAttachment]//获取骨骼,设置插槽附件//获取骨骼//Bone bone = sa.skeleton.FindBone(boneName);//设置插槽附件//sa.skeleton.SetAttachment(slotName,attachmentName);}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space)){gameObject.transform.Translate(Vector2.up * 5 * Time.deltaTime);temp = 1;if (sa.AnimationName != "jump"){sa.AnimationState.SetAnimation(0, "jump", true);}sa.AnimationState.Complete += (t) =>{if (t.Animation.Name == "jump"){temp = 0;}};}x = Input.GetAxis("Horizontal");if (x > 0){ //转向sa.skeleton.ScaleX = 1;if (sa.AnimationName != "walk"){sa.AnimationState.SetAnimation(0, "walk", true);}}if (x < 0){ sa.skeleton.ScaleX = -1;if (sa.AnimationName != "walk"){sa.AnimationState.SetAnimation(0, "walk", true);}}if (x == 0 && temp == 0){if (sa.AnimationName != "roar"){sa.AnimationState.SetAnimation(0, "roar", true);}}gameObject.transform.Translate(Vector2.right * x * 5 * Time.deltaTime);}
}