六.动画(下)

7.BlendTree:动画融合树

可以给几个动画做一个融合
右键 -> Create -> From new Blend Tree,双击编辑,点左上角导航条返回,右键Add motion添加动画
就是一种状态

Blend Type:融合类型1D:用一个参数来控制这些动画的切换2D:用两个参数来控制Simple:所有被融合的动画方向不一致Freedom Direction:相比第一个,需要有一个没有方向的动画Freedom Cartesian:随意融合Pos X:第一个参数Pos Y:第二个参数Direct:做表情动画Thresholds:阈值播放倍数镜像动画Automate Thresholds:是否自动设置阈值Compute Thresholds:根据计算的值来设置阈值speed:速率Velocity XVelocity YVelocity ZAngularSpeed DegAngularSpeed Red

8.Layers 分层动画

每个层是有权重的

Base Layer:权重不能设置,默认为1Avatar Mask:骨骼遮罩,添加遮罩后,该层上会有“M”标记层有下标,从0开始用代码修改层的权重

private Animator _animator; _animator = GetComponent(); if (Input.GetKeyDown(KeyCode.R) { // 设置权重 SetLayerWeight(int layerIndex, float value); }

9.IK动画

IK:反向动力学人型模型的IK部位:双手 双脚 眼睛动画状态机中的层设置,IK Pass按钮需要勾选,选上后该层上有“IK”标记

// 获取组件 private Animator _animator; _animator = GetComponent(); // 获取敌人 private Transform _enemy; _enemy = GameObject.Find(“enemy”).transform; // 如果要做IK动画,必须在这个方法中完成 private void OnAnimatorIK(int layerIndex) { // 角度限制 // 做一个角色指向敌人的向量 Vector3 direction = _enemy.position - transform.position; // 求这个向量和角色前方的向量的夹角 float angle = Vector3.Angle(direction, transform.forward); // 判断 if (Mathf.Abs(angle)) <= 60) { // 设置IK部位的权重 _animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1); // 设置IK部位的位置 _animator.SetIKPosition(AvatarIKGoal.RightHand, _enemy.position); } }

10.Curves 动画曲线

Animation标签中设置

横轴:范围[0, 1],到1动画结束纵轴:随时间改变而变,代表一个值,而且我们能随时获取到// 需求:根据动画中曲线Curve的值,来实时调整BoxCollider的高度

// 获取Animator组件 private Animator _animator; _animator = GetComponent(); // 获取BoxCollider private BoxCollider _collider; _collider = GetComponent(); // 获取Curve曲线的值 // 方式:在状态机中添加一个Float类型的参数,名字和曲线名字一致即可 float curve = _animator.GetFloat(Animator.StringToHash(“Curve”)); _collider.size = new Vector3(_collider.size.x, curve, _collider.size.z); // 这样会缩在人物中间 _collider.center = new Vector3(_collider.center.x, curve / 2, _collider.center.z); // 再控制一下高度

11.Event动画事件(帧事件)

在动画播放的过程中,让它去执行一个特定的方法,这个方法必须是在玩家身上的脚本中,必须是public,返回值是void,名字和设置的名字相同,参数可以是无参,如果需要参数,则参数类型必须是Float,Int,String,Object这四种之一,不能写多个,值就是Inspector面板上写的值

public void Shout () { _audio.Play(); }