【Unity】アニメーションのループ回数を指定して再生する方法

アニメーションのループ回数を指定 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「アニメーションのループ回数を指定したい!」

「3回再生されたらアニメーションを止めたいけど、やり方が分からない!」

というお悩みの方に向けた内容となっています。

Unityでは、アニメーションの機能を使ってオブジェクトに様々な動きを付けることができます。

このアニメーションは、何度も繰り返しループ再生させることができますが、ループ回数を指定したい場合は、スクリプトで条件処理を書いていくことになります。

例えば、あるアニメーションを2回再生したら停止させる、もしくは別のアニメーションに切り替えるといった場合に、ループ回数を指定する必要がでてきます。

そこで、このページでは、Unityでアニメーションをループ再生させる際に、ループ回数を指定して再生させる方法についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

アニメーションのループ回数を指定して再生する方法

ここでは、アニメーションを4回ループ再生させて、その後アニメーションを停止させるという処理を作っていきます。

アニメーションを準備する

まずは、アニメーションを準備していきます。

ここでは、以前作成した以下の棒人間のキャラクターに、簡単なアニメーションを付けていきます。

アニメーションを作る際は、シーン内に配置したキャラクターのオブジェクトを選択して、メニューから「Window」の中にある「Animation」「Animation」を選択します。

そして、開いたAnimationウィンドウの「Create」を選択して、アニメーションを作成していきます。

なお、アニメーションの具体的な作成方法については、以下のページを参考にしてみてください。

ここでは、タイムライン上でキャラクターの腕に入っているボーンを回転させるようにして、腕を一回転させるアニメーションを作ってみました。

デフォルトでループ再生されますが、もしループされない場合は、プロジェクトウィンドウから作成したAnimation Clipを選択して、インスペクターウィンドウの「Loop Time」にチェックが入っているかどうかを確認しましょう。

アニメーションのループ回数を取得する

次に、先ほど作成したアニメーションがループ再生された回数を取得していきます。

ループ回数を取得する方法はいくつかありますが、ここでは、スクリプトでnormalizedTimeという変数を使って取得していきます。

アニメーションをセットしたオブジェクトに、以下のスクリプトをアタッチしていきます。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Animator animator;
    float animationTime;    // アニメーションの再生時間
    int loopCount;  // ループ回数
    int preCount = 0;   // 前のループ回数

    void Start()
    {
        animator = GetComponent<Animator>();    // Animatorコンポーネントを取得
    }

    void Update()
    {
        animationTime = animator.GetCurrentAnimatorStateInfo(0).normalizedTime; // アニメーションの再生時間を取得
        loopCount = Mathf.FloorToInt(animationTime);    // 小数点以下を切り捨て処理

        // ループ回数が変更した場合
        if (preCount != loopCount)
        {
            Debug.Log(loopCount + "回目");    // コンソールウィンドウに表示させる
            preCount = loopCount;
        }
    }
}

まず、12行目でAnimatorコンポーネントGetComponentメソッドを使って取得します。

次に、17行目でnormalizedTimeを使ってループ回数を取得していきます。

このnormalizedTimeは、アニメーションの再生前を0、終了時を1として、アニメーションの再生時間(長さ)を正規化した変数です。

例えば、再生している部分がアニメーションの半分の位置であれば0.5となります。

また、ループ再生された場合は1以上の値となるので、このnormalizedTimeの値を使ってループ回数を取得することができます。

そしてnormalizedTimeを使う際は、

AnimationState.normalizedTime

と記述して、AnimationStateの部分で指定したステートでのアニメーションの再生時間を取得することができます。

なお、このステートとは、アニメーションの遷移を管理するAnimator Controllerの以下の部分のことを指します。

そして、現在再生されているステートを取得するのに、Animatorコンポーネントで定義されているGetCurrentAnimatorStateInfoというメソッドで取得することができます。

このGetCurrentAnimatorStateInfoは、引数にレイヤー番号を指定することで、現在再生中のステートが返ってきます。

レイヤーは、Animator Controllerの以下の部分を指していて、デフォルトの「Base Layer」を使っている場合は、引数を0とすれば問題ありません。

また18行目で、normalizedTimeで取得した値の小数部分を切り捨てる処理をMathf.FloorToIntメソッドで行っています。

実際にゲームを実行してみると、

アニメーションがループされる度に、ループ回数が表示されているのがわかります。

指定したループ回数を超えたら停止させる

ループ回数を取得することができたので、ここではアニメーションを4回ループ再生させたら停止させる処理を作っていきます。

先ほどのスクリプトを以下のように修正します。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Animator animator;
    float animationTime;    // アニメーションの再生時間

    void Start()
    {
        animator = GetComponent<Animator>();    // Animatorコンポーネントを取得
    }

    void Update()
    {
        animationTime = animator.GetCurrentAnimatorStateInfo(0).normalizedTime; // アニメーションの再生時間を取得

        // ループ再生が4回を超えた場合
        if (animationTime > 4)
        {
            animator.enabled = false;   // アニメーションを停止する処理
        }
    }
}

18行目でnormalizedTimeの値が4を超えた場合、つまりループ再生が4回行われた場合の条件式を作っています。

そして、その中でアニメーションを停止させる処理として、20行目でenabledの変数にfalseの値を代入しています。

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

アニメーションが再生されて、腕を4回回し終わったらアニメーションが停止されるようになりました。

同じような仕組みを使えば、指定回数ループさせた後に、別のアニメーションに遷移させるという処理も作れます。

まとめ

このページでは、Unityでアニメーションのループ回数を指定して再生する方法についてまとめていきましたが、いかがでしたでしょうか?

アニメーションのループ回数を指定する場合は、スクリプトでnormalizedTimeの変数を使って実装することができます。

このnormalizedTimeは、アニメーションの再生時間を正規化しているもので、ループ回数を計測することができます。

そして、ループ回数を指定することで、例えばアニメーションを何回再生して停止させる処理や、別のアニメーションに遷移させるという処理を作ることができます。

最後までお読みいただきまして、ありがとうございました!

コメント