Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)
原地址: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)状态机设置完成之后,要做的就是在代码中完成对当前状态的判断,以及对状态参数的设置,用以完成动画状态机的切换!
- // 使用字符串变量保存当前状态,避免多处引用写错
 - private static readonly string IdleState = "BaseLayer.Idle";
 - private static readonly string AtkSliceState = "BaseLayer.AtkSlice";
 - private static readonly string AtkStabState = "BaseLayer.AtkStab";
 - private static readonly string AtkCleave = "BaseLayer.AtkCleave";
 - // 动画状态机参数Key
 - private static readonly string ActionCMD = "ActionCMD";
 - private Animator animator = null;
 - // 当前连击数(即 玩家按下攻击键的次数)
 - private int curComboCount = 0;
 
(2)在Start() 中获取Animator组件引用
(3)在Update() 中根据当前状态和输入参数促使状态切换
- void Update()
 - {
 - AnimatorStateInfo stateInfo = this.animator.GetCurrentAnimatorStateInfo(0);
 - if (!stateInfo.IsName(IdleState))
 - {
 - // 每次设置完参数之后,都应该在下一帧开始时将参数设置清空,避免连续切换
 - this.animator.SetInteger(ActionCMD, 0);
 - }
 - if (stateInfo.IsName(AtkSliceState) && (stateInfo.normalizedTime > 0.6f) && (this.curComboCount == 2))
 - {
 - // 当在攻击1状态下,并且当前状态运行了0.6正交化时间(即动作时长的60%),并且用户在攻击1状态下又按下了“攻击键”
 - this.animator.SetInteger(ActionCMD, 1);
 - }
 - if (stateInfo.IsName(AtkStabState) && (stateInfo.normalizedTime > 0.8f) && (this.curComboCount == 3))
 - {
 - // 挡在攻击2状态下(同理攻击1状态)
 - this.animator.SetInteger(ActionCMD, 1);
 - }
 - if (Input.GetKeyUp(KeyCode.J))
 - {
 - // 监听用户输入(假设J键为攻击键)
 - Attack();
 - }
 - }
 
- void Attack()
 - {
 - AnimatorStateInfo stateInfo = this.animator.GetCurrentAnimatorStateInfo(0);
 - if (stateInfo.IsName(IdleState))
 - {
 - // 在待命状态下,按下攻击键,进入攻击1状态,并记录连击数为1
 - this.animator.SetInteger(ActionCMD, 1);
 - this.curComboCount = 1;
 - }
 - else if (stateInfo.IsName(AtkSliceState))
 - {
 - // 在攻击1状态下,按下攻击键,记录连击数为2(切换状态在Update()中)
 - this.curComboCount = 2;
 - }
 - else if (stateInfo.IsName(AtkStabState))
 - {
 - // 在攻击2状态下,按下攻击键,记录连击数为3(切换状态在Update()中)
 - this.curComboCount = 3;
 - }
 - }
 
这里需要注意的是,在Update() 中使用的0.6和0.8 应该分别小于当前状态跳转到待命状态的参数Exit Time(这个时间也是正交化的)
Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)的更多相关文章
- 跟我从零基础学习Unity3D开发--NGUI入门基础
		
英雄联盟(撸啊撸) QQ飞车 魔兽世界等等相信大家都玩过游戏吧,玩过那UI知道是什么吧?UI可能说得有点专业的话那么游戏中那些属性面板例如: 现在对UI有一定认识了吧!回想一下您玩过的游戏就一定知道什 ...
 - 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)
		
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...
 - Unity3d开发IOS游戏 基础
		
Unity3d开发IOS游戏 基础 @阿龙 - 649998群 1.先说明两个问题,我在WIN7下面的U3D里面,用了雅黑字体,但是导出为ios后,字体就看不见了,这是为什么呢?这是需要在MAC下找 ...
 - Unity3D开发必备神器(Visual Studio Tools for Unity)
		
Unity3D开发必备神器(Visual Studio Tools for Unity) 开发Unity3D程序你用的什么IDE呢? 1.MonoDevelop 2.VS 可能你的回答是这样的,我用的 ...
 - 添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三)
		
添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blo ...
 - unity3d开发实战《啪啪三国》技术详解!
		
去年11月,上海火溶网络CEO王伟峰以其第一款3d手游产品<啪啪三国>为例,着重讲解了unity3D手机网游开发的经验,其中涉及了团队组成.人员要求.常见的unity3d开发遇到的坑及解 ...
 - 菜鸟在线教你用Unity3D开发VR版的Hello World
		
大家好,我是菜鸟在线的小编.这篇短文将告诉大家如何用Unity3D开发VR版的Hello World. 1开启SteamVR并连接Vive设备 (a)登录Steam客户端,并点击右上角的VR按钮,这时 ...
 - Unity3D开发七惑
		
使用Unity3D开发也有大半年了,心中存惑如下,愿与各位开发者一起探讨: (1) 远离普适编程之惑 随着游戏引擎的不断发展,游戏程序员的开发层级也越来越高,以unity3d尤为突出.如果是进行We ...
 - unity3d开发app的框架
		
unity3d开发app的框架,开源地址 https://coding.net/u/liuhaili/p/U3DApp/git 希望能和有相同兴趣的朋友一起完善 打开Scene下的MainUI场景 目 ...
 - 使用unity3d开发app
		
做过一些项目,参入过一些项目的计划安排.总觉得一些工具用起来很麻烦,要么是要收费,要么很大很重.没有针对小团队的简单易用的任务管理工具,也可能是找了些不能适合自己的习惯. 所有准备开始自己开发一款项目 ...
 
随机推荐
- python简单爬虫编写
			
1.主要学习这程序的编写思路 a.读取解释网站 b.找到相关页 c.找到图片链接的元素 d.保存图片到文件夹 ..... 将每一个步骤都分解出来,然后用函数去实现,代码易读性高. ##代码尽快运行时会 ...
 - WCF之服务元数据
			
服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点 ...
 - (转)Linux vmstat命令实战详解
			
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...
 - daxuez.com
			
大学z,一个还没想好的名字和项目 初期定位:服务于武汉各大高校的大学学生群体 服务项目:兼职.旅游.培训.租车.班服订做.票务
 - 【风马一族_git_github】git的工作流程
			
git有三个区域(如图): 基本信息设置 1)设置用户名 git config --global user.name "帐号名" 2)设置用户名邮箱 git config ...
 - 转:Apache与Nginx的优缺点比较
			
Apache与Nginx的优缺点比较 http://weilei0528.blog.163.com/blog/static/206807046201321810834431/ 1.nginx相对于ap ...
 - PHP中文URL编解码(urlencode()rawurlencode()
			
PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码为 '+',而后者把空格编码为 '%20',不过应该注意的是,在编码时应该只 ...
 - Windows下关于Composer使用时出现的问题及解决办法
			
问题一: Fatal error: Call to undefined method Composer\Package\CompletePackage::getTrans portOptions() ...
 - 如何在ARC代码中混编非ARC代码
			
“ios中如果arc和非arc文件混编,可以在build parses中指定compile flags,如果arc文件设为"-fobjc-arc",非arc文件设为"-f ...
 - easyui菜单栏的使用
			
<div id="tabs" class="easyui-tabs" data-options="plain:true,fit:true,bor ...