こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityでアニメーションを逆再生させる方法が知りたい!」
「スクリプトから逆再生の処理はできるの?」
というお悩みの方に向けた内容となっています。
Unityで作成したアニメーションを逆向きに再生させたい場合、Animatorコンポーネントのspeed変数にマイナス値を入れても、逆再生することができません。
アニメーションを逆再生するには、AnimatorControllerのAnimationStateにあるspeedの値にマイナス値を入れることで逆再生されます。
また、スクリプトから逆再生させる場合は、AnimatorControllerでパラメーターを作成してspeedの値を調整し、そのパラメーターをスクリプトから変更させる処理を行うことで逆再生することができます。
そこで、このページでは、Unityでアニメーションを逆再生させる方法について、インスペクターウィンドウから行う方法と、スクリプトから行う方法をそれぞれまとめていきます。
インスペクターからアニメーションを逆再生させる方法
まずは、インスペクターウィンドウからアニメーションを逆再生させる方法になります。
ここでは、以下のキューブオブジェクトが右回りに動く簡単なアニメーションを使って説明していきます。

なお、アニメーションの作成については、以下の記事も参考にしてみてください。
AnimationStateのspeedにマイナス値を設定する
アニメーションを逆再生させる場合、AnimatorControllerのAnimationStateの設定を変更していきます。
まず、AnimatorControllerを開いて、逆再生させたいステートを選択します。

そして、インスペクターウィンドウの「Speed」の項目にマイナスの値を設定します。

これでゲームを実行してみると、

アニメーションが逆向きに再生されて、オブジェクトが左回りになっているのが分かります。
通常再生と逆再生を繰り返す処理を作る
最初はアニメーションを通常再生させて、終わった後に逆向きで再生させるようにしたい場合は、新しく逆向き再生用のステートを作れば実装できます。
まず、通常再生のステートを選択した状態で「Ctrl+D」を押すと、同じステートを複製することができます。

この複製したステートのインスペクターウィンドウから、「Speed」の項目にマイナスの値を設定します。

そして、ステートを右クリックして、「Make Transition」を選択しアニメーションを遷移させる設定を行います。

ここでは、通常再生と逆再生の遷移を繰り返すようにしたいので、以下のようにお互いのステートに矢印のマークが付くようにします。

また、この矢印マークを選択して、インスペクターウィンドウの「Exit Time」を「1」、「Transition Duration(s)」を「0」に設定しています。

これでゲームを実行してみると、

通常再生(右回り)と逆再生(左回り)を繰り返す処理が行われるようになりました。
スクリプトからアニメーションを逆再生させる方法
次に、スクリプトからアニメーションを逆再生させる方法について紹介していきます。
ここでも、先ほどと同じアニメーションを使って説明していきます。
パラメーターを作成する
AnimationStateのspeedの値は、スクリプトからでは直接変更することができないため、AnimatorControllerのパラメーターを使用していきます。
まず、上部にある「Parameters」を選択して、+ボタンから「Float」の項目を選びます。

あとでスクリプトから指定するので、パラメーター名を分かりやすい名前などに変更しておきましょう。

このパラメーターの値はスクリプトから設定するので、「0」のままでも良いですが、念のためここでは「1」にしています。
Multiplierでパラメーターの値を乗算させる
パラメーターが作成できたら、AnimationStateのSpeedの値に、このパラメーターの値を乗算させていきます。
まず、アニメーションを逆再生させたいステートを選択します。

そして、インスペクターウィンドウのSpeedの項目の下にある「Multiplier」の「Parameter」にチェックを入れてあげます。

すると、Multiplierの項目にパラメーターを設定することができるので、先ほど作成したパラメーターを選択してあげます。

これで、Speedの値に対して、パラメーターの値が掛け算され、その速度でアニメーションが再生されることになります。
スクリプトからパラメーターの値を変更させる
あとは、スクリプトからこのパラメーターの値を変更させれば、逆再生させることができます。
オブジェクトに対して、以下のスクリプトをアタッチしておきます。
using UnityEngine;
public class Test : MonoBehaviour
{
Animator animator; // Animatorコンポーネントの変数を作成
float speed = 1; // アニメーションのスピードを変数で作成
void Start()
{
animator = GetComponent<Animator>(); // Animatorコンポーネントを取得する
}
void Update()
{
// スペースキーを押した場合
if (Input.GetKeyDown(KeyCode.Space))
{
this.speed *= -1; // 変数に-1をかける
animator.SetFloat("Speed", speed); // パラメーターの値を変数の値に設定する
}
}
}
18行目でスペースキーを押した場合に、スピードを決める変数の値に「-1」をかけています。
そして、19行目でAnimatorコンポーネントのSetFloatメソッドを使って、パラメーターの値を変更しています。
このSetFloatメソッドは、引数を使ってパラメーターの値を変更させる処理を行います。
Animator.SetFloat(name, value);
name:パラメーターの名前(string型)
value:パラメーターの値(float型)
これでゲームを実行してみると、

スペースキーを押すと、アニメーションが逆再生される処理を作ることができました。
まとめ
このページでは、Unityでアニメーションを逆再生させる方法について紹介していきましたが、いかがでしたでしょうか?
アニメーションを逆再生させる場合は、AnimatorControllerのステートを選択して、インスペクターからSpeedの値にマイナスを入れることで、逆再生させることができます。
また、スクリプトから行う場合は、パラメーターを使ってSpeedの値をマイナスに調整することで、アニメーションが逆向きに再生されるようになります。
Animatorコンポーネントのspeed変数では、負の値を設定できず逆再生されないので、注意しておきましょう。
最後までお読みいただきまして、ありがとうございました!
コメント