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)状态机设置完毕之后,要做的就是在代码中完毕对当前状态的推断,以及对状态參数的设置。用以完毕动画状态机的切换!

[csharp] view plaincopyprint?
  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() 中依据当前状态和输入參数促使状态切换

[csharp] view plaincopyprint?
  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. }
[csharp] view plaincopyprint?
  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(这一次也正交)

转载于:https://www.cnblogs.com/hrhguanli/p/4752966.html

Unity3D 4.x 使用Mecanim实现动画控制相关推荐

  1. Unity3D 角色基本行走和旋转动画控制Demo

    在Unity3D中,角色的移动控制的有两种方式. Animator enable root motion Animator disable root motion 如果勾选了 root motion ...

  2. unity3d中animator和animation k动画注意点和问题 无法播放等等

    一般情况下有时候为了方便或者是好控制, 会在unity3d中直接用animation进行k动画操作 但是有的时候就会发现有的animation无法拖入到animator 或者是有的animation组 ...

  3. 五分钟了解Mecanim角色动画系统

    http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...

  4. [教程] 五分钟了解Mecanim角色动画系统

    Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动作导入流程,似乎对这个新的动画系统不是很适应,有鉴于此,我们希望通过这次的教程来让更多的朋友快速 ...

  5. 高仿腾讯QQ Xplan(X计划)的H5页面(2):动画控制

    上一篇知道如何制作threejs地球之后,就正式coding了,当然还是使用最心爱的Vue.本篇会有一些代码,但是都是十几行的独立片段,相信你不用担心. 布局 在进入本篇主题前,要简单看一下xplan ...

  6. 【Unity】角色动画控制

    场景 记录一下unity中的角色动画控制 通常角色的动画都是通过Animator状态机进行状态间的切换的 在状态机中,每个状态间的连线(Transitions)是通过以下4种条件触发的 Float,I ...

  7. unity 2D动画控制一些小技巧

    一.以下是直接获取动画控制器中的某个动画状态的长度. 使用代码: AnimatorExt.GetClipLength(m_Animator, "Run") public stati ...

  8. OSG 飞机路径动画控制

    OSG 飞机路径动画控制 注:摘自<三维渲染引擎编程指南> 本文实现一个飞机,在地图上空盘旋,读者可以根据自己需要进行更改: 代码如下: //2017. 8 .29 #include &l ...

  9. Unity3D教程:如何使用脚本进行控制

    首先,选择GameObject->Create Other->Cube创建一个立方体.我们将该场景另存为TankWar0.2做好版本控制.调整正方体和摄像机的位置,大致能在屏幕中看到摄像机 ...

最新文章

  1. Java获取Mybatis动态生成的sql
  2. Web Serveice服务代理类生成及编译
  3. 老咸鱼今天告诉你用Python matplotlib 各种图绘制流线图,难怪老板放纵他
  4. linux ext4 img解包打包教程,解打包.img.ext4(转)
  5. opencv nms 学习笔记
  6. angular4更改表单中显示的值_Angular 4 动态表单教程 Reactive Forms教程
  7. 经典C语言程序100例之八六
  8. openwrt 遍译php_openwrt安装编译
  9. 大整数加法(信息学奥赛一本通-T1168)
  10. 面试题:二叉树中和为某一路径
  11. 运维测试工作笔记0004---各种免费开源的测试平台
  12. 如何运行Spark程序
  13. 【SSM 1】SpringMVC、Spring和Struts的区别
  14. OCR 常用软件对比
  15. python 3des加密_python3使用3des加密
  16. 马未都说收藏:陶瓷篇(6、7)宋代八大民窑
  17. 烟花背景的3D打字魔方相册(末尾附加下载地址)
  18. 虚幻引擎4(UE4)的基本操作Actor的操作
  19. java对齐_java字符串对齐方法
  20. matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...

热门文章

  1. 将Win10包含中文的用户名改为英文的,解决Anaconda navigator无法运行jupyter的问题
  2. 二十八、PHP框架Laravel学习笔记——模型的关联查询
  3. LeetCode 2080. 区间内查询数字的频率(哈希+二分查找)
  4. LeetCode 2062. 统计字符串中的元音子字符串
  5. LeetCode 2042. 检查句子中的数字是否递增
  6. 天池 在线编程 最小振幅(排序)
  7. 牛客 奇怪的排序问题(单调栈/遍历)
  8. LeetCode 484. 寻找排列(找规律+贪心)
  9. LeetCode 1015. 可被 K 整除的最小整数(数学)
  10. LeetCode 532. 数组中的K-diff数对