一、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,设置动画的根骨骼,网格中所有的骨骼移动相对于该根骨骼;
六、动画重定向
动画重定向是一个动画复用的技术,它使用的是时间换空间的策略,在运行时根据预先计算好的骨骼差异信息,得到目标模型的动画数据;
它主要是为了解决如下问题: