|
//定义一个变量来引用要跟随的对象
public Transform TargetObj = null;
//定义一个对象引用角色的animator组件
protected Animator animator;
//定义一个角色控制器变量引用角色控制器
protected CharacterController controller;
//定义一个时间变量,主要用在使用Animator组件设置浮点函数
private float SpeedDempTime = 0.25f;
private float DirectionDempTime = 0.25f;
void Start()
{
//对前面定义的两个组件类型的变量animator和controller进行初始化
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
if (animator) //当组件存在时
{
//对animator组件中的一个属性animator 和 speed 进行随机化设置
//animator 和speed 的作用就是控制animator动画的播放
animator.speed = 1 + Random.Range(-0.4f, 0.4f);
}
}
// Update is called once per frame
void Update()
{//控制角色跟随的主要逻辑
if (animator && TargetObj)
{
//是跟随者跟随的目标一起运动,同时两者之间保持一定的距离之内
if (Vector3.Distance(TargetObj.position, animator.rootPosition) > 3)//是一个物体跟随另一个物体, 判断两个物体之间保持在硬顶的距离之内
{
animator.SetFloat("Speed", 1, SpeedDempTime, Time.deltaTime);
//定义俩个矢量
Vector3 curentDir = animator.rootRotation * Vector3.forward; // 定义角色的正方向 也就是角色的前方
//通过计算判断两者之间的位置关系
Vector3 wanterDir = (TargetObj.position - animator.rootPosition).normalized;
//if else语句:判断物体和当前物体之间的位置关系,主要用到了点积和差积的矢量的操作 来进行方向的判断
if (Vector3.Dot(curentDir, wanterDir) > 0)//当物体大于0 也就是物体的前方
{
//通过差积来判断左右
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y, DirectionDempTime, Time.deltaTime);
}
else
{
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y > 0 ? 1 : -1, DirectionDempTime, Time.deltaTime);
}
}
else
{
animator.SetFloat("Speed", 0, SpeedDempTime, Time.deltaTime);
}
}
}
联系电话 13552230323 QQ 3164087565 |
|