Unity——Spine动画的使用
Posted winds_tide
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity——Spine动画的使用相关的知识,希望对你有一定的参考价值。
一、Spine是什么?
Spine是一个收费的跨平台的2D骨骼动画制作工具。
官方地址:http://zh.esotericsoftware.com/
二、Spine导出的Unity资源
Spine导出的资源有3个文件
- .json 存储骨骼信息
- .png 使用的图片图集
- .atlas.txt 图片在图集中的位置信息
当我们把这三个资源导入到已经引入了Spine运行库的Unity工程后会自动为我们生成
- _Atlas 材质和.atlas.txt文件的引用配置文件
- _Material 材质文件
- _SkeletonData json和_Atlas资源的引用配置文件
三、在Unity中使用Spine动画
首先我们需要导入跟Spine动画资源相对应的Spine运行库(官网下载),然后导入使用的Spine动画。
当我们向场景中拖入相关Spine动画时,会出现以下选项。
分别为:
- 使用Spine提供的Api控制动画
- 在UI中使用动画
- 用Unity提供的动画系统控制
1和3的区别就是,一个使用Spine提供的API控制动画,另一个使用Aimator控制动画。
四、具体参数
SkeletonData骨骼数据文件
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:添加自定义混合(可以指定某两个动画之间的持续时间)
Preview:预览
Animations:动画
- Setup Pose:设置姿势(还原到默认姿势)
- Create Animation Reference Assets:创建动画参考资源
Slots:插槽相关(一个部位有多张图片构成,可以在这预览)
SkeletonMecanim:骨骼机制
- Controller:关联动画控制器
SkeletonMecanim是SkeletonAnimation的替代品,它不是必须的
Skeleton Animation
SkeletonData Asset:
关联的骨骼动画信息
Initial Skin:
初始蒙皮
美术在制作时可能有几套蒙皮
一般情况下只有一套 不需要修改
Advanced
-
Initial Flip X/Y:初始翻转X和Y
-
Update When Invisible:不可见时是否更新
Nothing:不更新 Only Animation Status:仅动画状态 Only Event Timelines:仅事件 Everything Except Mesh:除了网格其它都更新 Full Update:更新所有
-
Use Single Submesh:使用单个子网格
-
Fix Draw Order:固定提取顺序
-
Immutable Triangles:不变三角形
-
Clear State On Disable:禁用时清楚状态
-
Separator Slot Names:分隔符插槽名称
-
Z Spacing:Z间距
-
Vertex Data:顶点数据
PMA Vertex Colors:PMA顶点颜色 Tint Black:淡黑色 Add Normals:添加法线 Solve Tangents:求解切线
-
Add Skeleton Utility:添加骨骼公共程序
Debug
-
Show Bone Names:显示骨骼名字
-
Show Paths:显示路径
-
Show Shapes:显示形状
-
Show Constraints:显示约束条件
-
ScaleX/Y:XY的缩放
-
RGBA:颜色
-
Bone:骨骼
Show Bone Names:显示骨骼名字
-
Slots:插槽
-
Constraints:约束条件
-
Draw Order and Separators:提取顺序和分离器相关
-
Events:事件
-
Data Counts:数据数量
Bones:骨骼数量 Slots:插槽数量 Skins:蒙皮数量 Events:事件数量 IK Constraints:IK约束数量 Transform Constraints:位置约束数量 Path Constraints:路径约束数量
Animation Name:
当前播放的动画名。
Loop:
是否循环。
Time Scale:
时间缩放,值越大动画播放的越快。
Root Motion:
是否添加根运动的脚本,一般情况下不添加。
五、API
//获取组件
private SkeletonAnimation sa;
#region 便捷特性,方便使用,以免命名出错。
// 动画特性
[SpineAnimation]
public string jumpName;
// 骨骼特性
[SpineBone]
public string boneName;
// 插槽特性
[SpineSlot]
public string slotName;
// 附件特性
[SpineAttachment]
public string attachmentName;
#endregion
void Start()
sa = this.GetComponent<SkeletonAnimation>();
#region 动画播放
//方法一:直接改变SkeletonAnimation中参数
sa.loop = true;
sa.AnimationName = "jump";
方法二:使用SkeletonAnimation中动画状态改变的函数
//马上播放
SetAnimation (int trackIndex默认索引,填0即可, string animationName
要播放的动画名字, bool loop是否循环)
sa.AnimationState.SetAnimation(0, jumpName, false);
//排队播放
sa.AnimationState.AddAnimation(0, "walk", true, 0);
#region 转向
sa.skeleton.ScaleX = -1;
#endregion
#region 动画事件
//动画开始播放
sa.AnimationState.Start += (t) =>
print( sa.AnimationName + "动画开始播放");
;
//动画被中断或者清除
sa.AnimationState.End += (t) =>
print(sa.AnimationName + "动画中断或者清除");
;
//播放完成
sa.AnimationState.Complete += (t) =>
print(sa.AnimationName + "动画播放完成");
;
//在Spine软件中制作动画时添加的自定义事件
sa.AnimationState.Event += (t, e) =>
print(sa.AnimationName + "自定义事件");
;
#endregion
#region 获取骨骼、设置插槽附件
//获取骨骼
Bone b = sa.skeleton.FindBone(boneName);
sa.skeleton.SetAttachment(slotName, attachmentName);
#endregion
Spine学习五- spine动画融合
在许多地方,都需要用到动画融合,unity的新版动画系统已经能够很方便的进行动画融合,那么使用spine的动画状态机的情况下,如何来进行动画融合呢?
官方有两种方案,一种是使用混合动作实现,另一种是使用spine的动画状态机实现,这里讲解一下状态机的实现:
1 public class cartoonCombine : MonoBehaviour { 2 3 SkeletonAnimation skeletonAnimation; 4 AnimationStateData stateData; 5 Spine.AnimationState state; 6 public float mixTime = 0.5f; 7 public float mixTime2 = 0.5f; 8 void Start () { 9 10 skeletonAnimation = GetComponent<SkeletonAnimation>(); 11 state = skeletonAnimation.AnimationState; 12 //获取状态机动画数据 13 stateData = skeletonAnimation.SkeletonDataAsset.GetAnimationStateData(); 14 15 //设置动画混合,第一个参数是 当前动画,第二参数是下一个动画,第三个参数是从当前动画过度到下一个动画所需时间 16 stateData.SetMix("walk", "run", mixTime); 17 stateData.SetMix("run", "walk", mixTime2); 18 19 skeletonAnimation.AnimationState.SetAnimation(0, "walk", true); 20 21 } 22 23 void Update () { 24 25 if (Input.GetKeyDown(KeyCode.A)) 26 { 27 skeletonAnimation.AnimationState.SetAnimation(0, "run", true); 28 } 29 30 if (Input.GetKeyDown(KeyCode.D)) 31 { 32 33 skeletonAnimation.AnimationState.SetAnimation(0, "walk", true); 34 } 35 }
将该脚本挂到一个挂有 SkeletonAnimation 组件的物体上,需要确保 SkeletonAnimation的Spine资源里面有"walk" 和"run"这两个动画,否则会出错,然后在运行状态下查看动画融合的效果。
以上是关于Unity——Spine动画的使用的主要内容,如果未能解决你的问题,请参考以下文章