请选择 进入手机版 | 继续访问电脑版

[相关技巧] 关于Unity动画状态机Animator使用 教程

[复制链接]
查看53 | 回复14 | 2021-9-13 16:03:22 | 显示全部楼层 |阅读模式
目次

一、媒介

  1. Unity
复制代码
可以用两种方式控制动画
1
  1. Animation
复制代码
,这种方式简单,直接
  1. Play(“Idle”)
复制代码
或者
  1. CorssFade(“Idle”)
复制代码
就可以播放动画;
2
  1. Animator
复制代码
  1. Unity5.x
复制代码
之后保举 利用 这种方式,由于 内里 可以加上混合动画,让动画切换更加平滑。

二、Animator组件

你通过

  1. Animation
复制代码
窗口(快捷键是
  1. Ctrl+6
复制代码
)中的
  1. Create New Clip
复制代码
创建
  1. Animation
复制代码
时,一个
  1. Animator
复制代码
已经悄无声气 地出现在 了对应的
  1. GameObject
复制代码

在这里插入图片形貌

三、Animator Controller文件

在第一步中天生 的

  1. Animator
复制代码
组件上, 第一个
  1. Controller
复制代码
参数在创建
  1. Animator
复制代码
时已经被赋值了,可以点击该值,并切换到
  1. Project
复制代码
窗口下,会发现这个
  1. Controller
复制代码
对应的文件是一个
  1. .controller
复制代码
文件。
  1. Animator Controller
复制代码
就是动画控制器,负责在不同的动画间切换,属于制作动画效果 的必备原件。

在这里插入图片形貌

注意 ,你也可以通过

  1. GameObject
复制代码
上的
  1. Add Component
复制代码
添加一个极新 的
  1. Animator
复制代码
组件,但是这种环境 下
  1. Animator
复制代码
  1. Controller
复制代码
参数默以为 空,以是 必要 我们手动将事先预备 好的
  1. .controller
复制代码
文件拖拽到该参数位置,动画控制器才能正常工作。

四、Animation Clip文件

双击

  1. .controller"
复制代码
文件,会弹出一个
  1. Animator
复制代码
窗口,该窗口中表现 的就是动画控制器文件中的全部 内容(也可以在顶部的工具栏通过
  1. Window - Animator
复制代码
打开这个界面)

在这里插入图片形貌

  1. Project
复制代码
窗口右键单击,选择
  1. Create->Animation
复制代码
创建
  1. Animation Clip
复制代码
  1. .anim
复制代码
文件)

在这里插入图片形貌

在这里插入图片形貌

再把

  1. .anim
复制代码
文件拖拽进
  1. Animator
