Vector3.Lerp
public static Vector3 Lerp (Vector3 a, Vector3 b, float t);
説明
直線上にある 2 つのベクトル間を補間します
t で a と b の間を補間します。t は、0-1 の範囲に固定されています。これは、直線状にあるポイント間(両端)で割合に対しての位置を取得するのに使用します(例えば徐々に目的地へ移動していくときに使用します)。
When t = 0 returns a. When t = 1 returns b. When t = 0.5 returns the point midway between a and b.
引用元: Vector3.Lerp - unity DOCUMENTATION
とあります。言い換えると、Vector3.Lerp(地点Aの位置, 地点Bの位置, AからBへの進み具合(0-1の値))というメソッドです。なので、距離: Time.time * speedを進み具合(割合)として渡すのは変ですよね。少なくとも((自地点と地点Aの距離) + Time.time * speed)/(地点Aと地点Bの距離)を進み具合(割合)として渡してあげるべきです。
######サンプルコード
※もっといい方法があるかもしれませんのでその点ご留意ください
Vector3にしてますが、Vector2に変えてもいけるかと。あと、Time.fixedDeltaTimeは必要に応じて変えて下さい。
(追記) インデックスの更新ミスってたので直しました。
c#
1using System.Collections.Generic;
2using UnityEngine;
3
4public class MoveToPoints : MonoBehaviour
5{
6 public float Speed = 5f;
7 public List<Vector3> Points = new List<Vector3>()
8 {
9 new Vector3(0, 0, 0),
10 new Vector3(0, 0, 5),
11 new Vector3(5, 0, 0),
12 };
13 int PrevPointIndex = 0;
14
15 private void FixedUpdate()
16 {
17 // ポイントを取得します
18 var prevPoint = Points[PrevPointIndex];
19 var nextPoint = Points[(PrevPointIndex < (Points.Count - 1)) ? (PrevPointIndex + 1) : 0];
20
21 // 位置を取得します
22 var prevPos = this.transform.position;
23
24 // 現在の位置を計算します
25 var ratio = (Vector3.Distance(prevPoint, prevPos) + Time.fixedDeltaTime * Speed) / Vector3.Distance(prevPoint, nextPoint);
26 var crntPos = Vector3.Lerp(prevPoint, nextPoint, ratio);
27
28 // 現在の位置に移動させます
29 transform.position = crntPos;
30
31 // ポイントのインデックスを更新します
32 if (ratio >= 1.0f)
33 {
34 PrevPointIndex = (PrevPointIndex < (Points.Count - 1)) ? (PrevPointIndex + 1) : 0;
35 }
36 }
37}