インポート設定でアニメーションクリップにカーブを追加して、アニメーションとエフェクトを連動させてみました。
カーブを追加する
まず、アニメーションを付けたCubeをインポートして、そのFBXファイルを選択し、インスペクタのAnimationタブを見ました。
Clipsでカーブを付けたいアニメーションクリップを選択して、Curvesセクションを開き、+ボタンでカーブを追加します。
新しいカーブが表示されるので、緑の線が描かれた部分を左クリックすると、カーブを編集するウィンドウがでます。
カーブを編集する
このウィンドウを見ると、カーブが一直線で、値が0から変化しないことがわかります。
プリセットも用意されています。
0の直線から開始してみます。値が0でない場合は、すべてのキーを選択して、右クリックします。
Edit Keys..を選択すると、キーごとに時間と値を入力できます。複数選択しているので、値だけ0に変えます。
値が0になったので、カーブの中央あたりをダブルクリックしてキーを追加しました。
Cubeが素早く動いているときのエフェクトを目立たせたいので、その地点を1にしました。
これでカーブが山なりになりました。止まっているときは0にしたいので、左端に値が0の範囲を作ります。キーを追加して値を0にすると、カーブが曲がって0にとどまっていない部分があります。
このキーを右クリックしてFlatを選択すると、まっすぐになりました。
その下のプレビューでCubeが動き出したり止まったりするタイミングを確認できます。
Curvesセクションでは、カーブの名前を変更できます。
また、Applyする前に、Loop Timeのチェックを入れて、アニメーションがループするようにしました。
アニメーターコントローラー
インポートしたCubeをシーンに配置して、Animatorコンポーネントを付けました。また、アニメーターコントローラーを新規作成して、このAnimatorコンポーネントにアタッチしました。
アニメーターコントローラーでは、カーブを追加したアニメーションをドラッグアンドドロップしてデフォルトステートを作り、編集したカーブと同じ名前のFloat型のパラメーターを追加します。
カーブと同名にすると、このパラメーターにカーブの値が設定されます。なので、GetFloatメソッドを使って、カーブの値を取得できます。
VFXグラフを作る
アニメーションと連動させるための、新しいVFXグラフを作りました。
このVFXグラフでは、「Conform to Sphere」ブロックにつなぐ2つのプロパティがあります。一つはStick Distanceに使うもので、もう一つはそれを伸縮させるための0~1の範囲の値です。
後者のパラメーターに、カーブの値をセットします。
このVFXグラフがアタッチされた、Visual Effectオブジェクトを作り、Cubeの上部に置きました。ライフタイムの値もオーバーライドしておきます。
カーブの値を取得する
2つのオブジェクトを空のゲームオブジェクトの子にして、この空のゲームオブジェクトにスクリプトを付けました。
スクリプトでは、Updateメソッドで、アニメーターのパラメーターの値を、Visual Effectのプロパティに設定します。
using UnityEngine;
using UnityEngine.VFX;
public class CurveTest : MonoBehaviour
{
[SerializeField] Animator animator;
[SerializeField] VisualEffect vfx;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
vfx.SetFloat("StickDistanceMultiplier", animator.GetFloat("Curve"));
}
}
これで、アニメーションと連動するカーブに合わせて、エフェクトが変化します。
後は、カーブの形を調整します。