unityspine⽐较全⾯介绍
⾻骼动画
⾸先我们来看到底什么是⾻骼动画:
在早期的机器上,渲染本⾝已经占⽤了很多CPU资源,因此,对于渲染,往往采取的是⼀种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担。帧动画模型在这种条件下应运⽽⽣。⽐较著名的帧动画格式是Quake2所采⽤的MD2。到今天为⽌,帧动画依然存在,只不过帧动画更多地是来描述⼩且动作相对少些的物体。
GPU出现后,CPU的问题早已不像以前那么突出,⼀些新的⼿段和技术也可以被应⽤进来了。⾻骼动画相对于帧动画⽽⾔,更加灵活多变,但同时,⾻骼动画需要更多的计算量,因此⾻骼动画往往应⽤在需要着重体现动作细节的模型中。
⾻骼动画技术后于帧动画技术出现。最开始,⾻骼动画仅⽤于⾮实时渲染的建模领域,如3DMax这类建模软件之中,以⽅便美⼯的建模。后来,CPU从渲染中解放后,⾻骼动画才⽤于实时渲染的游戏中。
⾻骼动画原理
⾻骼动画的想法来源于⼈体⾻骼。例如说,⼈的上肢所有肌⾁和⽪肤都受上肢⾻胳的影响,⽽⼈的踝关节则分别承受⼩腿⾻胳和脚⾻的影响。根据这个我们可以将⾻骼动画理解为两个概念:⾻骼:⽤以控制蒙⽪的⼀种抽象的概念,如⼈体⾻骼控制⽪肤。蒙⽪:被⾻骼控制、并显⽰在外的因素,如⼈体的⽪肤被⾻骼所影响。
蒙⽪(SKINMESH)
在最终的渲染结果中,蒙⽪将完全显⽰出来,蒙⽪实际上就是顶点、法线和纹理坐标等将被渲染的元素。⽽其中,最关键的当然是顶点,顶点将直接被⾻头牵扯运动,因⽽使得整个模型呈现⾻骼所决定的样⼦。
⾻骼(SKELETON)
⾻骼是⼀种抽象的概念,在最终的渲染结果中,它不可见。类如⼈体⾻骼、⾻骼是若⼲⾻头(Bone)成树状的集合体,⽽每块⾻头⼜分别与若⼲数量的蒙⽪顶点关联。当⾻头运动的时候,与之关联的所有蒙⽪顶点也会受⾻骼的影响⽽运动。
⾻头与蒙⽪顶点的关联需要考虑到每块⾻头对蒙⽪顶点的影响。尽管⼤部分情况下,⼀个顶点将仅仅被⼀个⾻头的影响,但是关节处的顶点往往被多根⾻头影响,例如踝关节,可能会分别受⼩腿⾻50%和脚⾻50%的影响,这种影响叫作权重(Weight)。
在这种情况下,我们称踝关节的这些顶点,受⼩腿⾻影响的权重是50%,受脚⾻影响的权重也是50%。
Unity的⾻骼动画插件
⽽在Unity3D中⾻骼动画插件有⽐较多,例如Uni2D,SmoothMovoe,Puppet2D等等,但为了⽅便美术⼈员编辑我们项⽬使⽤是spine
Spine介绍
spine容易上⼿,并且它提供了mesh,通常来说⼀张纹理只有4个顶点,左下右下左上右上,但是有了mesh,我们可以抓取这个图⽚,并设置⼤量的顶点给它,之后就能通过对顶点的设置完成图⽚的拉伸形变,⽐如乳摇功能。
spine中30帧为1s,最新版中也提供了IK,可以将⾻骼固定,做动作
Unity中导⼊⾻骼动画
unity3d animation
使⽤git下载,或直接下载master.zip⽂件.
  2:准备好Spine导出好的动画⽂件,正好最近偶尔玩⼀个游戏,⾥⾯使⽤了Spine制作的⾻骼动画,我就直接使⽤它做好的资源记录⼀下步骤,仅作笔记使⽤.
  我这⾥的动画⽂件资源如图:
