テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unityで対象のポイントへ等速で動かす

目標位置へ等速で動かすコードです。目標時間で最終目的地に到着するような感じです。下のgifだと1秒で目標地点まで到着します。

f:id:tsubaki_t1:20150220233656g:plain


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を使用した移動速度の調整

f:id:tsubaki_t1:20150220233447g:plain

 アニメーションカーブを使用すると、進行率に対する座標を設定することが出来ます。アニメーションカーブは下のように設定できます。

上のgifでは複数のアニメーションカーブによる挙動の違いを表現しています。

f:id:tsubaki_t1:20150220233931p:plain

まずAnimationCurveを定義してシリアライズします。

[SerializeField]
AnimationCurve curve;

 で、進行率に対してアニメーションカーブのキーを打ってる場所を取得し、そのLerpでカーブの位置を照らしあわせてやれば、カーブで進行率が調整出来る奴の完成です。

var curvePos = curve.Evaluate(rate);

transform.position = Vector3.Lerp (startPosition, endPosition, curvePos);

結論

普通にTween系アセット探せば見つかるので、自分で書くよりそれらを使ったほうがよいんじゃないかなーと思わなくも。