摘要:通过上一篇咱们知道了播放动画需要使用Animator,那么如何用代码控制动画呢?

洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

“智哥,我现在做的吃鸡游戏没有人物,看着好奇怪啊,从哪能搞点人物模型呢?”

“号外号外:本人已与百度达成合作,以后有任何问题,只要在百度中输入问题就可瞬间获得答案,方便快捷,特此公告,造福大家。”

“智哥没看出来你这么‘牛X’啊”

“去,你这个伸手党家伙,不过我这还真有一个角色的神器,发给你去看看吧”

动画资源神器

小新QQ上收到了智哥发来的链接,https://www.mixamo.com/

小新打开,注册了一个Adobe账户登陆进去,就看到了很多人物的模型。

选好一个人物模型,再切换到Animation,哇,这么多的动作!

“智哥,这个简直是神器啊,有这么多现成的角色模型和动画,还竟然都是免费的”
“哈哈,这是Adobe收购mixamo以后免费开放的,不仅仅有这些哦,这个网站还有一个强大的功能是自动绑定骨骼,如果你有一个角色想在游戏中使用,但是如果连骨骼都没有绑定的话,是没办法用骨骼动画的,也没办法将其他动画重定向到这个模型上。点右上角的UploadCharacter就可以上传自己的模型,自动绑定骨骼了!”
“太棒了!!!”

Mixamo详解: 【建议收藏】找不到免费的角色动画?来试试mixamo

代码控制Animator

“智哥,我搜集了一堆动画,就差把它们组装起来了,给我讲讲如何把这些动画跟我的操作关联起来呗?”

“你来的真是时候,我刚好要休息一会,就给你讲讲吧。还记得之前学过的Animator么?”

“就是那个控制动画播放的东西呗?那个不是只能用于切换动画什么的么?”

“基本都对,不过你那个‘只’字用错了。我们在学Transition的时候,只用到了按播放时间切换动画,但是更强大的功能是按参数切换动画”

“啊?还有这个功能呢?”

“那当然了,我们当时把Animator类比为一个视频播放器,视频播放器在我点击下一个的时候当然要能切换到下一个视频了”

“说的也是,那这个参数在哪设置呢”

“打开Animator看左上角”

“原来都没发现还有一个Parameters”

“你没用到当然没发现了,现在你可以添加一个参数,比如人物的速度”

“好,那我添加一个float类型的speed参数”

“这时候比如你想让人物从静止状态切换到走路状态,就可以加一个transition,条件用speed >0了,你试试”

“添加上了!现在我怎么才能看到效果呢?”

“现在把场景运行起来,手动改一下那个speed的值就能看到效果了!”

“但是现在感觉不太流畅,问题在哪呢?”

“第一个,你这个Transition除了speed大于0这个条件,还有一个条件是Has Exit Time,就是播放完idle的动画并且speed>0才会切换到下一个动画,这个Has Exit Time得去掉。第二个,你这个两个动画都应该是循环播放吧”

“知道了,我改掉再试试”

“改成这样了,嘿嘿,貌似可以了。那我怎么用代码控制呢,比如说我按键盘上WASD的时候控制人物移动。”

“使用动画系统时,有两种控制人物移动的方式:”1 使用动画中的位移

  • 好处是:人物的脚步会跟地面贴合,不会出现滑步的问题(人物的移动距离比步子大或者小),控制简单
  • 缺点是:比较依赖动画的制作,程序控制性不高

2 使用代码控制人物的位移

  • 好处:可控性高
  • 缺点:容易出现滑步,控制复杂

小新:“那我先来试试这个简单的方式吧,使用动画中的位移。”

大智:“这种方式需要先设置两个地方:1、物体上Animator组件的Apply Root Motion需要勾选,相当于就是把动画中的位置修改应用到物体上;2、人物的动画类型需要设置为Humanoid。这两个地方设置好以后,再用代码去修改animator组件中的参数就行了,这个你去看文档!”

“好嘞,我去设置一下”

