[Unity] スプライトのパラパラアニメーション

Unityではデフォルトでアニメーション機能が備わっております。
これを使えばパラパラアニメのような動きも実装できます。

しかし、スプライトのアニメーションを作るたびにUnityのアニメーション設定を行うのが面倒と思われる方もいるかもしれません。(私がそうです)
そのため、簡単な設定で実現できる簡易的なパラパラアニメを行うスクリプトを作成しました。
よろしければご自由にお使いください。

SpriteAnimation.cs

using UnityEngine;
using System.Collections;

// スプライトアニメーションクラス
[RequireComponent(typeof(SpriteRenderer))]
public class SpriteAnimation : MonoBehaviour {
    public Sprite[] clip;   // アニメーション用のスプライト
    public float interval;  // スプライトを切り替える間隔
    public bool isLoop;     // アニメーションループさせるかどうか
    public bool destroyOnFinished;  // アニメーション終了時に消滅するかどうか

    public delegate void OnFinished();
    public OnFinished onFinished;   // アニメーション終了通知イベント

    private SpriteRenderer spriteRenderer;  // スプライトレンダラ
    private int currentClip;    // 現在のアニメーションクリップのインデックス

    // 必要なコンポーネントの参照を取得する。
    void Awake() {
        spriteRenderer = GetComponent<SpriteRenderer>();

        if ( destroyOnFinished ) {
            onFinished += () => { GameObject.Destroy(this.gameObject); };
        }
    }

    // アニメーションを開始する。
    IEnumerator Start() {
        currentClip = 0;

        while ( true ) {
            // 一定時間待機
            yield return new WaitForSeconds(interval);

            // インデックス更新
            ++currentClip;
            if ( currentClip >= clip.Length ) {
                if ( isLoop ) {
                    // ループするのでインデックスを先頭に戻す
                    currentClip = 0;
                } else {
                    // ループしないのでアニメーション終了
                    break;
                }
            }

            // スプライト切り替え
            spriteRenderer.sprite = clip[currentClip];
        }


        // 終了通知イベント実行
        if ( onFinished != null ) {
            onFinished();
        }
    }
}

アニメーションはスプライトの切り替えで行っています。
アニメーションさせたいGameObjectに上記スクリプトをアタッチし、インスペクタからClipにアニメーションの各クリップとなるスプライト、Intervalにスプライトの切り替え間隔、IsLoopにアニメーションをループさせるかどうか、DestroyOnFinishedにアニメーションを終了したらGameObjectを消すかどうかの指定を行ってください。

sprite-animation

今回のスクリプトは、スプライト配列に登録されたスプライトを順番に表示していくだけの簡単なアニメーションですが、必要に応じて改良して使っていただければと思います。