UnityのSmooth系メソッドを使って滑らかな遷移をさせる

今回はUnityのVector3.SmoothDamp、Mathf.SmoothDamp、Mathf.SmoothDampAngle、Mathf.SmoothStepを使用しゲームオブジェクトの移動や回転、色の変更等を滑らかにしてみようと思います。

わたくしの記事で滑らかな遷移をさせるにはVector3.LerpやVector3.Slerp等を使っていました。

Unityでキャラクターのなめらかな移動・回転のやり方を検証する
Unityでキャラクターのなめらかな移動・回転をする方法を検証してみます。キャラクターがスタート地点から目的地までキッカリ動いて止まるのではなく最初と最後はゆっくり動くようにしたい場合は補間を使います。補間のやり方を変更し動きを確認してみます。

↑の記事でどんな動きになるか実験しています。

今回は別のやり方で徐々に値を変化させていきます。

スポンサーリンク

徐々に値を変化させる

今回使用するメソッドを一つ一つ見ていきましょう。

Vector3.SmoothDamp

Vector3.SmoothDampはVector3型の値を徐々に変化させていきます。

現在地から目的地に徐々に移動させたい場合に使います。

第1引数がVector3の現在の位置、第2引数がVector3の目的の位置、第3引数がVector3の現在の速度、第4引数が目的地までの遷移時間、第5引数が移動の最高スピードになります。

第5引数は指定しなくても大丈夫です。

戻り値としてVector3の値が返ってくるのでこれを現在地に再度代入する事で少しづつ移動させる事が出来ます。

第3引数のrefは参照渡しで使用するもので、現在の速度は実行する度に変更されここで指定した変数に代入されます。

ここら辺はとりあえずrefというキーワードを書く必要があるという認識だけで詳しくはC#のリファレンスを確認してください。

Mathf.SmoothDamp

Mathf.SmoothDampはVector3.SmoothDampのfloat型の値を得られるバージョンです。

ある値を目的の値に徐々に変更していきます。

第1引数はfloat型の現在の値、第2引数がfloat型の目的の値、第3引数はfloat型の現在の速度、第4引数が遷移時間、第5引数が移動の最高スピードになります。

Mathf.SmoothDampAngle

Mathf.SmoothDampAngleは1つの角度を徐々に変更させる為のメソッドです。

引数はfloat型でこれまで紹介したメソッドと同じです。

Mathf.SmoothStep

Mathf.SmoothStepは補間をします。

Mathf.Lerpと機能は同じですね?

第1引数がfloat型の現在の値、第2引数がfloat型の目的の値、第3引数では割合を指定します。

割合が0なら現在の値、1以上なら目的の値を返し、0.5なら半分の値を返します。

徐々に値を変化させるサンプルの作成

スムーズに値を変化させるメソッドを見てきたので、それらを使ったサンプルを作成してみます。

今回作成するサンプルはカメラの移動と回転、カメラに映る背景色の変化をさせてみます。

ヒエラルキーで右クリック→3D GameObject→Cubeを選択し名前をTargetとし、このゲームオブジェクトの位置と角度にカメラを遷移させます。

その為、作成したTargetのTransformを変更してください。

TargetのTransform

Targetの位置や角度は↑のように設定しました。

カメラとTransformの位置

↑がカメラとTargetの位置関係です。

カメラがTargetの位置と角度に遷移していくスクリプトを作成します。

カメラの位置の移動は2つのバージョンを作成しました。

一つ目はVector3.SmoothDampを使ってターゲットのゲームオブジェクトの位置に徐々に移動させています。

二つ目はMathf.SmoothStepを使ってX、Y、Zの値をそれぞれ計算し、カメラの位置を徐々に移動させています。

サンプルを実行する時はどちらかをコメント化して実行してください。

SmoothStepの第3引数には経過時間を間隔で割った値を指定します。

SmoothDampは徐々に値を変化させますが、SmoothStepは最初と最後がゆっくりになります。

Mathf.SmoothDampAngleを使ってカメラの角度をTargetの角度へと徐々に変化させています。

Mathf.SmoothDampを使ってカメラの背景色のR、G、Bの値を徐々に目的の値に変化させています。

スクリプトをMain Cameraに設定しパラメータを変更します。

SmoothMoveのインスペクタ

Back Colorの色ではR、G、Bに255、Alphaに0を設定します。

またMain CameraのCameraのClear FlagsをSolid Colorに変更しカメラに映る背景を通常の色にします。

カメラのClearFlagsを変更する

これで設定が出来たので実行してみましょう。

↑のようになりました。

今回は位置の移動でSmoothStepを使用しました。

JavaScriptで使用する場合

C#の場合はrefというキーワードが必要ですが、JavaScriptの場合は付けずに使用します。

SerializeFieldアトリビュートは[]ではなく最初に@を付け、refキーワードの部分を削除すればC#と同じように動作します。

終わりに

SmoothDamp等はrefキーワードを入れる必要があったので全然使っていなかったんですが、現在の速度も取得する事が出来るので用途によってはこちらの方が使い勝手がいいのかもしれません。

SmoothStepはMathf.Lerpと同じような感じですが、まったく同じかどうかはわかりませんでした・・・・(^_^;)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます