【制作】アニメーションカーブについて

バトル実装はまだまだかかります。

今日も視覚的な成果がないので、またUnityの技術的な話を書いておこうと思う。

いわゆるスキンメッシュアニメーションを除いて、オブジェクトの移動、回転、スケールなどを行う際には、時間の経過とともに少しずつ変化するようなアニメーションを行っていることと思う。

たとえば移動なら Update() の中で、時間経過にしたがって目的地に近づくようにオブジェクトの位置を少しずつ変化させる、とか。

自力で実装する場合、直線的にアニメーションさせるのは容易である。

しかし、動き出しや停止直前など、曲線的に速度を変えて動きを滑らかにしようと思うと途端に計算がややこしくなる。

iTweenのスクリプトを使えば、比較的容易に実装できるんだけれども、今日はiTweenを使わずに自力で簡単にアニメーションカーブを実装する方法を紹介する。

といっても、Unityの標準APIのAnimationCurve.EaseInOut()を使うだけなんだけれども。

このAPIは以下のようにインスタンス化して使う。

AnimationCurve curve = AnimationCurve.EaseInOut(0, 0, span, 1);

引数は左から、開始時間、開始時の値、終了時間、終了時の値を指定してやる。

そして、下のようにインスタンスに経過時間を渡してやると、開始時間から終了時間までのある時点の値を返してくれる。

//インスタンス化したアニメーションカーブを使ってある時点の値を取得する
float progress = curve.Evaluate(time);

実際的な使い方は、まず、開始時間に0、終了時間にアニメーションにかかる時間を指定して、開始時の値に0、終了時の値に1を指定してやる。

そして、アニメーションカーブから得られた値を使って、移動、回転、スケールなどのベクトルの補間を算出する、というやり方が一般的ではないかと思う。

//インスタンス化したアニメーションカーブを使ってある時点の値を取得する
float progress = curve.Evaluate(time);

//progress を進捗度合いとしてベクトルの補間をする。
target.transform.position = Vector3.Lerp(posFrom, posTo, progress);

アニメーションカーブには、キーフレーム(ある時点でどれくらいの値になっているか)を自由に追加できるので、急発進してゆっくりと停止するなどのアニメーションも手軽に試すことができる。

これを使えば、自力でアニメーションを実装する場合でも、リッチな動作を比較的簡単に実装することができるのである。

4年前

コメントを残す

メールアドレスが公開されることはありません。