找回密码
 立即注册
查看: 325|回复: 0

【Unity动画系统】动画系统汇总篇

[复制链接]
发表于 2022-4-19 21:51 | 显示全部楼层 |阅读模式
前言

动画,是有魔力的!
这篇文章是 Randy:学习笔记 --- Unity动画系统 文章的学习笔记,就记一些自己不懂的知识点
1. Mecanim 动画系统

Unity的Mecanim动画系统,是一套基于状态机的动画控制系统,是一个面向动画应用的动画系统
2. 角色模型动画的创建与应用工作流程

3dmax(或者其他建模软件)==》FBX==》Unity
3. AnimtionClip 动画片段

Unity中的动画片段分为两种

  • 通过剪辑FBX中的整段动画生成的动画切片(Clip)
  • 以及由Animation窗口创建出的动画片段(Clip)
4. Animator

Avatar:动画节点导引替身,与动画复用(尤其是人形动画复用)有关,通过配置和应用Avatar,可以实现不同FBX模型之间的动画复用
Apply Root Motion:是否将动画中的根节点位移,植入到Unity中的物体位移上:详细见第7点
Culling Mode:剔除模式

  • Always Animate:无论物体是否被摄像机可见,总是计算所有节点的运动,完整的进行动画播放
  • Cull Update Transforms:当物体不被摄像机可见时,仅计算根节点的位移植入,保证物体位置上的正确
  • Cull Completely:当物体不被摄像机可见时,完全终止动画的运行
对于玩家操作的主角人物,或者与主角密切相关的,在绝大多数情况下均可见的角色,我们通常使用Always Animate模式
对于一些配角,例如怪物,小兵,这些部分情况下可见的角色,不妨使用Cull Update Transform模式来进行优化,这样在摄像机无法看见它们的时候,它们的根节点运动仍然正确
5. AnimatorController

条件控制or:从一个状态到另一个状态可以有多条过渡,它们将组成并集的效果


条件控制and:


Has Exit Time:勾选时上一个状态对于的动画片段必须被播放到末尾,才允许这个过渡被触发,不勾选可以在任意时刻进行过渡
Interruption Source:打断来源,允许该过渡被来自CurrentState或NextState的其它过渡打断
被CurrentState打断则发生了“跳转”,NextState的指向被改变(例如受击打断了攻击)
被NextState打断则发生了“跃进”,动画迅速的完成了两个状态的过渡(例如从站立状态快速过渡到冲刺斩,奔跑状态被越过)
合理的运用打断,实现快节奏的状态切换,是制作动作游戏的基础


Ordered Interruption针对CurrentState出发的过渡,是否只允许比当前过渡优先级高的过渡打断该过渡


Solo:勾选时,该State只能进行该过渡,其它过渡将无效(反选其他)
Mute:勾选时,这个过渡将无效(有点Disable的意思)
这个功能通常被用于调试,进行一些单向的过渡,或禁止向某个状态进行过渡,从而在限制性的范围内,观测状态机的运行

6、AnimatorOverrideController

动态修改State里的AnimatorClip 不支持,只能用 AnimatorOverrideController 去实现 clip 动态替换,先新建一个 AnimatorController ,   然后可以运行时生成 AnimatorOverrideController 组件,动态换掉动画状态机
Animator animator = GetComponent<Animator>();
AnimatorOverrideController overrideController = new AnimatorOverrideController();
overrideController.runtimeAnimatorController = animator.runtimeAnimatorController;
overrideController["name"] = newAnimationClip;
animator.runtimeAnimatorController = overrideController;详细见:王江荣:Unity中Animator Override的性能问题
使用AnimatorControllerOverride的坑_chqj_163的博客-CSDN博客
7. 关于Apply Root Motion


  • Apply Root Motion 不勾选:原地运动
  • Apply Root Motion 勾选:向前运动
  • 脚本中实现了OnAnimatorMove,根节点控制权移交
8. Avatar的作用与配置

9. 动画系统脚本API

9.1 StateMechineBehavior


  • StateMechineBehavior 挂在State上:OnStateEnter/OnStateUpdate/OnStateExit
  • StateMechineBehavior 挂在Layer上:
  • StateMechineBehaviour与Mono的通信
//Awake OR Start

var smb = animator.GetBehaviour<StateMechine>();
//这里会是从父动画组到子动画组以及其中包含的State,这个遍历顺序下,遇到的第一个StateMechine

var smbS = animator.GetBehaviours<StateMechine>();
//返回一个数组包含Controller中所有的StateMechine
10. 动画分层

