第一种:使用Vector3.MoveTowards
transform.localPosition = Vector3.MoveTowards(start, end, speed * Time.deltaTime);
假如移动的是界面的话,设置为localPosition,物体则为Position。
第二种:使用数学插值移动
float step = speed * Time.deltaTime;
transform.localPosition = new Vector3(Mathf.Lerp(start.x, end.x, step),
Mathf.Lerp(start.y, end.y, step), Mathf.Lerp(start.z, end.z, step));
还有一种是直接使用插值Vector3.lerp(start,end,f),这种更麻烦,因为无法设置速度,f是[0,1]之间的数,表示移动的比例,若为1,则最终移动到end的位置,若为0,则不移动。
第三种:使用transform.Translate
transform.Translate(Vector3.Normalize(end - start) *
(Vector3.Distance(start, end) / (time / Time.deltaTime)));
Vector3.Normalize表示移动的方向,Vector3.Distance(transform.localPosition, Vector3.zero) / (time/ Time.deltaTime)为移动的速度。
第四种:使用协程
private IEnumerator MoveObject_Time(Vector3 startPos,Vector3 endPos,float time)
{
float dur = 0.0f;
while(dur<=time)
{
dur += Time.deltaTime;
transform.localPosition = Vector3.Lerp(startPos, endPos, dur / time);
yield return null;
}
}
需要移动时就调用这个协程,StartCoroutine(MoveObject_Time(start, enf, time))。
也可以设置速度移动,代码如下:
private IEnumerator MoveObject_Speed(Vector3 startPos, Vector3 endPos, float speed)
{
float startTime = Time.time;
float length = Vector3.Distance(startPos, endPos);
float frac = 0f;
while (frac <= 1.0f)
{
float dist = (Time.time - startTime) * speed;
frac = dist / length;
transform.localPosition = Vector3.Lerp(startPos, endPos, frac);
yield return null;
}
}
总结:具体效果可以测试一下,个人测试为第四种情况最为理想,不过需要开协程。一般情况下可以先使用第一种方式看看效果。需要注意的是:移动UI界面的话一般需要设置localPosition移动。假如还有其它移动方式的话,欢迎和我交流哦。