小新设置完这两个地方后,就开始去查看Animator组件的文档,怎么修改Animator Controller中的参数呢?小新在文档中寻找了半天,并没有找到相关的说明。但是找到了Unity的一篇教程,里面说到设置参数的办法是使用SetInteger、SetFloat、SetBool、SetTrigger四个方法。小新在Unity的API文档中找到了这几个方法,并记下了下面的笔记:

SetInteger、SetFloat、SetBool、SetTrigger分别对应Paramters中的Int、Float、Bool、Trigger类型。

SetInteger有两个重载:

public void SetInteger(string name, int value);
public void SetInteger(int id, int value);

对于第一个重载,第一个参数类型是string,对应的是parameter中的参数名称。第二个参数是要设置的值。

对于第二个重载,第一个参数是animator中parameter中参数的ID什么是参数的ID?

其他SetFloat、SetBool、SetTrigger都类似,但是唯一不同的是SetFoat还有额外的两个重载方法:

public void SetFloat(string name, float value, float dampTime, float deltaTime);
public void SetFloat(int id, float value, float dampTime, float deltaTime);

其中前两个参数和上面是类似的,不同的是后面两个参数。

  • dampTime 阻尼时间。
  • deltaTime 时间增量。隐隐约约感到一股神秘的力量,但是不是特别明白

难点详解

“大智,我看完了,但是我想考考你,嘿嘿,则呢么样?”

“还考我?放马过来吧!”大智内心道:“你这点小技俩我还看不出来,不就是自己没看懂的地方么!”

“听好了,第一题:bool参数和Trigger参数的区别是什么?”

“bool参数和trigger参数很像,都是代表布尔值,但是trigger参数只能被设为true,一旦被transition使用,就会自动被设为false。”

“回答的不错,嗯。。。”小新沉思了10秒钟

“小样儿,就你。bool类型一般用于持续的状态,比如角色是否趴下。而trigger一般用于使用一次就会恢复的状态,比如开枪,开枪动画播放完以后,会自动恢复到之前的动作。

“我明白了。第二题:parameter的id是什么?”

“我们在设置parameter的时候设置的是一个字符串的名称,但是在Unity内部是有一个数字id跟它对应的,使用Animator.StringToHash这个API可以将字符串的参数名转为数字id。使用数字id的代码运行效率会稍微高一些。”

“第三题:SetFloat的那个damp是怎么用的?”

“damp翻译过来一般是阻尼的意思,你可以理解为缓行。这样Fload值会渐变过去,而不是一下子变成设置的Float值,这个在有些情况下很有用,比如人物的速度。玩家按下W的时候,应该是一个逐渐从0到最大速度的过程,而不应该一下从0到最大速度,这时候就可以用到damp。如果你对那两个参数还不知道怎么设置,可以看一下这个公式:”

总结

“看完这个公式我好像明白多了,我得再去试一试”

"我给你简单总结一下:"

  • Animator中可以设置参数,用来控制Transition的变化
  • Has Exit Time也是transition切换的一个条件,只有transition的所有条件都满足时才会进行切换
  • 在代码中可以使用Animator类中的SetXXX方法控制参数,进而控制状态的转换。

今日思考题

“给你布置个思考题,实现人物的站立、走、跑的状态切换”
“收到!我去也!”
“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

扩展阅读

  • Unity动画系统详解1:在Unity中如何制作动画?
  • Unity动画系统详解2:如何导入使用外部的动画?
  • Unity动画系统详解3:如何播放、切换动画?
  • 【建议收藏】找不到免费的角色动画?来试试mixamo
  • 2018.1之后Standard Assets如何安装?
  • 5分钟制作过场动画
  • 5分钟入门Cinemachine智能相机系统
  • Unity编辑器录屏神器:Unity Recorder

呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