这⾥需要提前做⼀个准备⼯作,把上图中的enemy_hunter.atlas⽂件重名为enemy_,因为unity⽆法识别.atlas⽂件,后⾯⽆法进⾏资源导⼊.
  3:现在准备⼯作ok了,我们可以创建⼀个unity⼯程了.
a:把master.zip⽂件中spine-runtimes-master\spine-unity\Assets\spine-unity⽂件夹复制到⼯程的Assets⽂件夹中
    b:把master.zip⽂件中spine-runtimes-master\spine-csharp\src⽂件夹中所有内容复制到⼯程的Assets\spine-csharp⽂件夹中
  4:导⼊资源
   a:这⾥我在资源⾯板右键新建⼀个⽂件夹,⽤来存放导⼊的资源,建议导⼊顺序为".png" ".json"  ".",这样在最后导⼊"."⽂件的时候,会⾃动⽣成
enemy_hunter_Material.mat⽂件和enemy_hunter_Atlas.asset⽂件.
    b:右键新建"spine skeletonData"类型⽂件,名称为"enemy_hunter_SkeletonData.asset",这⾥结合⽹上的资料,感觉以前的版本,应该都是⾃动⽣成的,不知道这⾥为什么需要⼿动建⽴这个⽂件,之前的版本也没有使⽤过,纯属猜测.⽂件新建好后,需要配置Skeleton JSON属性,指定"enemy_hunter.json"⽂件,然后点击"Attempt Reimport"的按钮即可.完成后如图:
  到⽬前为⽌,⾻骼动画的导⼊⼯作就完成了.
  5.现在我们把这个⾻骼动画加⼊到场景中看看效果.
  新建Spine SkeletonAnimation对象,Skeleton Data Asset属性指定为"enemy_hunter_SkeletonData.asset"⽂件.然后Advanced中Animation属性选择⼀个动作,Loop属性勾上,即可循环播放.
   如图:
  6:现在即可在Game⾯板播放观看效果.⾄此Spine⾻骼动画导⼊unity已完成!
Unity中使⽤⾻骼动画
可以使⽤spine制作⾻骼动画来给unity使⽤。spine提供了unity运⾏包。运⾏包的版本⼀定要和spine版本⼀致,不然会报错。
导⼊spine动画:
由spine导出的动画⽂件有3个:xx.atlas,xx.json,xx.png。将这三个⽂件直接导⼊unity会报错,将xx.atlas改为,这时会⾃动⽣成xx_Atlas.asset,xx_Material.mat。然后在unity⾥⾯create spine SkeletonData,指定xx_Atlas.asset和xx.json。就可以⽤SkeletonData⽣成动画了。
控制动画播放:
SkeletonAnimation skeletonAnimation;  //gameobject的component。
Spine.AnimationState spineAnimationState = skeletonAnimation.state;
Spine.Skeleton skeleton;
spineAnimationState.SetAnimation(0, animationName, true);
切换动画的bug:
由于spine在切换动画的时候⾃动补偿,⽤于动画的平稳过度。但是会导致残影等bug,这时候需要在SetAnimation前调⽤
skeletonAnimation.skeleton.SetToSetupPose ();
spineAnimationState.ClearTracks ();
来消除前⼀个动画的影响。
添加事件:
skeletonAnimation.state.Start:开始播放
skeletonAnimation.state.End:动画被清除或者中断
skeletonAnimation.state.Interrupt:动画被打断
skeletonAnimation.state.Complete:播放结束
skeletonAnimation.state.Event:⽤户⾃定义事件
事件设置采⽤lambda表达式:
skeletonAnimation.state.Complete += (state, trackIndex,loopCount) => {
Debug.log("");
};
动态获取slot的坐标:
Vector3 pos = skeletonAnimation.skeleton.FindSlot("hat_1").Bone.GetWorldPosition(transform);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。