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)状态机设置完毕之后,要做的就是在代码中完毕对当前状态的推断,以及对状态參数的设置。用以完毕动画状态机的切换!
- // 使用字符串变量保存当前状态。避免多处引用写错
- 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 4.x 使用Mecanim实现动画控制的更多相关文章
- 五分钟了解Mecanim角色动画系统
http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...
- 深入学习jQuery动画控制
× 目录 [1]动画状态 [2]停止动画 [3]动画延迟[4]全局控制 前面的话 jQuery动画可以使用fade.hide.slide等方法实现基本动画效果,可以使用animate实现自定义动画,甚 ...
- jquery动画控制非css属性
JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...
- [技术博客]Unity3d 动画控制
在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...
- Unity3D 4.x 使用Mecanim实现连击
http://blog.csdn.net/onerain88/article/details/12854817 Unity3D 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前 ...
- Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)
原地址:http://www.unitymanual.com/blog-1801-1221.html unity3d 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前的Anim ...
- Unity3D中使用Leap Motion进行手势控制
Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...
- Demon_动画控制(实现前后左右移动,喊叫)
using UnityEngine; using System.Collections; public class PlayerAnimation : MonoBehaviour { float ve ...
- cocos2dx 动画控制概要
-------------------------------------------------Cocos2d 播放动画Node : 节点,所有显示容器的基础 Sprite : 使用图片的节点 An ...
随机推荐
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
- Linux批量重命名文件
五种方法实现Linux批量重命名文件 Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现. Linux批量重命名文件会涉及到改变一个字母.改 ...
- C#实现的内存分页机制的一个实例
C#实现的内存分页机制的一个实例 //多页索引表管理类(全局主索引表管理类) public class MuliPageIndexFeatureClass : IDisposable { protec ...
- 【PAT】1009. Product of Polynomials (25)
题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1009 分析:简单题.相乘时指数相加,系数相乘即可,输出时按指数从高到低的顺序.注意点:多项式相 ...
- Objective-c 程序结构
类是Objective-c的核心,Objective-c程序都是围绕类进行的.Objective-c程序至少包含以下三个部分: 1.类接口:定义了类的数据和方法,但是不包括方法的实现代码. 2.类实现 ...
- Sql server 事务 存储过程
事务( Transaction )是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起, ...
- linux下TUN/TAP虚拟网卡的使用
转载:http://wushank.blog.51cto.com/3489095/1306849 tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设 ...
- C/C++ 笔试、面试题目大汇总(转)
这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 转自fangyukuan,地址http://www.cnbl ...
- C++类的封装_工程
一个C++工程 main.cpp #include<stdio.h> #include"Array.h" int main(){ Array a1(10); f ...
- ELF文件数据布局探索(1)
作为一名Linux小白,第一次看到a.out这个名字,感觉实在是奇怪,搜了一下才知道这是编译器输出的默认可执行文件名 然后vi一下,哇,各种乱码,仔细看看,发现了三个清晰的字符ELF.继续搜索, 第一 ...