using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Transform[] points;
public float speed;
int index = 0;
float dis;
public float minDis;
// 记录转身前的角度
private Quaternion raw_rotation;
// 准备面向的角度
private Quaternion lookat_rotation;
// 转身速度(每秒能转多少度)
public float per_second_rotate = 50.0f;
// 旋转角度越大, lerp变化速度就应该越慢
public float lerp_speed = 1.0f;
// lerp的动态参数
public float lerp_tm = 0.0f;
void Start()
{
Init_Rotate();
}
// Update is called once per frame
void Update()
{
dis = Vector3.Distance(transform.position, points[index].position);
if (dis > minDis)
{
Rotate_Func();
transform.Translate(Vector3.forward * speed*Time.deltaTime);
}
else
{
index++;
if (index == points.Length)
{
index = 0;
}
Init_Rotate();
}
}
// 旋转之前的初始化
void Init_Rotate()
{
// 记录转身前的角度
raw_rotation = transform.rotation;
// 记录目标角度
transform.LookAt(points[index]);
lookat_rotation = transform.rotation;
// 还原当前角度
transform.rotation = raw_rotation;
// 计算旋转角度
float rotate_angle = Quaternion.Angle(raw_rotation, lookat_rotation);
// 获得lerp速度
lerp_speed = per_second_rotate / rotate_angle;
Debug.Log("Angle:" + rotate_angle.ToString() + " speed:" + lerp_speed.ToString());
lerp_tm = 0.0f;
}
// 旋转逻辑, 在update中调用
void Rotate_Func()
{
lerp_tm += Time.deltaTime * lerp_speed;
transform.rotation = Quaternion.Lerp(raw_rotation, lookat_rotation, lerp_tm);
if (lerp_tm >= 1)
{
transform.rotation = lookat_rotation;
// 此时, 转身完毕, 已经对着目标物体
}
}
}