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(这一次也正交)
转载于:https://www.cnblogs.com/hrhguanli/p/4752966.html
Unity3D 4.x 使用Mecanim实现动画控制相关推荐
- Unity3D 角色基本行走和旋转动画控制Demo
在Unity3D中,角色的移动控制的有两种方式. Animator enable root motion Animator disable root motion 如果勾选了 root motion ...
- unity3d中animator和animation k动画注意点和问题 无法播放等等
一般情况下有时候为了方便或者是好控制, 会在unity3d中直接用animation进行k动画操作 但是有的时候就会发现有的animation无法拖入到animator 或者是有的animation组 ...
- 五分钟了解Mecanim角色动画系统
http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...
- [教程] 五分钟了解Mecanim角色动画系统
Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动作导入流程,似乎对这个新的动画系统不是很适应,有鉴于此,我们希望通过这次的教程来让更多的朋友快速 ...
- 高仿腾讯QQ Xplan(X计划)的H5页面(2):动画控制
上一篇知道如何制作threejs地球之后,就正式coding了,当然还是使用最心爱的Vue.本篇会有一些代码,但是都是十几行的独立片段,相信你不用担心. 布局 在进入本篇主题前,要简单看一下xplan ...
- 【Unity】角色动画控制
场景 记录一下unity中的角色动画控制 通常角色的动画都是通过Animator状态机进行状态间的切换的 在状态机中,每个状态间的连线(Transitions)是通过以下4种条件触发的 Float,I ...
- unity 2D动画控制一些小技巧
一.以下是直接获取动画控制器中的某个动画状态的长度. 使用代码: AnimatorExt.GetClipLength(m_Animator, "Run") public stati ...
- OSG 飞机路径动画控制
OSG 飞机路径动画控制 注:摘自<三维渲染引擎编程指南> 本文实现一个飞机,在地图上空盘旋,读者可以根据自己需要进行更改: 代码如下: //2017. 8 .29 #include &l ...
- Unity3D教程:如何使用脚本进行控制
首先,选择GameObject->Create Other->Cube创建一个立方体.我们将该场景另存为TankWar0.2做好版本控制.调整正方体和摄像机的位置,大致能在屏幕中看到摄像机 ...
最新文章
- Java获取Mybatis动态生成的sql
- Web Serveice服务代理类生成及编译
- 老咸鱼今天告诉你用Python matplotlib 各种图绘制流线图,难怪老板放纵他
- linux ext4 img解包打包教程,解打包.img.ext4(转)
- opencv nms 学习笔记
- angular4更改表单中显示的值_Angular 4 动态表单教程 Reactive Forms教程
- 经典C语言程序100例之八六
- openwrt 遍译php_openwrt安装编译
- 大整数加法(信息学奥赛一本通-T1168)
- 面试题:二叉树中和为某一路径
- 运维测试工作笔记0004---各种免费开源的测试平台
- 如何运行Spark程序
- 【SSM 1】SpringMVC、Spring和Struts的区别
- OCR 常用软件对比
- python 3des加密_python3使用3des加密
- 马未都说收藏:陶瓷篇(6、7)宋代八大民窑
- 烟花背景的3D打字魔方相册(末尾附加下载地址)
- 虚幻引擎4(UE4)的基本操作Actor的操作
- java对齐_java字符串对齐方法
- matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...
热门文章
- 将Win10包含中文的用户名改为英文的,解决Anaconda navigator无法运行jupyter的问题
- 二十八、PHP框架Laravel学习笔记——模型的关联查询
- LeetCode 2080. 区间内查询数字的频率(哈希+二分查找)
- LeetCode 2062. 统计字符串中的元音子字符串
- LeetCode 2042. 检查句子中的数字是否递增
- 天池 在线编程 最小振幅(排序)
- 牛客 奇怪的排序问题(单调栈/遍历)
- LeetCode 484. 寻找排列(找规律+贪心)
- LeetCode 1015. 可被 K 整除的最小整数(数学)
- LeetCode 532. 数组中的K-diff数对