• Spine with Unity Mecanim


    前言

    最近这两天刚刚接触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所有,仅供学习交流使用。

    转载请标明出处,谢谢

  • 相关阅读:
    java web开发小记(5)
    java web开发小记(4)
    java web开发小记(3)
    java web开发小记(2)
    java web开发小记(1)
    Myeclipse10小记
    jackson 转换 yyyy-MM-dd格式 少了一个小时问题解决(仅限中国)
    mysql,给每一条数据的某一个字段生成不同的随机数
    mybatis 表情存储报错问题解决
    spring cloud jackson 枚举json互转 枚举json序列化/反序列化
  • 原文地址:https://www.cnblogs.com/tangzhenqiang/p/8316878.html
Copyright © 2020-2023  润新知