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日,科技部…

(算法)宝石升级问题

题目: 有一块宝石,1级升2级成功率100%,2级升3级成功率80%,3级升4级成功率60%,4级升5级成功率40%,每次升级失败时降回到1级。请问一块1级宝石升到5级平均要多少…

python asyncio 异步编程-协程 2

asyncio 异步编程 官方文档: 中文版:https://docs.python.org/zh-cn/3.8/library/asyncio.html英文本:https://docs.python.org/3.8/library/asyncio.html 1. 事件循环 事件循环 是指主线程每次将执行序列中的任务清空后,就去…

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

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

Django3 --- ASGI

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

itextsharp c# asp.net 生成 pdf 文件

一切的开始必须要有2个dll, 可以通过nuget 包xiazai, 关键字是itextsharp. using iTextSharp.text; using iTextSharp.text.pdf; FileStream fs new FileStream(Server.MapPath("pdf") "\\" "First PDF document6.pdf"…

网络安全:等保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(国家公路交通安全管理局)两个…

【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘)

代码: # 执行第一个协程程序 asyncio.run(S.crawl_url())select_date S.select_date() select_keyword S.select_keyword(select_date) # 列表# 第二个协程 loop asyncio.get_event_loop() loop.run_until_complete(asyncio.wait([S.parse_html(url) for url i…

Repository 返回 IQueryable?还是 IEnumerable?

这是一个很有意思的问题,我们一步一步来探讨,首先需要明确两个概念(来自 MSDN): IQueryable:提供对未指定数据类型的特定数据源的查询进行计算的功能。IEnumerable:公开枚举数,该枚举…

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…

关于线程池ThreadPoolExecutor使用总结

本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一、简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit uni…

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

asp.net winform 实现复制,粘贴,剪切功能

System.Windows.Forms.SendKeys.SendWait("^C");//复制System.Windows.Forms.SendKeys.SendWait("^V");//粘贴 System.Windows.Forms.SendKeys.SendWait("^X");//剪切转载于:https://www.cnblogs.com/ninestart/p/4760801.html

aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected

aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected 问题描述: 使用 aiohttp.ClientSession() 爬取数据时出现错误:aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected。 翻译:aiohttp.client_e…

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

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