复制代码
窗口,作为Animator Controller的一个状态(
  1. State
复制代码

在这里插入图片形貌

通过

  1. Animator
复制代码
创建出来的
  1. Animation Clip
复制代码
无法直接通过挂
  1. Animation
复制代码
组件举行 播放,假如 强行播放,
  1. Console
复制代码
会报一条告诫 信息:

  1. The AnimationClip 'XXX' used by the Animation component 'XXX' must be marked as Legacy.
复制代码

以及一条提示信息

  1. Default clip could not be found in attached animations list
复制代码

如下

在这里插入图片形貌

为什么呢?
假如 我们把

  1. Inspector
复制代码
切换为
  1. Debug
复制代码
模式

在这里插入图片形貌

可以看到

  1. Animation Clip
复制代码
有个
  1. Legacy
复制代码
勾选框

在这里插入图片形貌

  1. Legacy
复制代码
是遗产的意思,也就是传统的通过
  1. Animation
复制代码
组件来播放
  1. Animation Clip
复制代码
的做法,假如 利用
  1. Animation
复制代码
组件来播放
  1. Animation Clip
复制代码
,则必须把
  1. Legacy
复制代码
勾选上,不过这种方式已经是过时的做法,保举 利用
  1. Animator
复制代码
来播放
  1. Animation Clip
复制代码

五、 状态机的状态(State)

每个

  1. Animator Controller
复制代码
都会自带三个状态:
  1. Any State
复制代码
,
  1. Entry
复制代码
  1. Exit
复制代码

在这里插入图片形貌

1、Any State状态

表示恣意 状态的特别 状态。比方 我们假如 渴望 脚色 在任何状态下都有大概 切换到殒命 状态,那么

  1. Any State
复制代码
就可以帮我们做到。当你发现某个状态可以从任何状态以类似 的条件跳转到时,那么你就可以用
  1. Any State
复制代码
来简化过渡关系。

2、Entry状态

表示状态机的入口状态。当我们为某个

  1. GameObject
复制代码
添加上
  1. Animator
复制代码
组件时,这个组件就会开始发挥它的作用。
假如
  1. Animator Controller
复制代码
控制多个
  1. Animation
复制代码
的播放,那么默认环境 下
  1. Animator
复制代码
组件会播放哪个动画呢? 由
  1. Entry
复制代码
来决定的。
但是
  1. Entry
复制代码
本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会表现 为 橘黄色。

在这里插入图片形貌

当然,你可以随时在恣意 一个状态上通过

  1. 鼠标右键->Set as Layer Default State
复制代码
更改默认状态。

在这里插入图片形貌

记住,

  1. Entry
复制代码
  1. Animator
复制代码
组件被激活后 无条件 跳转到默认状态,并且每个
  1. Layer
复制代码
有且仅有一个默认状态。

3、Exit状态

表示状态机的出口状态,以红色标识。假如 你的动画控制器只有一层,那么这个状态大概 并没有什么卵用。但是当你必要 从子状态机中返回到上一层(

  1. Layer
复制代码
)时,把状态指向
  1. Exit
复制代码
就可以了。

在这里插入图片形貌

六、动画状态的属性

我们可以选中某个自定义状态,并在

  1. Inspector
复制代码
窗口下观察它具有的属性

在这里插入图片形貌

属性名 形貌
Motion 状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
Speed 动画播放的速率 。默认值为1,表示速率 为原动画的1.0倍。
Mutiplier 勾选右侧的Parameter后可用,即在计算Speed的时思量 地区 1 中定义的某个参数。若选择的参数为smooth, 则动画播放速率 的计算公式为 smooth * speed * fps(animation clip中指定)
Mirror 仅实用 于humanoid animation(人型机动画)
Cycle Offset 周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset举行 对比就可以或许 明白 了,只会影响起始动画的播放位置。
Foot IK 仅实用 于humanoid animation(人型机动画)
Write Default 最好保持默认,感爱好 可以参考官方手册
Transitions 该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果 时起作用
Add Behaviour 用于向状态添加“举动 ”

七、状态间的过渡关系(Transitions)

直观上说它们就是毗连 不同状态的有向箭头

在这里插入图片形貌

要创建一个从

  1. 状态A
复制代码
  1. 状态B
复制代码
的过渡,直接在
  1. 状态A
复制代码
上 鼠标
  1. 右键 - Make Transition
复制代码
并把出现的箭头拖拽到
  1. 状态B
复制代码
上点击鼠标左边即可。

在这里插入图片形貌

八、添加状态控制参数

参数有

  1. Float
复制代码
  1. Int
复制代码
  1. Bool
复制代码
  1. Trigger
复制代码

在这里插入图片形貌

  1. Float
复制代码
  1. Int
复制代码
用来控制一个动画状态的参数,比如速率 方向等可以用数值量化的东西,
  1. Bool
复制代码
用来控制动画状态的变化 ,比如从走路变化 到跑步,
  1. Trigger
复制代码
本质上也是
  1. bool
复制代码
范例 ,但它默以为
  1. false
复制代码
,且当程序设置为
  1. true
复制代码
后,它会自动 变回
  1. false
复制代码

如下这里创建一个

  1. Int
复制代码
范例 的参数
  1. AnimState
复制代码

在这里插入图片形貌

九、编辑切换状态的条件

点击连线,在

  1. Inspecter
复制代码
窗口中可以举行 设置,在
  1. Conditions
复制代码
栏下可以添加条件,如下图表示当参数
  1. AnimState
复制代码
  1. 0
复制代码
时会实行 这个动画
  1. Any State
复制代码
  1. New Animation2
复制代码
的过渡

必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为&&”与”关系,即必须同时满意 。

在这里插入图片形貌

十、代码中控制状态

我们可以通过代码来设置条件状态,达到动画切换的目标

  1. Animator ator = go1.GetComponent<Animator>();
  2. ator.SetInteger("AnimState", 0);
复制代码

上面的代码,让

  1. AnimState
复制代码
这个参数值为
  1. 0
复制代码
,满意 了从
  1. Any State
复制代码
  1. New Animation2
复制代码
的过渡条件,从而实现
  1. New Animation2
复制代码
动画的过渡。

十一、检查动画状态

方法1、AnimatorStateInfo

在脚本中添加代码

  1. //检查是否正在播放jump动画.
  2. AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);
  3. bool playingJump = stateinfo.IsName("jump");
  4. if(playingJump)
  5. {
  6. if(stateinfo.normalizedTime < 1.0f)
  7. {
  8. //正在播放
  9. }
  10. else
  11. {
  12. //播放结束
  13. }
  14. }
