Unity Mecanim如何控制Spine

发表于2018-09-21
评论2 7.5k浏览
对于刚接接触Spine的开发者来说,可能不知道Unity Mecanim Animator如何控制Spine,这篇文章就是基于此给大家做的分享, 希望能帮到大家。

Unity & Spine

想要在Unity中使用Spine动画,目前有三种方式。

第一种,利用SkeletonAnimation,这是Spine提供的原生方式,支持所有Spine功能。

第二种,利用Mecanim (or SkeletonAnimator),使用此方式Spine-unity会将SkeletonData中的动画转换为一系列AnimationClips ,并生成一个Unity Animator Controller。
SkeletonAnimator 组件关联Unity Animator 和 Spine Animation ,并利用Spine Animation? API Mix 和 Aplly 方法控制动画。这允许我们使用Unity的原有流程控制动画。
但是可能有些副作用关于attachment keyframes,可能很难追踪问题。attachment keyframes目前我还没有研究到。

第三种,利用Baking,这个不推荐,这个是专门为了那些没有spine runtime的准备的。使用此方式无法使用Spine特有的功能。

Spine with Unity Mecanim

准备资源,下载官方的Spine Uinty Package, 里面有一些示例场景。今天我们要改造一下Controling Animation Continued这个场景。

原场景使用第一种方式控制动画。我们把它改造成使用第二种方式控制动画。

第一步,新建脚本MyRaptor ,并将脚本添加到raptor Skeleton。脚本内容如下:
using UnityEngine;
using System.Collections;
using Spine.Unity;
namespace Ron.Tang {
	public class MyRaptor : MonoBehaviour {
		#region Inspector
		[SpineAnimation]
		public string walk = "walk";
		[SpineAnimation]
		public string gungrab = "gungrab";
		[SpineAnimation]
		public string gunkeep = "gunkeep";
		[SpineEvent]
		public string footstepEvent = "footstep";
		public AudioSource footstepAudioSource;
		#endregion
		SkeletonAnimation skeletonAnimation;
        Animator myAnimator;
		void Start () {
            //skeletonAnimation = GetComponent<SkeletonAnimation>();
            //skeletonAnimation.AnimationState.Event += HandleEvent;
            myAnimator = GetComponent<Animator>();
            StartCoroutine(GunGrabRoutine());
		}
        void footstep()
        {
            footstepAudioSource.pitch = 0.5f + Random.Range(-0.2f, 0.2f);
            footstepAudioSource.Play();
        }
        IEnumerator GunGrabRoutine () {		
			while (true) {
				yield return new WaitForSeconds(Random.Range(0.5f, 3f));
                //skeletonAnimation.AnimationState.SetAnimation(1, gungrab, false);
                myAnimator.SetTrigger("gungrab");
				yield return new WaitForSeconds(Random.Range(0.5f, 3f));
                myAnimator.SetTrigger("gunkeep");
                //skeletonAnimation.AnimationState.SetAnimation(1, gunkeep, false);
            }
		}
	}
}

通过简单的对比,可以看出把原有使用skeletonAnimation的地方,替换为使用animator。并添加了footstep函数用以响应动画事件。

第二步,从raptor_SkeletonData生成raptor_Controller。点击raptor_SkeletonData在Inspector里面有生成按钮。

第三步,给场景中raptor_skeleton的gameobject添加两个组件Animator 和 Skeleton Animator。并设置Animator 里的Controller为raptor_Controller

以及Skeleton Animator里的SkeletonData Asset 为raptor_SkeletonData。具体如下图所示。 

第四步,设置animator controller 里面的 layer ,transition, parameter。如下图所示:



第五步,运行测试,效果和原先保持一致。

PS:上图人物形象及动画乃是Spine官方资源,版权归Spine所有,仅供学习交流使用。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

2个评论

  • 行走的解决方案 2019-04-18 1楼
    感谢,很棒的教程
  • 我想吃小孩 2019-09-16 2楼
    教程确实和我遇到的问题是一个问题,但是解决方法我怎么感觉只有一半,footstep这个函数是被谁调用的????