MatchTarger即匹配目标,是Animator类中的一个方法,该方法可以实现在执行动画的过程中使角色身体的某个部位与指定位置进行匹配,比如我们在攀爬的过程中,手、脚及身体应该是和墙壁接触的,那么这时我们就可以考虑使用这个方法,该方法定义如下:
void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime,float targetNormalizedTime)
可以看出,在该方法中,我们指定了匹配的位置、角度、身体的具体部分、权重、匹配开始及匹配结束的时间。由此,我们就可以开始今天的内容了,首先我们来创建一个简单的场景:
在这个场景中,我们希望角色可以沿着墙壁爬到墙上。那么具体怎么做呢?首先我们在场景中创建一个空的游戏体,将其命名为RightHandTarget,它将作为角色在攀爬时右手的一个匹配点,我们将其拖放到合适的位置,然后将其拖放到墙模型下,使其成为它的一个子物体。如图所示:
好了,这样我们完成了场景部分的搭建和准备工作,接下来我们来制作角色的动画模型,新建一个Animator Controller,命名为JumpGrab,双击打开Animator窗口,这里我们只拖入两个动画Idle"和JumpUp,这里我们新建两个float类型的参数MatchStart、MatchEnd及Bool类型的参数Jump,触发JumpUp动画的条件是Jump为True。如图
其中JumpUp是一个完整的攀爬墙壁的动画,在这个动画中,角色首先会伸出右手进行攀爬,因此我们可以将其右手与我们在场景中定义好的RightHandTarget进行匹配,从而保证角色在攀爬的过程中总是紧紧贴着墙壁。好了,现在让我们来编写脚本来将动画模型和角色关联起来:
using UnityEngine;
using System.Collections;
public class TargetMatching : MonoBehaviour
{
//动画组件
private Animator animator;
//右手着力点
public Transform RightHand;
//是否完成跳跃
bool hasJumped = false;
AnimatorStateInfo mState;
void Start ()
{
//获取动画组件
animator = GetComponent<Animator>();
}
void Update ()
{
if (animator)
{
//获取动画状态
mState = animator.GetCurrentAnimatorStateInfo(0);
if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);
if (mState.IsName("Base Layer.JumpUp") || mState.IsName("Base Layer.FullJump"))
{
animator.SetBool("Jump", false);
//调用MatchTarget方法
animator.MatchTarget(RightHand.position, RightHand.rotation, AvatarTarget.RightHand, new MatchTargetWeightMask(new Vector3(1, 1, 1), 0), animator.GetFloat("MatchStart"), animator.GetFloat("MatchEnd"));
hasJumped = true;
}
}
}
}
好了,下面我们来看最终的效果吧!