http://blog.csdn.net/onerain88/article/details/12854817

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(这个时间也是正交化的)

Unity3D游戏开发之ACT游戏三连击效果实现综述

http://wmyouxi.com/a/12582.html

在研究了unity3d Mecanim动画系统的重定向特性后,今天我们继续来探索Mecanim动画系统更多的特性吧。今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于unity3d目 前存在Animation和Animator两种类型的动画组件,因此本文将分别讲这两种类型的动画组件的三连击效果的实现,其中Animation组件 是Unity3.5以下版本所使用的动画组件,Animator组件是目前Unity3D的Mecanim动画系统所使用的动画组件。

  我们首先来了解三连击效果的具体流程,假定角色当前处于Idle状态,此时玩家如果按下攻击键则进入Attack1状态,如果在规定的时间内,玩家继 续按下攻击键则进入Attack2状态,否则返回到Idle状态;同理,如果角色处于Attack2状态,如果此时玩家按下攻击键则进入Attack3状 态,否则返回Idle状态;当Attack3状态结束后,将返回到Idle状态,等待玩家触发下一次攻击。由此我们可以归纳出三连击的状态变化:
(1)Idle->Attack1->Idle
(2)Idle->Attack1->Attack2->Idle
(3)Idle->Attack1->Attack->Attack3->Idle

通过状态变化情况我们可以考虑使用两种思路来实现三连击效果。第一种思路是,各状态动画相互独立,通过状态切换来实现整体的动画效果。第二种思路是,美工 人员将各状态动画以序列形式,程序设计人员根据时间来控制动画效果。今天我们主要采用第一种方法,目的是领会游戏设计中的有限状态机思想,将其更好的应用 到游戏开发中。好了,下面我们正式开始今天的内容吧!

一、Animator组件

Animator组件是Unity3D的Mecanim动画系统所使用的动画组件。这个组件通过Animator Controller来实现对动画的控制。如图是我们今天项目的主角,一个左手持盾,右手持剑的女战士。

我们首先来创建一个Animator Controller并将其命名为SwordGirlController,双击打开Animator窗口,按照我们对状态变化情况的讨论,我们可以很容易地设计出下面的状态模型:

  在这里我们定义一个整型变量ActionID,其默认值为0。当ActionID的值为1时角色由Idle切换到Attack1,当ActionID的值 为2时角色由Attack1切换到Attack2,当ActionID为3时角色由Attack2切换到Attack3。所有的指向Idle的连线的切换 条件是ActionID的值为0。这样我们就建立了一个动画切换的状态模型。好了,下面我们来编写脚本实现对动画的控制:

[JavaScript] 纯文本查看 复制代码

//基于Mecanim动画系统的三连击效果,目前最大的问题就是玩家在攻击后无法

Unity3D 4.x 使用Mecanim实现连击的更多相关文章

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

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

  2. Unity3D 4.x 使用Mecanim实现动画控制

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

  3. unity博文搜集

    一.综合篇 1. 脚本 unity3d脚本编程基础 2.Mecanim 使用Mecanim实现连击 3. 数学图形学 U3D需要用到的数学基础  2 4. shader 猫都能学会的Unity3D S ...

  4. unity学习路线_重新出发

    入门级 1.先观看视频教程做一个小案例 官方英文:Unity - Learn – Modules 国内中文:Sike学院 基础级 1.你需要接触完整性的教程网站 Siki学院 Unity游戏开发从入门 ...

  5. Unity3D Mecanim 动画系统骨骼动画问题解决方法

    http://7dot9.com/2014/08/16/unity3d-mecanim%E5%8A%A8%E7%94%BB%E7%B3%BB%E7%BB%9F%E9%AA%A8%E9%AA%BC%E5 ...

  6. Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用

    动作游戏 还记得读书的时候熬夜打<波斯王子>的时光,我们的王子通过跳跃穿过墙壁的小洞.在高层建筑上进行攀爬和跳跃,还有在操作失误掉下高楼和触发必死机关后使用时之沙的时光倒流功能回归死亡之前 ...

  7. Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关

    资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBu ...

  8. Unity3D之Mecanim动画系统学习笔记(二):模型导入

    我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...

  9. Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统

    Mecanim简介 Mecanim动画系统是Unity3D4.0开始引入的一套全新的动画系统,主要提供了下面4个方面的功能: 针对人形角色提供一套特殊的工作流. 动画重定向的能力,可以非常方便的把动画 ...

随机推荐

  1. checkbox radio select绑定

    index11.html <html><head> <title>checkbox radio select绑定</title> <script ...

  2. C#基础知识系列五(构造函数)

    前言 本节主要来学习下实例构造函数.私有构造函数和静态构造函数. 构造函数的作用: 1.当一个类在new实例化对象时,可调用构造函数进行初始化对象. 2.不带参数的构造函数称为“默认构造函数”. 无论 ...

  3. java中的hashcode

    hashcode的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode.在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括 ...

  4. CSS3媒体查询

    随着响应式设计模型的诞生,Web网站又要发生翻天腹地的改革浪潮,可能有些人会觉得在国内IE6用户居高不下的情况下,这些新的技术还不会广泛的蔓延下去,那你就错了,如今淘宝,凡客,携程等等公司都已经在大胆 ...

  5. 【HDU 5438】Ponds

    题意 不断删去度数为1的点,最后求有奇数个点的联通块的权值之和. 分析 存边的时候,要头尾都存这个边.用dfs或者队列删点,再用并查集或者dfs确定联通块,然后统计联通块的点数,最后累加. 我自己写的 ...

  6. BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!

    绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...

  7. Springside学习

    http://blog.chinaunix.net/uid-122937-id-3935052.html [一]Maven + Eclipse + springside4安装与配置 Maven安装与配 ...

  8. BZOJ2186 欧拉函数

    欧拉函数:一般记作φ(n),表示1-n中与n互质的数的数量. 欧拉函数是积性函数,即φ(m*n)=φ(m)*φ(n) //这条定理基友面试时还遇到了= = 欧拉函数的值φ(n)=n*(1-p[1])* ...

  9. [转]ubuntu安装光盘修复grub-rescue引导失败问题

    Reference:http://liujianqiao398.blog.163.com/blog/static/181827257201292775649815/ 1.步骤一 以试用方式进入ubun ...

  10. 洛谷P2279 [HNOI2003]消防局的设立

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...