zoukankan      html  css  js  c++  java
  • Unity3D 4.x 使用Mecanim实现动画控制

    Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim,尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的,可知Mecanim将会是以后动画播放的趋势!

    Mecanim是一种基于状态机的结构,不同的状态表示一个动作(或者多个动作融合,或者一个子状态机)。状态之间使用一种称为Transition的组件关联,Transition中能够设定一些条件,当在Transition“源状态”下。满足其条件之后。将自己主动跳转到Transition“目的状态”!

    (详细使用方法请參照Unity3D手冊Mecanim

    在一些ARPG的游戏中,比方 端游的DNF和闯关类的街机游戏,连续按攻击键都会触发一套组合攻击。在这个过程中敌人通常是硬直状态的。并且组合攻击的最后一下通常是重击。这样做既添加了连击带来的爽快感。又促使玩家在攻击时採取一定的攻击策略。

    Mecanim的状态机设计就非常方便的使开发人员实现了这一效果。


    1.动画状态机

    这里仅仅用4个动作描写叙述,待命状态(Idle)。攻击1状态(AtkSlice),攻击2状态(AtkStab),攻击3状态(AtkCleave),3个攻击状态分别表示连续按下“普通攻击键”时触发的状态,是有先后顺序关系的。即假设在待命状态下按下“攻击键”,则进入攻击1状态。假设在攻击1状态下继续按下“攻击键”。则进入攻击2状态。假设不按下“攻击键”,则回到待命状态攻击2状态到攻击3状态同理。攻击3状态觉得是重击。即连击结束。回到待命状态。

    状态图例如以下


    我希望能以最少的代码和设置完毕这个功能。所以仅仅加入了一个状态机參数 ActionCMD,如果 ActionCMD = 1 为进入攻击状态參数

    (1)在随意3种攻击状态下,不再继续按下“攻击键”,则回到待命状态,即上图 3条白色Transition

    (2)在待命。攻击1,攻击2状态下,继续按下“攻击键”,则跳转到连击状态(即下一个攻击状态)。即上图3条蓝色Transition


    2.代码实现

    (1)状态机设置完毕之后,要做的就是在代码中完毕对当前状态的推断,以及对状态參数的设置。用以完毕动画状态机的切换!

    1. // 使用字符串变量保存当前状态。避免多处引用写错  
    2.     private static readonly string IdleState = "BaseLayer.Idle";  
    3.     private static readonly string AtkSliceState = "BaseLayer.AtkSlice";  
    4.     private static readonly string AtkStabState = "BaseLayer.AtkStab";  
    5.     private static readonly string AtkCleave = "BaseLayer.AtkCleave";  
    6.     // 动画状态机參数Key  
    7.     private static readonly string ActionCMD = "ActionCMD";  
    8.   
    9.     private Animator animator = null;  
    10.     // 当前连击数(即 玩家按下攻击键的次数)  
    11.     private int curComboCount = 0;  

    (2)在Start() 中获取Animator组件引用

    (3)在Update() 中依据当前状态和输入參数促使状态切换

    1. void Update()  
    2.     {  
    3.         AnimatorStateInfo stateInfo = this.animator.GetCurrentAnimatorStateInfo(0);  
    4.         if (!stateInfo.IsName(IdleState))  
    5.         {  
    6.             // 每次设置完參数之后,都应该在下一帧開始时将參数设置清空,避免连续切换  
    7.             this.animator.SetInteger(ActionCMD, 0);  
    8.         }  
    9.   
    10.         if (stateInfo.IsName(AtkSliceState) && (stateInfo.normalizedTime > 0.6f) && (this.curComboCount == 2))  
    11.         {  
    12.             // 当在攻击1状态下,而且当前状态执行了0.6正交化时间(即动作时长的60%),而且用户在攻击1状态下又按下了“攻击键”  
    13.             this.animator.SetInteger(ActionCMD, 1);  
    14.         }  
    15.         if (stateInfo.IsName(AtkStabState) && (stateInfo.normalizedTime > 0.8f) && (this.curComboCount == 3))  
    16.         {  
    17.             // 挡在攻击2状态下(同理攻击1状态)  
    18.             this.animator.SetInteger(ActionCMD, 1);  
    19.         }  
    20.   
    21.         if (Input.GetKeyUp(KeyCode.J))  
    22.         {  
    23.             // 监听用户输入(如果J键为攻击键)  
    24.             Attack();  
    25.         }  
    26.     }  

    1. void Attack()  
    2.     {  
    3.         AnimatorStateInfo stateInfo = this.animator.GetCurrentAnimatorStateInfo(0);  
    4.         if (stateInfo.IsName(IdleState))  
    5.         {  
    6.             // 在待命状态下,按下攻击键,进入攻击1状态。并记录连击数为1  
    7.             this.animator.SetInteger(ActionCMD, 1);  
    8.             this.curComboCount = 1;  
    9.         }  
    10.         else if (stateInfo.IsName(AtkSliceState))  
    11.         {  
    12.             // 在攻击1状态下,按下攻击键,记录连击数为2(切换状态在Update()中)  
    13.             this.curComboCount = 2;  
    14.         }  
    15.         else if (stateInfo.IsName(AtkStabState))  
    16.         {  
    17.             // 在攻击2状态下,按下攻击键,记录连击数为3(切换状态在Update()中)  
    18.             this.curComboCount = 3;  
    19.         }  
    20.     }     


    这里必须注意的是该。在Update() 二手0.6和0.8 分别低于目前的状态应该跳转到待机参数Exit Time(这一次也正交)
  • 相关阅读:
    hdu 4308 Saving Princess claire_ BFS
    进程调度
    LinearLayout具体解释一:LinearLayout的简单介绍
    CSS: 解决Div float后,父Div无法高度自适应的问题
    框架布局FrameLayout
    Coundn't load memtrack module (No such file or directory)
    线性布局LinearLayout
    android视图概述
    activity状态的保存和恢复
    回溯和DFS效率分析
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4752966.html
Copyright © 2011-2022 走看看