Unityのマイナーだけど便利な関数を使ってみた【Vector3.SmoothDamp】


Unityのマイナーだけど便利な関数を使ってみた【Vector3.SmoothDamp】


Unityのスクリプトリファレンスを眺めるのが仕事です。

普段あまり陽の目を浴びてなさそう(※主観です)な関数にも活躍の機会を!
というわけで、Vector3に用意されている SmoothDamp という static関数を使ってみました。

赤い球がSmoothDamp関数で動いています。
unity_skill_7-3
© Unity Technologies Japan/UCL

いかがでしょうか?プレイヤーについてくる精霊っぽくないですか?
このように、SmoothDampを使うと「目的地に対して滑らかに到達する」処理が実装できます。

プレイヤーがばびゅーんっと移動してしまったら急いで追いかけます。
プレイヤーがちょびっとだけ移動したらゆっくりと追いかけます。

ただの赤い玉なのに動き方ひとつで愛着がわいてきませんか?

Vector3.SmoothDamp について


Vector3.SmoothDamp は、「何を」、「何処に」、「何秒で」を指定して、オブジェクトを移動させる関数です。

重要なのは「何秒で」のところですね。
仮に「目的地はここ!」「制限時間は1秒!」と指定した場合、目的地が遠ければその分速く移動する必要があり、近ければゆっくり移動しなければなりません。

この関数では、そういった「目的地」と「時間」により変動する「速度」の部分を、毎フレーム自動で算出してくれます。

以下、赤い球にアタッチしているスクリプトです。
※赤い球にRigidbodyは使っていません。

using UnityEngine;
using System.Collections;

public class Minor_1 : MonoBehaviour {

	private Transform followTfm;

	float smoothTime = 0.5f;

	Vector3 velocity = Vector3.zero;

	void Start() {
		followTfm = GameObject.FindGameObjectWithTag("Player").transform;
	}
	
	void Update () {
		// 追従対象オブジェクトのTransformから、目的地を算出
		Vector3 targetPos = followTfm.TransformPoint(new Vector3(0.5f, 1.0f, -1.0f));

		// 移動
		transform.position =
			Vector3.SmoothDamp(transform.position, targetPos, ref velocity, smoothTime);

	}
}

SmoothDamp関数の引数には、以下の条件を指定します。
第1引数 → 移動させるオブジェクトの座標(Vector3)
第2引数 → 目的地の座標(Vector3)
第3引数 → 事前に初期化した速度(Vector3)の参照
第4引数 → 目的までの到達時間(float)
第5引数(省略可) → 最高速度(float)
第6引数(省略可) → この関数が前回実行されてからの経過時間(デフォルトはTime.deltaTime)

第5引数で最高速度を設定した場合、自動算出された移動速度よりも優先されます。
したがって、最高速度を遅く設定してしまうと、第4引数で設定した到達時間が経過しても、目的地に到達しない可能性があります。

refキーワードによる参照渡し

SmoothDampの第3引数は、refキーワードにより参照渡しとなっています。

通常、intやVector3などの値型を引数にとる場合、引数には値のコピーが渡されます。
しかし、refキーワードを使用すると、値の参照そのものが渡されます。
その結果、SmoothDamp内での引数への操作が、呼び出し元の変数に反映されるようになります。

詳しく理解したい方は、「C# 参照渡し」とかで調べてみてください。

まとめ


Vector3.SmoothDamp いかがでしたでしょうか?
座標のを直接同期する処理と比べて、自然な感じでついてくるところがポイントですね。
使用例を調べてみると、サードパーソンカメラなどに使用している例がちらほらありました。
色々と応用が利くと思います。

これを機にこの関数が大活躍しますように・・・

最近よく読まれている記事

【新着】Unityで主観カメラへの切り替えと、プレイヤーの移動方法について
【注目】Unityでマウスホイールでカメラの向きにドリーイン・ドリーアウトさせる
【知らないと危ない】UnityのactiveSelfとactiveInHierarchyの違いについて
【鉄板】Unityでカメラの向きを基準に移動する方法と、追従して回転できるカメラの実装

Unityの記事一覧にもどる

  • このエントリーをはてなブックマークに追加

PAGE TOP