Unity Animation 动画相关总结

本文深入解析Unity中的Animator、动画压缩方案、Animation、骨骼蒙皮、Mecanim动画系统及动画重定向技术。涵盖动画状态机、变量类型、状态转换、Retarget、动画控制器重写、动画压缩技巧及根运动等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Animator

1.动画渐变

CrossFade是按照动画的自身时间进行混合。如果动画10秒,混合持续时间0.2,会在2秒后混合完成
CrossFadeInFixedTime是按照实际时间进行混合。如果动画10秒,混合持续时间0.2,会在0.2秒后混合完成

使用CrossFade或CrossFadeInFixedTime混合时,如果混合时间大于动画自身长度,动画自身会被滞留在最后一帧,直到混合结束

2.四种类型变量

Int,Float,Bool,Trigger,Trigger比较特殊,它是指触发一次,不需要去设置变量的值;

Animator的SetFloat接口可以设置阻尼,并且4种类型变量只有float是支持阻尼的。
public void SetFloat(int id, float value, float dampTime, float deltaTime);
这个接口需要每帧调用,每次调用后animator对应的param的值为 
value = current + (target - current) * deltaTime / (dampTime + deltaTime);

3.各种状态

简单地说,状态机就是角色在某种条件的的行为。每一个状态会有不同的颜色,每一个动画状态都对应一个动作。
每一个动画状态机最少要有“Any State”、“Entry”;

4.动画转换条件解释:

Has Exit Time,是否有打断时间 勾选后要等当前动画播放完后,才会接下一个状态。不勾选的话 就允许动画播放一半时被打断
状态转换里的Has Exit Time就是必须过度的时间,处于这个时间时,是不允许任何对动画的操作的
Exit Time 动画的打断时间(从哪一帧开始逐渐降低当前动画的权重并切换到下一动画),在这一帧之前是不允许对动画进行操作的;
Fixed Duration 固定持续时间(这其实是一个切换开关,切换是按照秒显示还是按照百分比显示)
Transition Duration 动画切换的过度时间间隔,越小切换的越快,但是不能设置为0,否则会失去连贯性

5.Retarget

Mecanim提供了重新设定目标的功能,如果类人模型的骨骼构造一致就可以直接使用其他模型的动画。

6.Animator视图

的参数需要区分大小写,而且Unity不会自动忽略后面的空格。

7.animator的trigger变量

trigger变量只能赋值,是一种触发变量,触发之后会自动关闭掉,没办法获取当前状态。
比如xxxx.animator.settrigger("Attack");在执行这一句时才是true ,但是执行后马上自动的变为false。适合用在单次动作或者连续不同动作使用,比如三国无双系列的攻击和蓄力攻击。但是如果动画没有执行,只是改变了转换条件Attack的值,那么Attack会一直为true直到动画被执行;比如,如果按下攻击按键后,再按攻击键,它不会再播放动画,但是Attack的值为真。
bool跟trigger不同在于触发之后会一直执行,而且可以获取当前状态。适合用在长时间持续动作,比如行走跑步。
void ResetTrigger(...);
重设该触发参数为False
如果是当前状态播放结束再跳转的话,会用到这个方法,在结束之前可以重置回False;

记录一个unity编辑器使用的问题

编辑器内进行了改动,本地没有反应?

使用unity内的一些图形编辑器如Animation、Animator、Shader Graph等,如果在编辑器内修改了资源未点击保存,那么资源是不会自动保存到本地的,直到退出unity之后会自动保存到文件中;但是如果你使用git不小心修改了一个文件,你会发现根本无法revert,这个时候需要点击保存,保存编辑器内的所有改动到本地文件,然后revert,把改动都丢弃掉;

8.Animator OverrideController

顾名思义,这是一个可以重写基类controller的控制器,可以在create菜单中选择创建;这种控制器可以替换原状态机中动画片段,但不会改变状态机的结构、逻辑和参数;

它继承于RuntimeAnimatorController,可以用于动态的切换控制器内的动画;

参考:https://docs.unity3d.com/ScriptReference/AnimatorOverrideController.html

二、动画压缩方案

以下方案思路主要是截取自《游戏引擎架构》动画系统部分;

1.通道省略

