U3L18-7——动作目标匹配

动作目标匹配

动画目标匹配主要指的是
当游戏中角色要以某种动作移动,该动作播放完毕后,人物的手或者脚必须落在某一个地方
比如:角色需要跳过踏脚石或者跳跃并抓住房梁
那么这时我们就需要动作目标匹配来达到想要的效果

本章代码关键字

1
2
3
animator.MatchTarget()    //动画目标匹配的方法,使某个动画能让该对象的某个点在动画播放期间精确的移动到某个目标点上
AvatarTarget //骨骼目标的枚举,在MatchTarget()方法里用来表示骨骼上的哪个地方的位置用来匹配目标位置
MatchTargetWeightMask() //结构体,用来记录XYZ方向以及角度变化的权重

如何实现动画目标匹配

Unity 中的 Animator 提供了对应的函数来完成该功能,使用步骤是

  1. 找到动作关键点位置信息(比如起跳点,落地点,简单理解就是真正可能产生位移的动画表现部分)
  2. 将关键信息传入 MatchTarget API 中

MatchTarget

动画目标匹配的方法

注意!调用匹配动画的时机有一些限制 ——> 具体看这里

  • 参数一:目标位置
  • 参数二:目标角度
  • 参数三:匹配的骨骼位置
  • 参数四:位置角度权重
  • 参数五:开始位移动作的百分比
  • 参数六:结束位移动作的百分比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using UnityEngine;

public class Lesson56 : MonoBehaviour
{
private Animator animator;
public Transform targetPos;

void Start()
{
animator = GetComponent<Animator>();
}

void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("Jump");
}
}

private void MatchTarget()
{
animator.MatchTarget(targetPos.position, //目标位置
targetPos.rotation, //目标角度
AvatarTarget.LeftFoot, //匹配的骨骼位置
new MatchTargetWeightMask(Vector3.one, 1), //位置角度权重
0.4f, //开始位移动作的百分比
0.64f); //结束位移动作的百分比
}
}

注意!

调用匹配动画的时机有一些限制

  1. 必须保证动画已经切换到了目标动画上
  2. 必须保证调用时动画并不是处于过度阶段,而真正在播放目标动画
    如果发现匹配不正确,往往都是这两个原因造成的
  3. 需要开启Apply Root Motion

AvatarTarget

骨骼目标的枚举,在MatchTarget()方法里用来表示骨骼上的哪个地方的位置用来匹配目标位置

1
2
3
4
5
6
7
8
9
10
//UnityEngine命名空间内,AvatarTarget的定义
public enum AvatarTarget
{
Root, //根物体
Body, //身体
LeftFoot, //左脚
RightFoot, //右脚
LeftHand, //左手
RightHand //右手
}

MatchTargetWeightMask

结构体,用来记录XYZ方向以及角度变化的权重

构造时,参数一是XYZ方向上变化的权重组成的Vector3,三个值范围都是0到1,参数二是角度变化的权重,范围都是0到1

1
new MatchTargetWeightMask(Vector3.one, 1)