动画分层我的理解有点像PS的画布、Unity的Canvas,一层又一层,通过叠加模式进行叠加,最后表现出混合后的动画
使用动画分层的应用主要是以下情况

  • 人物动画状态涉及分部并行逻辑,例如枪战游戏,腿部动作由键盘控制,而上半身动作需要由鼠标控制进行IK瞄准,以及武器切换
  • 存在状态的融合/叠加效果,例如在正常走动的基础上,搬运物品时,上半身需要持握物品并进行IK绑定,下半身仍是正常走动
  • 动作游戏中,为减轻动画师工作量,取用不同动作的部分进行组合



  • Weight:混合权重
  • Mask:混合蒙版
  • Blending:混合模式,两种可选

    • ---Override:绝对坐标重写模式,根据权重,Overrid会令下层节点的位置逐渐替换上层节点位置(节点位置按照Weight的Lerp差值效果)
    • ---Additive:相对运动叠加模式,根据权重,将该层节点的相对运动效果叠加到上层节点上。如果上层节点在动画中没有运动,将完全表现下层的动画效果,如果上层有运动将与下层节点的运动组成和运动表现出来,如果下层节点不具有相对运动,那么就不对上层产生影响

测试
动画分层方式1:【Mask = AvatarMask + 【Blend = Override】 + 【Weight = 1】


新建一个 UpperBody 动画分层,BaseLayer是一个跑步动作,UpperBody 是一个跳舞动作,新建一个AvatarMask,把下半身标红遮挡住,赋值到Mask字段,然后Weight拉满,混合模式选择Override,就能实现完全的动画分层



未分层



动画分层

动画分层方式2:【Mask = none + 【Blend = Addicted】 + 【Weight = 1】+ 【ClipMask】
不创建AvatarMask,使用ModelImporter的Animation分页下的ClipMask进行遮罩


11. BlendTree混合树

BlendTree的作用是将多个动画状态混合成为一个动画状态,并通过动画参数来影响状态的输出结果
使用BlendTree的目的是应对状态机的高耦合导致的低扩展缺点,尤其是在人物运动相关的动作(前后左右的行走奔跑)这类繁多的动作
以跳跃为例子,



添加4个clip



设定4个变量数值

这样我们就可以在代码层,通过控制 h_moveDir 和 v_moveDir 这2个变量,对角色动画进行控制向4个方向进行跳跃动作
镜像功能:
既然UI可以镜像,动画讲道理也可以镜像,上述的4个动画,如果用上镜像功能,那就只要2个动画就行了,资源量直接减少一半。
【当然,这个镜像的前提是完全一样,像向前跳和向后跳,动作还是有点区别的,所以看情况而定】


BlendType


  • 1D:1个参数
  • 2D:2个参数,3种配置方法都是相同的,不同的混合模式区别在于动画位点之间的差值过渡方式不同(没懂)

    • 2D Simple Directional:整个二维平面的两个维度都被用于区分运动速度/方向的不同,每个动画都应拥有自己独特的运动方向,或者说从原点指向某个动画位点的单位向量各不相同
    • 2D FreeForm Direction:与前一种类似,但允许出现两个及以上动画同向异速,不过这种模式也要求在原点(0,0)点处应有一个站立/静止状态的动画,从而根据到原点的距离来区分融合同向异速的动画
    • 2D FreeForm Cartesian:用于融合单一方向运动以及其它非线速度效果,要求所有动画的运动方向应相同,并通过二维平面的一个维度进行速度区分,而另一个维度应是转向,转头等一些非线速度效果的动画




12. 杂

问题1

人物手部与目标位点匹配的偏移问题,由于射线检测位置是从人物的中心,而高度我们只能获取到BoxCollider的Size高度,因此从中心到人物左手,从Box顶部到手真正需要放的位置,我们使用了两个偏移量保证左手位置的正确




问题2

动画状态机,多个trigger同时满足,如何选择想要的transtion
1. 自己维护好 Trigger 列表,如果我们的实际需求中,不存在需要多个 Trigger 同时被触发的情况,那么记得在设置新的 Trigger 之前(当然也可以考虑优先级和权重值)将其他已经设置过但是还没有被 Animator 应用的 Trigger Reset 掉。
参考

Randy:学习笔记 --- Unity动画系统
Randy:当3dMax遇上Unity3d---模型导入的前后你需要注意的地方
大智:Unity动画系统详解3:如何播放、切换动画?
关于 Animator.SetTrigger 的一些迷思

本帖子中包含更多资源

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

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 13:38 , Processed in 0.087219 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表