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. private Animator animator = null;
  9. // 当前连击数(即 玩家按下攻击键的次数)
  10. 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. if (stateInfo.IsName(AtkSliceState) && (stateInfo.normalizedTime > 0.6f) && (this.curComboCount == 2))
  10. {
  11. // 当在攻击1状态下,而且当前状态执行了0.6正交化时间(即动作时长的60%),而且用户在攻击1状态下又按下了“攻击键”
  12. this.animator.SetInteger(ActionCMD, 1);
  13. }
  14. if (stateInfo.IsName(AtkStabState) && (stateInfo.normalizedTime > 0.8f) && (this.curComboCount == 3))
  15. {
  16. // 挡在攻击2状态下(同理攻击1状态)
  17. this.animator.SetInteger(ActionCMD, 1);
  18. }
  19. if (Input.GetKeyUp(KeyCode.J))
  20. {
  21. // 监听用户输入(如果J键为攻击键)
  22. Attack();
  23. }
  24. }
  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(这一次也正交)

Unity3D 4.x 使用Mecanim实现动画控制的更多相关文章

  1. 五分钟了解Mecanim角色动画系统

    http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...

  2. 深入学习jQuery动画控制

    × 目录 [1]动画状态 [2]停止动画 [3]动画延迟[4]全局控制 前面的话 jQuery动画可以使用fade.hide.slide等方法实现基本动画效果,可以使用animate实现自定义动画,甚 ...

  3. jquery动画控制非css属性

    JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...

  4. [技术博客]Unity3d 动画控制

    在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...

  5. Unity3D 4.x 使用Mecanim实现连击

    http://blog.csdn.net/onerain88/article/details/12854817 Unity3D 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前 ...

  6. Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)

    原地址:http://www.unitymanual.com/blog-1801-1221.html unity3d 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前的Anim ...

  7. Unity3D中使用Leap Motion进行手势控制

    Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...

  8. Demon_动画控制(实现前后左右移动,喊叫)

    using UnityEngine; using System.Collections; public class PlayerAnimation : MonoBehaviour { float ve ...

  9. cocos2dx 动画控制概要

    -------------------------------------------------Cocos2d 播放动画Node : 节点,所有显示容器的基础 Sprite : 使用图片的节点 An ...

随机推荐

  1. VC获取精确时间的做法

    声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法.非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出. 对关注性能的 ...

  2. nodejs--express开发博客系统(三)

    上一节已经实现了登录.注册.发表文章和文章读取的功能,今天咱加上评论.文章页面和作者页面. 评论只能在进入文章页面后才能进行,所以咱们先写文章页面. 在上一节的代码中,我已经给文章标题添加了超链接了, ...

  3. C++ 经常使用类 string类

    ===6.3.2使用string对象=== string word="I love China" *链接字符串* string description=adjective  + & ...

  4. Struts2之—集成Json插件实现Ajax

       上篇博客介绍了Struts2中自己定义结果集实现Ajax,也分析了它的缺点:这样自己定义的结果集,写死了,不能做到client须要什么数据就传什么数据:Struts2之-自己定义结果集实现aja ...

  5. Connection for controluser as defined in your configuration failed.

    在mysql中使用事件调度器(计划任务), 语句写好了,运行也ok,可是却没有预期的结果.网上总结了非常多计划任务失效的原因.没有一种适合我. 在phpmyadmin中打开事件表,发现以下一串红色的提 ...

  6. Ext JS学习第十天 Ext基础之动态加载JS文件(补充)

    此文用来记录学习笔记: •Ext4.x版本提供的一大亮点就是Ext.Loader这个类的动态加载机制!只要遵循路径规范,即可动态加载js文件,方便把自己扩展组件动态加载进来,并且减轻浏览器的压力. • ...

  7. Ext JS学习第十五天 Ext基础之 Ext.DomQuery

    此文同来记录学习笔记 •Ext.dom.Query 嗯,这个类一看就是到时做什么事儿的,不用我去过多的解释了.这个类一共提供了8个方法供开发人员去使用. •要说最常用的方法,无非就是Ext.query ...

  8. js中new构造函数的研究

    <javascript高级编程>里对new操作符的解释: new操作符会让构造函数产生如下变化: 1.       创建一个新对象: 2.       将构造函数的作用域赋给新对象(因此t ...

  9. javaweb学习路之三--websocket多人在线聊天

    在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...

  10. C#_会员管理系统:开发七(用户分类)

    登录界面(VIPLogin.cs)详细代码: using System; using System.Collections.Generic; using System.ComponentModel; ...