値をイージングする【Unity】

Unityでスクリプトから値を動かす時、物理演算のAddForceみたいに滑らかな加減速(イージング)をさせたいと思うことがあります。
今回はUnityでスクリプトから値をイージングをする方法についていくつかまとめてみました。

DOTween.Toを使う

有名なアセット「DOTween」で値をイージングする方法があります。「DOTween.To」です。
使い方は以下のような感じで、毎フレームの処理をしなくても開始の1行を記述するだけで実行できます。
末尾のSetEase()でイージングの種類を指定できるところがポイントで、DOTweenに含まれる沢山のイージングを適用させることができます。

ただしDOTweenのイージングはUpdateでもコルーチンでもないので、動かしたい内容によっては扱いづらい場合もあります。
シンプルな動きを簡潔な記述で実行できるので、他の方法と使い分けるのが良いのかなと思います。

なお、単純にオブジェクトをイージング付きで動かすだけであればDOTween.ToではなくTransform.DOMoveやRigidbody.DOMoveなど専用の関数があります。

イージングの関数を自分で作る

DOTweenにあるEaseInQuad・EaseOutQuadなどは自分で関数を作ることもできます。
今回初めてAIにイージングの関数を書いてもらいました。
UnityでMathf.Lerpと同じ感覚で使えるように調整したものがこちらです。
aは開始値、bは終了値、tは0.0fから1.0fの補間値です。

EaseIn

EaseOut

それぞれ t * t や (1 – t) * (1 – t) となっている部分の累乗回数が2乗だとQuadで、回数を増やすことでQuad→Cubic→Quart→Quintになるようです。

なおEaseInQuadEaseOutQuadEaseInOutについては次のAnimation Curveにも含まれているのでそちらを使っても良いかもしれません。

AnimationCurveを使う

計算式で定義された動きではなくもっと特殊な動きを自分で作りたい!という場合があるかもしれません。
そういう場合はAnimationCurveを使って独自のイージングの動きを作ることができます。

まずスクリプトの方でインスペクターで表示できるようにAnimationCurveの変数を用意します。
するとインスペクターに枠が表示されるので、クリックするとベジエカーブの編集画面が開きます。
しかも、プリセットでLinear(線形補間:左から2つ目)/ EaseInQuad(中央) / EaseOutQuad(右から2つ目) / EaseInOut(右端)があります。

プリセットから好きなものを選ぶか、ベジエカーブを好きなように編集しておきます。自分が作ったものをプリセットに登録することもできます。

値を使うときはAnimationCurve.Evaluate(0.0f~1.0fのfloat値)でカーブの値を取得することができます。
コルーチンやFixedUpdateで0から1まで値を動かすようにしてカーブの値を取得すると、カーブに従って滑らかに値を動かすことができます。

ホップステップジャーンプ!

更にこれをイージングの関数と同様に使えるようにするならこんな感じです。

オブジェクトに事前に作った動きを適用するにはAnimationもありますが、イージングされた値だけが必要でその後の処理をスクリプトで色々やりたいのであればAnimationCurveがとても便利なのでオススメです!

AnimationCurveの使い方メモ

ちょっとだけ使い方が分かりにくいところがあったのでメモを残します。
まずハンドルの角度の指定方法が5種類あります。

Clamped Auto

隣り合ったキーとの間を自動で滑らかにつなぎます。

なお、「Auto」は古い機能が互換用に残されているものなので使わない方がいいらしい(Clamped Autoを使った方がよい)とのことです。

Free Smooth

ハンドルの角度を自由に設定できます。

Flat

必ず水平になります。(Free Smoothの一種とのことで、オンにすると自動でFree Smoothもオンになります)

Broken

ハンドルを折ります。

Brokenには更に折り方のオプションがあって、Free・Linear・Constant・Weightedが選べます。
メニュー下の方の「Left Tangent」「Right Tangent」「Both Tangent」から設定します。

Free

角度だけ自由に動かせます。

Linear

カーブせず直線(折れ線)になります。

Constant

次のキーまで一定の値を保ちます。

Weighted

この右側のキーみたいにハンドルの長さを変更することができます。

まとめ

イージングにもいろんな方法があり、簡単に実装する方法からこだわりの動きを作る方法までいろいろ出来るのでそれぞれのやり方と特徴を覚えておくのがよさそうです。
なお、値の直接変更でオブジェクトを動かす際はTime.DeltaTimeの乗算やFixedUpdateを使うなどスピードの調整に要注意です。

シェアする

「Unity」の記事

もっと読む>>

最新記事

もっと読む>>