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

[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.   
  9.     private Animator animator = null;  
  10.     // 当前连击数(即 玩家按下攻击键的次数)  
  11.     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.   
  10.         if (stateInfo.IsName(AtkSliceState) && (stateInfo.normalizedTime > 0.6f) && (this.curComboCount == 2))  
  11.         {  
  12.             // 当在攻击1状态下,而且当前状态执行了0.6正交化时间(即动作时长的60%),而且用户在攻击1状态下又按下了“攻击键”  
  13.             this.animator.SetInteger(ActionCMD, 1);  
  14.         }  
  15.         if (stateInfo.IsName(AtkStabState) && (stateInfo.normalizedTime > 0.8f) && (this.curComboCount == 3))  
  16.         {  
  17.             // 挡在攻击2状态下(同理攻击1状态)  
  18.             this.animator.SetInteger(ActionCMD, 1);  
  19.         }  
  20.   
  21.         if (Input.GetKeyUp(KeyCode.J))  
  22.         {  
  23.             // 监听用户输入(如果J键为攻击键)  
  24.             Attack();  
  25.         }  
  26.     }  

[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国国家重点实验室分布总览

来源:114产学研在我国的科研平台,企业国家重点实验室、国家重点实验室和省部共建国家重点实验室在科学前沿探索和解决国家重大需求方面发挥了非常重要的作用,在科学研究方面取得不少具有国际先进水平的成果。2018年5月21日,科技部…

能源枯竭?在能源互联网时代不存在!

曹军威清华大学信息技术研究院研究员、副院长北京智中能源互联网研究院首席科学家来源:DeepTech深科技演绎inSite第十一期节目能量路由器离我们还远吗?曹军威演绎inSite演讲视频链接:以下为曹军威老师演讲文字稿:(根据…

Django3 --- ASGI

1. 什么是WSGI 1.1 CGI 解释 WSGI 之前应该先说一下什么是 CGI(通用网关接口,Common Gateway Interface,CGI),是Web 服务器运行时外部程序的规范 , 是外部扩展应用程序与 Web 服务器交互的一个标准接口。…

网络安全:等保2.0落地在即,触发五百亿新增市场

报告数据来源:华创证券、东方财富、东吴证券前 言:据公安部十一局七处处长祝国邦:《网络安全等级保护技术》2.0版本将于5月13日发布。相比等保1.0只针对网络和信息系统,等保2.0把云计算、大数据、物联网等新业态也纳入了监管&…

Django3 --- async

官方文档:https://docs.djangoproject.com/en/3.2/releases/3.0/ Django 3.0 通过提供对作为ASGI应用程序运行的支持,开始了我们使 Django 完全具有异步能力的旅程。 Django 3.1于2020年8月4日发布!从3.1版本开始,Django将逐步原…

产业|一文读懂自动驾驶汽车产业链上下游

来源: 亿欧自动驾驶汽车它的产业链上下游已经出现支撑公司,并在逐渐走向成熟。自动驾驶分级标准 关于自动驾驶的分级,主要有SAE(美国机动车工程师学会)标准和NHTSA(国家公路交通安全管理局)两个…

AI教父杰弗里辛顿:AI反学习可能揭开人类梦境的奥秘

来源:网易智能近日,多伦多大学的教员、谷歌大脑(Google Brain)研究员杰弗里辛顿(Geoffrey Hinton)发表了炉边谈话。他讨论了神经网络的起源,以及人工智能有朝一日可能像人类一样推理的可行性和意…

AttributeError: partially initialized module ‘aiohttp‘ has no attribute ‘ClientSession‘ (most...)

AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely due to a circular import) 问题描述: AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely…

AIoT重磅报告:四大关键助力,AI+IoT重新定义未来的可能性

来源:北京物联网智能技术应用协会,智能巅峰导 读随着科技的不断发展,一些在功能上具有相互补充作用的技术正在不可避免地发生结合——例如,人工智能(AI)和物联网(IoT)。在本文中,我…

python---aiohttp库

python—aiohttp库 1. 什么事aiohttp 官方网址:https://docs.aiohttp.org/en/stable/ 用于asyncio和Python的异步HTTP客户端/服务器 2. 安装 pip install aiohttp3. ClientSession() Session封装了一个连接池(connector instance)&…

关于机器学习实战,那些教科书里学不到的12个“民间智慧”

来源:towardsml机器学习算法被认为能够通过学习数据来弄清楚如何执行重要任务。这意味着数据量越大,这些算法就可以解决更加复杂的问题。然而,开发成功的机器学习应用程序需要一定的“民间技巧”,这在教科书或机器学习入门课程中很…

jsonp模拟获取百度搜索相关词汇

随便写了个jsonp模拟百度搜索相关词汇的小demo&#xff0c;帮助新手理解jsonp的用法。 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>模拟百度搜索框</title><style>*{margin: 0;padding:…

亚马逊自动打包机:1机可顶24人

来源&#xff1a;网易科技5月14日据国外媒体报道&#xff0c;电商亚马逊公司正在推出能够自动打包订购商品的机器&#xff0c;从而解放数千名员工。该项目的两名工作人员表示&#xff0c;亚马逊近年来开始在少数几个仓库中增加这项技术&#xff0c;扫描从传送带上下来的货物&am…

活着不易,5G时代终端厂商的路在何方?

来源&#xff1a;物联网智库摘要&#xff1a;站在“浮尸遍地”的通信终端的世界里&#xff0c;各大终端厂商无不面临着同一个来自灵魂的拷问&#xff1a;活着不易&#xff0c;5G时代终端厂商的路在何方&#xff1f;从1G模拟通信时代到4G移动宽带时代&#xff0c;全球手机终端厂…

图像处理 --- 一、认识图像处理

声明&#xff1a; 本系列文档由学习哔站视频总结而得&#xff0c;后续会逐渐添加相对应的示例代码&#xff08;python&#xff09; 1. 什么是图像与图像处理 百闻不如一见。 图像是客观对象的一种相似性的、生动性的描述或写真&#xff0c;是人类社会活动中最常用的信息载体…

11款新品,一切为了落地!商汤:普惠AI的时代,来了

来源&#xff1a;网易智能北京时间5月15日&#xff0c;商汤科技在京举办一年一度的人工智能峰会&#xff0c;发布了11款新品&#xff0c;包含6款硬件和多个平台的全面升级。商汤科技CEO徐立在开场演讲中以清明上河图为例&#xff0c;认为人工智能技术的普及正在谱写新时代的人类…

图像处理 --- 二、数字图像处理基础

1. 色度学基础 电磁光波谱组成: 1.1 三基色原理 人眼的视网膜上存在大量能在适当亮度下分辨颜色的锥状细胞&#xff0c;它们分别对应红、绿、蓝三种颜色&#xff0c;即分别对红光、绿光、蓝光敏感。由此&#xff0c;红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;…

Bug调试(lldb)

原文网址&#xff1a;http://www.cnblogs.com/Twisted-Fate/p/4760156.html 今天博主有一些Bug调试的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. Xcode的Bug调试方法大概有以下几种: 1.断点,全局断点,条件断点配合Nslog找出Bug 2.静态分析工具:Analyze,静态检测内…

解密!谷歌这样搞定美军世纪难题,从眼科诊断到无人驾驶

来源&#xff1a;智东西导语&#xff1a;谷歌AI部门负责人Jeff Dean&#xff0c;在开发者大会中详细介绍了该公司如何利用AI技术解决科学问题。5月14日消息&#xff0c;在加利福尼亚州山景城举行的谷歌年度I / O开发者大会上&#xff0c;谷歌研究小组高级研究员、谷歌人工智能部…

CSDN中图片缩放与居中

1. 直接上传图片 代码示例&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628233911771.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYl9mZW5n,size_16,color_FFFFFF,t_70#pic_cent…