Unityのマイナーだけど便利な関数を使ってみた【Vector3.SmoothDamp】
Unityのマイナーだけど便利な関数を使ってみた【Vector3.SmoothDamp】
Unityのスクリプトリファレンスを眺めるのが仕事です。
普段あまり陽の目を浴びてなさそう(※主観です)な関数にも活躍の機会を!
というわけで、Vector3に用意されている SmoothDamp という static関数を使ってみました。
赤い球がSmoothDamp関数で動いています。
© Unity Technologies Japan/UCL
いかがでしょうか?プレイヤーについてくる精霊っぽくないですか?
このように、SmoothDampを使うと「目的地に対して滑らかに到達する」処理が実装できます。
プレイヤーがばびゅーんっと移動してしまったら急いで追いかけます。
プレイヤーがちょびっとだけ移動したらゆっくりと追いかけます。
ただの赤い玉なのに動き方ひとつで愛着がわいてきませんか?
[Unity_317×90]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】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発