2.量化

3.采样频率及键省略

4.总结

简单的动画压缩主要从三个粒度来压缩

  • 关键帧:减少关键帧的数量,这一点unity为我们提供了一些剔除关键帧的接口;
  • 每一帧的属性:从第三方插件中导出的动画文件,可能会有一些我们不需要的属性,如人物动画,我们往往不需要scale曲线,这时就可以将该部分剔除掉;
  • 属性数据精度:动画文件的精度往往是过高的,在游戏中,往往需要小数点后三四位即可,这一点我们可以提供设置精度的接口来达到降低动画数据文件大小的目的;PS:这里降低的仅仅是磁盘大小,不会降低运行内存大小;

针对动画文件的优化,可以参考:Unity动画文件优化探究

三、Animation

关于旧的animation的踩坑记录

需要手动将资源的m_legacy设置为1,或代码里anim.legacy = true,否则无法使用Animation.AddClip;

之后要根据不同的anim类型来设置wrap mode,循环动画设置为loop,其它设置为clamp forever(该选项会在crossfade切换时一直使用最后一帧做融合)

性能优化

参考:https://www.gameres.com/847715.html

四、骨骼蒙皮

2D骨骼蒙皮动画插件:Spine是什么?

五、Mecanim动画系统

Avatar

Avatar是Mecanim动画系统自带的人形骨骼结构与导入模型文件的骨骼结构的映射关系;

导入带有动画的模型文件后,系统会自动为其生成一个Avatar文件;

骨骼共享规则:从根骨骼开始一一匹配,而且相对应的骨骼的名称必须一样,否则骨骼信息无法传递。

高级主题

  • 根运动(Root Motion):所有引擎的动画系统都会有根运动;

Skinned Mesh Renderer

  • unity使用Skinned Mesh Renderer组件去渲染骨骼动画,网格的形状会随着骨骼进行改变,而骨骼又由animator驱动;所有的骨骼相连形成一个层级骨架,通过旋转和移动关节来定义动画;

  • Root Bone,设置动画的根骨骼,网格中所有的骨骼移动相对于该根骨骼;

六、动画重定向

UWA:动画重定向技术分析及其在Unity中的应用

动画重定向是一个动画复用的技术,它使用的是时间换空间的策略,在运行时根据预先计算好的骨骼差异信息,得到目标模型的动画数据;

它主要是为了解决如下问题:

### Unity 动画教程与文档 #### 一、官方资源概述 Unity 官方提供了丰富的动画相关资料,包括详细的文档和视频教程。这些资源可以帮助开发者深入了解如何创建和优化动画[^1]。 #### 二、基础概念介绍 - **Animator Controller**: 控制角色状态机的核心组件,用于管理不同动画片段之间的过渡逻辑。 - **Animation Clips**: 即具体的动作序列文件,可以是通过外部工具导入也可以直接在编辑器内创建简单的位移帧。 - **Avatar Mask**: 可定义哪些骨骼参与变形计算,在多人物共用一套animator setup时特别有用。 #### 三、性能优化建议 一些常见的 Unity API 调用可能带来意想不到的成本开销;因此,在处理复杂场景下的大量动画实例化时需格外注意效率问题。例如减少不必要的 Transform 访问频率以及合理利用缓存机制来降低每帧更新负担。 #### 四、第三方插件辅助开发 对于希望快速实现高质量视觉效果而不愿深究底层细节的工作室而言,像DotweenPro这样的第三方库能显著提升生产力——仅需少量代码就能完成平滑移动、缩放等常见操作并支持链式语法糖衣炮弹般便捷地组合多种变换行为[^2]. ```csharp // 使用 DOTween 创建一个简单的位置变化动画 using DG.Tweening; transform.DOMove(new Vector3(10f, 0f, 0f), 2).SetEase(Ease.InOutSine); ``` #### 五、实际案例分析 以 GitHub 上开源项目为例,《Animation Instancing》展示了如何借助 C# 编写脚本来实时显示当前帧率的同时保持良好交互体验[^3]. 此外还涉及到了自定义着色器的应用如 `DepthMask` 和各类 Stencil 效果,这些都是构建沉浸式虚拟环境不可或缺的技术要点[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值