AnimationCurveとは?
AnimationCurve
は、Unity
でアニメーションデータや補間を扱うためのクラスです。
このクラスを使用することで、時間に対する値の変化をグラフ曲線として定義し、その曲線に基づいてアニメーションの挙動を制御することができます。
簡単な使い方
AnimationCurve
は、標準機能なのでパッケージなどを追加しなくても使用できます。
以下の様なコンポーネントクラスを作成し、GameObject
にアタッチするとインスペクタ上に表示されます。
using UnityEngine;
public class CurveTest : MonoBehaviour
{
[SerializeField] private AnimationCurve _curve;
}
インスペクタでは、グラフ部分を選択するとCurve編集用ウィンドウが開きます。
ここで、時間が0〜1に変化する間に、値をどのように変化させるのかを設定できます。
コードからグラフを設定するには?
AnimationCurve
はコードからも設定を行うことが出来ます。
AnimationCurve
の実体にAddKey
でキーフレームの時間と値を設定します。
AnimationCurve curve = new AnimationCurve();
curve.AddKey(0f, 0f);
curve.AddKey(1f, 1f);
この場合は下図のようなグラフになります。
また、AddKey
メソッドには、KeyFrame
クラスを渡すことも出来ます。
KeyFrame
の場合は、キーフレームの左右の傾きも設定することが出来ます。
AnimationCurve curve = new AnimationCurve();
_curve.AddKey(new Keyframe(0f, 0f, 1f, 0f));
_curve.AddKey(new Keyframe(1f, 1f, 0f,1f));
この場合は下図のようなグラフになります。
値を取得する
AnimationCurve
を用意できたので、時間経過に応じて値を取得する方法を見ていきます。
値を取得するには、Evalutate
メソッドに時間を渡します。
Update
メソッドを追加して、Text
に時間と値を表示してみます。
private void Update()
{
var value = _curve.Evaluate(Time.time);
_text.text = $"Time: {Time.time:F2}\nValue: {value:F2}";
}
時間経過でValue
が1.00まで変化するのを確認できました。
アニメーションに使用する
値は取得できたので実際にアニメーションさせてみます。
ローカルのX座標を-100から100までの間を移動させてみます。
var localPosition = transform.localPosition;
localPosition.x = -100f + 200f * value;
transform.localPosition = localPosition;
スプライトを移動させることが出来ました。
時間外の挙動
先ほどの例では、時間が1を過ぎるとになると値が変化しなくなります。
時間が1を過ぎた後、もしくは0より前の場合のどのように扱うかはCurveEditor上で設定できます。
グラフの左右にある歯車をクリックすると以下の3種類から処理を選択できます。
Clamp(初期値)
- 時間外では値が変化しなくなります
Loop
- 時間を0〜1の間に収めてループさせます
Ping Pong
- 時間を逆にして往復するようになります。
動画にすると以下の様になります。
カーブごとの動作の違い
3つのスプライトのAnimationCurve
のカーブを変えてみました。
同じ1秒間での移動ですが、緩急が付いているのが分かります。
まとめ
AnimationCurve
について説明しました。
AnimationClip
を使うほどでもないちょっとしたアニメーションに使えるかと思います。
AnimationCurve
は、時間に対する値の変化を簡単に定義できるため、スムーズなアニメーションを実現するのに非常に便利です。
エディターのインスペクターを使って視覚的に編集できるため、デザイナーやプログラマーが直感的にアニメーションの動きを調整することができます。
また今回は移動のみでしたが、各種アニメーション以外にもスコアの変動、色の変化などにも使用できます。
いろいろなものが連動するアニメーションをさせたい場合はAnimationClip
や、
DOTween
のようなアセットの使用も検討してみてください。