0%

Animator遇到的二三事

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

1.使用动画中的位移

好处是:人物的脚步会跟地面贴合,不会出现滑步的问题(人物的移动距离比步子大或者小),控制简单

缺点是:比较依赖动画的制作,程序控制性不高

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

好处:可控性高

缺点:容易出现滑步,控制复杂

修改Animator Controller中的参数:

设置参数的办法是使用SetInteger、SetFloat、SetBool、SetTrigger

bool参数和Trigger参数的区别:

bool参数和trigger参数很像,都是代表布尔值,但是trigger参数只能被设为true,一旦被transition使用,就会自动被设为false。bool类型一般用于持续的状态,比如角色是否趴下。而trigger一般用于使用一次就会恢复的状态,比如开枪,开枪动画播放完以后,会自动恢复到之前的动作

parameter的id:

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

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

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

dampTime 阻尼时间,deltaTime 时间增量

SetFloat的那个damp用法:

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

效果为如下公式:

总结:

  1. Animator中可以设置参数,用来控制Transition的变化
  2. Has Exit Time也是transition切换的一个条件,只有transition的所有条件都满足时才会进行切换
  3. 在代码中可以使用Animator类中的SetXXX方法控制参数,进而控制状态的转换
关于生成Layer层的写法:

写法1:

1
2
3
4
var layers = productController.layers;
layers[1].defaultWeight = 1;
layers[1].blendingMode = AnimatorLayerBlendingMode.Additive;
productController.layers = layers;

写法2:

1
2
3
4
5
6
7
8
9
var layers = productController.layers;
var layer = new UnityEditor.Animations.AnimatorControllerLayer
{
name = "Face",
defaultWeight = 1f,
blendingMode = AnimatorLayerBlendingMode.Additive,
stateMachine = new UnityEditor.Animations.AnimatorStateMachine()
};
productController.AddLayer(layer);

写法1能够正常导出显示并序列化,但是写法2可以导出显示但无法正常序列化