目標位置へ等速で動かすコードです。目標時間で最終目的地に到着するような感じです。下のgifだと1秒で目標地点まで到着します。
Unityで座標を等速直線的に動かすやつ。コメントアウト解除するとカーブエディタで他の移動パターンも作れる
解説
まず、「指定時間で移動する」為には、開始時間を0、終了時間を1として正規化するのが楽です。なので、そのように調整します。
まず処理の開始時間(startTime)を記録します。
startTime = Time.timeSinceLevelLoad;
後は実際の経過時間(diff)を求めて、予定時間(time)で割れば時間に対する進行率が出ます。
var diff = Time.timeSinceLevelLoad - startTime;
var rate = diff / time;
後は簡単です。Vector3.Leapで開始位置(startPosition)と目標の座標(endPosition)の進行率を与えてやれば、中間座標が求められます。
transform.position = Vector3.Lerp(startPosition, endPosition, rate)
これでメイド・
なお時を止める予定があるなら Time.realtimeSinceStartupで時間を計測すれば、時が止まっても動けます。
AnimationCurveを使用した移動速度の調整
アニメーションカーブを使用すると、進行率に対する座標を設定することが出来ます。アニメーションカーブは下のように設定できます。
上のgifでは複数のアニメーションカーブによる挙動の違いを表現しています。
まずAnimationCurveを定義してシリアライズします。
[SerializeField]AnimationCurve curve;
で、進行率に対してアニメーションカーブのキーを打ってる場所を取得し、そのLerpでカーブの位置を照らしあわせてやれば、カーブで進行率が調整出来る奴の完成です。
var curvePos = curve.Evaluate(rate);
transform.position = Vector3.Lerp (startPosition, endPosition, curvePos);
結論
普通にTween系アセット探せば見つかるので、自分で書くよりそれらを使ったほうがよいんじゃないかなーと思わなくも。