T4M插件放入unity后怎么找不到_Unity动画系统详解4:如何用代码控制动画?相关推荐

  1. T4M插件放入unity后怎么找不到_Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)

    摘要:Root Transform是body transform在Y平面上的投影,并且是运行时计算的.每一帧Root Transform的变化实时计算.然后Transform的变化会被应用到GameO ...

  2. T4M插件放入unity后怎么找不到_Unity制作人专场 | 闪耀暖暖从2D到3D的创作与进化之路...

    2019年,Unity在北京.成都.深圳分别举办了三场制作人专场活动,搭建优秀游戏制作人与Unity官方面对面交流的桥梁,内容涵盖项目优化.技术美术与解决方案等多个方面. 本文为大家带来的是叠纸游戏美 ...

  3. T4M插件放入unity后怎么找不到_【Unity俯视角射击】我们来做一个《元气骑士》的完整Demo(五)...

    哈喽大家好,我是yumir. 惯例先上成果链接: TopDownShootingGame - Unity Connect​connect.unity.com (如果链接打不开大家可以晚点再来试一下,U ...

  4. Unity动画系统详解4:如何用代码控制动画?

    摘要:通过上一篇咱们知道了播放动画需要使用Animator,那么如何用代码控制动画呢? 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统 ...

  5. Unity动画系统详解10:子状态机是什么?

    摘要:除了使用Layer还有没有更好的组织状态的方式呢?感觉一个Layer里面状态多的时候,还是很显得很乱. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是复(yu)习( ...

  6. Unity动画系统详解9:Target Matching是什么?

    摘要:在游戏中,经常有这种情况:角色的手或者脚需要在特定时间放在特定的位置.比如角色需要用手撑着跳过一个石头或一堵墙,或者跳起抓住房梁.Target Match就是让动画的特定片段去匹配特定的位置. ...

  7. Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  8. unity velocity_Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  9. Unity动画系统详解8:IK是什么?

    摘要:IK是Inverse Kinematic的缩写,也就是反向动力学.是根据骨骼的终节点来推算其他父节点的位置的一种方法.比如通过手的位置推算手腕.胳膊肘的骨骼的位置. 洪流学堂,让你快人几步.你好 ...

最新文章

  1. QQ和新浪微博登陆第三方的简单实现
  2. java椭圆写字距离_保持轨道椭圆的距离
  3. OpenGL 实例化属性的实例
  4. csdn无人驾驶汽车_无人驾驶汽车100年历史
  5. 一个适用各类场合的Makefile模板
  6. 计算机多文件管理,电脑文件管理几条小技巧
  7. 使用between and查找时间范围时的日期边界问题
  8. js if判断多个条件_五、if 条件判断
  9. Canvas基础-粒子动画Part2
  10. 用WinZip Pro创建Zip文件
  11. uniapp监听PDA激光扫描
  12. WebRTC 之 RTX
  13. word2010中如何去掉标题前面的小黑点
  14. 京东EB级全域大数据平台的演进与治理历程
  15. 基于springboot+dubbo微服务开发的商城系统
  16. Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能
  17. STM32F103模拟IIC总线驱动四个VL53L0
  18. 全球133种语言自动翻译mishop大米外贸商城系统
  19. 虚拟拔号服务器,windows实现虚拟拨号服务器
  20. buuoj BJDCTF-2nd WP

热门文章

  1. 【C/C++笔记】 C/C++常见问题笔记 1
  2. WIN 10 又出诡异Bug,访问特定本地设备导致系统崩溃
  3. flutter基于provider状态管理设置主题颜色、实现简单登录、注册功能---页面+逻辑
  4. 从“站在巨人的肩上”到“跪到侏儒之脚下”——图灵公司副主编自供(二)...
  5. 94、基于51单片机的无线调频对讲机系统设计
  6. python计算年龄的方法_巧算年龄-随心随性无为而为-51CTO博客
  7. 大数据技术具备哪些特点
  8. 解决ubuntu开机变慢;删除耗时启动项
  9. 【Typescript专题】之类型进阶
  10. linux系统怎么制作win10,win10 + linux 制作双系统教程(我本身是win10系统)