复制代码

当处于状态

  1. jump
复制代码
,则
  1. stateinfo.IsName("jump")
复制代码
返回
  1. true
复制代码

方法2、继承StateMachineBehaviour

  1. Animator
复制代码
的每个状态都可以挂载脚本,创建脚本,继承于
  1. StateMachineBehaviour
复制代码
类,用于检测状态机中动画切片(
  1. Anamation
复制代码
)的运行状态。
官方示例:https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
将脚本挂载在对应的状态上即可。代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class JumpState : StateMachineBehaviour
  5. {
  6. private GameObject player;
  7. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  8. {
  9. // 正在played的状态的第一帧被调用
  10. Debug.Log("------OnStateEnter------------");
  11. }
  12. // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
  13. override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  14. {
  15. }
  16. // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
  17. override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  18. {
  19. // 转换到另一个状态的最后一帧 被调用
  20. Debug.Log("-------------OnStateExit-----------------");
  21. }
  22. // OnStateMove is called right after Animator.OnAnimatorMove()
  23. override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  24. {
  25. // 在OnAnimatorMove之前被调用
  26. }
  27. // OnStateIK is called right after Animator.OnAnimatorIK()
  28. override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  29. {
  30. // 在OnAnimatorIK之后调用,用于在播放状态时的每一帧的monobehavior。
  31. // 需要注意的是,OnStateIK只有在状态位于具有IK pass的层上时才会被调用。
  32. // 默认情况下,图层没有IK通道,所以这个函数不会被调用
  33. // 关于IK的使用,可以看看这篇文章《Animator使用IK实现头部及身体跟随》
  34. // https://www.jianshu.com/p/ae6d65563efa
  35. }
  36. }
复制代码

十二、控制播放速率

  1. Animator ator = go1.GetComponent<Animator>();
  2. var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
  3. if(stateinfo.IsName("Jump"))
  4. {
  5. ator.speed = 2;
  6. }
复制代码

十三、注意 事项

1 取消勾选

  1. Can Transition To Self
复制代码
,不然动画会出现抖动

在这里插入图片形貌

2 动作循环。

不然假如 没有下个状态切换,直接克制 动作

在这里插入图片形貌

3.一样平常 我们要的都是立即 切换,以是 这里 不要勾选

  1. Has Exit Time
复制代码
,假如 勾选了,则表示在该动作完成后才答应 切换,

在这里插入图片形貌

十四、补充

1、Mirror

镜像,可以反转当前动画,减少动画师工作量

在这里插入图片形貌

2、Solo与Mute

  1. Mute
复制代码
相称 于把目标 过渡禁用掉。
  1. Solo
复制代码
表示只见效 这一条过渡
可以多选,当选中后会出现箭头提示
条件满意 优先于
  1. Solo/Mute
复制代码
,当条件没有满意 时依然不会过渡

在这里插入图片形貌

以上就是关于Unity动画状态机Animator利用 教程的具体 内容,更多关于Unity动画状态机Animator利用 的资料请关注脚本之家别的 干系 文章!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 同感丶 | 2021-9-13 19:31:16 | 显示全部楼层
有钱、有房、有车,人人都想!
回复

使用道具 举报

avatar 喝咖啡的牛山 | 2021-9-13 21:05:15 | 显示全部楼层
兰州烧饼,鉴定完毕!
回复

使用道具 举报

avatar 囘憶若曦囘t | 2021-9-21 08:44:26 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

avatar 醉于山水 | 2021-9-26 23:36:16 | 显示全部楼层
太邪乎了吧?
回复

使用道具 举报

avatar 秦基兴拍 | 2021-10-3 02:44:31 | 显示全部楼层
精神病院在通缉admin楼主!
回复

使用道具 举报

avatar 123457015 | 2021-10-4 09:57:32 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar hdnnuz62 | 2021-10-5 17:50:52 | 显示全部楼层
今天的心情很不错啊
回复

使用道具 举报

avatar 烟织成愁撼 | 2021-10-12 14:50:51 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar 简单350 | 2021-10-15 21:44:00 | 显示全部楼层
我默默的回帖,从不声张!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则