原地址:http://www.unitymanual.com/blog-1801-1221.html

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开发(五):Unity3D 4.x 使用Mecanim实现连击(转)的更多相关文章

  1. 跟我从零基础学习Unity3D开发--NGUI入门基础

    英雄联盟(撸啊撸) QQ飞车 魔兽世界等等相信大家都玩过游戏吧,玩过那UI知道是什么吧?UI可能说得有点专业的话那么游戏中那些属性面板例如: 现在对UI有一定认识了吧!回想一下您玩过的游戏就一定知道什 ...

  2. 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...

  3. Unity3d开发IOS游戏 基础

    Unity3d开发IOS游戏 基础 @阿龙 -  649998群 1.先说明两个问题,我在WIN7下面的U3D里面,用了雅黑字体,但是导出为ios后,字体就看不见了,这是为什么呢?这是需要在MAC下找 ...

  4. Unity3D开发必备神器(Visual Studio Tools for Unity)

    Unity3D开发必备神器(Visual Studio Tools for Unity) 开发Unity3D程序你用的什么IDE呢? 1.MonoDevelop 2.VS 可能你的回答是这样的,我用的 ...

  5. 添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三)

    添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blo ...

  6. unity3d开发实战《啪啪三国》技术详解!

     去年11月,上海火溶网络CEO王伟峰以其第一款3d手游产品<啪啪三国>为例,着重讲解了unity3D手机网游开发的经验,其中涉及了团队组成.人员要求.常见的unity3d开发遇到的坑及解 ...

  7. 菜鸟在线教你用Unity3D开发VR版的Hello World

    大家好,我是菜鸟在线的小编.这篇短文将告诉大家如何用Unity3D开发VR版的Hello World. 1开启SteamVR并连接Vive设备 (a)登录Steam客户端,并点击右上角的VR按钮,这时 ...

  8. Unity3D开发七惑

    使用Unity3D开发也有大半年了,心中存惑如下,愿与各位开发者一起探讨: (1)  远离普适编程之惑 随着游戏引擎的不断发展,游戏程序员的开发层级也越来越高,以unity3d尤为突出.如果是进行We ...

  9. unity3d开发app的框架

    unity3d开发app的框架,开源地址 https://coding.net/u/liuhaili/p/U3DApp/git 希望能和有相同兴趣的朋友一起完善 打开Scene下的MainUI场景 目 ...

  10. 使用unity3d开发app

    做过一些项目,参入过一些项目的计划安排.总觉得一些工具用起来很麻烦,要么是要收费,要么很大很重.没有针对小团队的简单易用的任务管理工具,也可能是找了些不能适合自己的习惯. 所有准备开始自己开发一款项目 ...

随机推荐

  1. php29号小结(隔行换色······)

    1.给表单加样式,可以用css.php与js.js这三种,其中最好用php与js,现在很推广用这种. css3样式隔行换色(table中) tr:nth-child(even){ background ...

  2. 分享10款功能强大的HTML5/CSS3应用插件

    1.纯CSS3美化Checkbox和Radiobox按钮 外观很时尚 利用CSS3我们可以打造非常具有个性化的用户表单,今天我们就利用CSS3美化Checkbox复选框和Radiobox单选框.CSS ...

  3. SNRO:Number Range

    业务对象是在一定的编号范围内分配编号的,编号既可以是内部分配也可以是外部分配.对于外部分配,用户输入编号,系统检查这个编号是否被占用.对于内部分配,系统会自动的把编号分配给业务对象.所以内部分配和外部 ...

  4. Css background缩写

    例子: background:url(../images20130624/bg.png) no-repeat -1424px -5px; 官方API Value: ['background-color ...

  5. Mongodb Java Driver 参数配置解析

    要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...

  6. as 和is的区别

    is 1,检查对象的兼容性,并返回true或false 2,不会抛出异常 3,null永远返回false as 1,检查对象的兼容性,并返回 true或false 2,不会抛出异常 3,null将抛出 ...

  7. 新手自学ABAP(1)--数据类型

    一.DATA语句 1.TYPE type ex:  可以利用冒号声明多个变量. DATA : gv_num1 TYPE I,   gv_num2 TYPE I. 2.LIKE num   (num可以 ...

  8. Hiberante+jpa,注解生成32字符的Id

    @Id @GenericGenerator(name = "id-generator", strategy = "uuid") @GeneratedValue( ...

  9. FastLoad错误 — SELECT Failed. 2652

    SELECT * FROM   teradata_education. emp_fl;     在做查询时碰到2652错误.   SELECT Failed. 2652: Operation not ...

  10. POJ 1195 2维线段树(树套树实现) 树状数组

    1: #include <stdio.h> 2: #include <string.h> 3: #include <stdlib.h> 4: #include &l ...