【Unity】連番画像サクッと再生。停止も再生も可◎　大量画像対応◎

「Unity 連番画像」でググるといっぱいありますが

**・１周したあとに自動停止
・すきなタイミングでもう一度再生**

の機能がほしくなったので、つくってみました。

※素人なのでコードに無駄あるかも
※ビルド後の容量デカくてもなんでもいいよって方向け
※スマホビルドは検証してないです
（FHDの画像400枚ほど入れて、standaloneで700MBくらいになってます。。。！！！(やばい)）


##実行環境
・Unity 2019.1.8f1

##GifMaker.cs
以下C#ファイルを準備。

```C#
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GifMaker : MonoBehaviour {

    public Image img;
    public string folderName;
    public string headText;
    public int imageLength;
    public bool IsFirstNum1;
    public bool EnableSkipFirst;
    private bool Flg;
    private int firstFrameNum;
    private int _firstFrameNum;

    void Start()
    {
        if(IsFirstNum1)
        {
            _firstFrameNum = 1;
        }
        else
        {
            _firstFrameNum = 0;
        }

        if(EnableSkipFirst)
        {
            _firstFrameNum = _firstFrameNum + 1;
        }

        firstFrameNum = _firstFrameNum;
    }

    void Update()
    {
        if(!Flg) return;

        //最後の画像を超えたら　最初に戻る
        firstFrameNum++;
        if(firstFrameNum > imageLength) firstFrameNum = _firstFrameNum;

        string _fixedFirstFrameNum = (firstFrameNum).ToString();
        if (firstFrameNum < 10) {
            _fixedFirstFrameNum = "0" + _fixedFirstFrameNum;
        }
        
        //画像変更
        Sprite tex = Resources.Load<Sprite>(folderName + "/" + headText + _fixedFirstFrameNum);
        img.sprite = tex;

        Debug.Log("img.sprite.name = " + img.sprite.name);

        //一周したら停止
        if(firstFrameNum == imageLength)
        {
            SetFlg(false);
        }
    }

    public void SetFlg(bool _flg)
    {
        Debug.Log("SetFlg( " + _flg + " )");

        if(_flg == true)
        {
            firstFrameNum = _firstFrameNum;
            Sprite tex;
            if(IsFirstNum1)
            {
                if(EnableSkipFirst)
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "02");
                }
                else
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "01");
                }
            }
            else
            {
                if(EnableSkipFirst)
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "01");
                }
                else
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "00");
                }
            }

            img.sprite = tex;
            Debug.Log("img.sprite.name = " + img.sprite.name);
        }

        Flg = _flg;
    }

    public bool GetFlg()
    {
        return Flg;
    }
}
```

##手順
###画像をAssets/Resources以下にインポートする
Texture TypeはSprite(2D and UI)に設定にすることも忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/a67014c7-e234-cd2c-b3a4-c9d59fd1396c.png)


###Imageオブジェクトを用意し、GifMakerを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/1e0dc49d-0c0a-a2dd-662b-7ea6aea00760.png)

Image
**Scource Image**・・・連番の最初の画像を設定

Gif Maker
**Img**・・・このImageオブジェクト自身を設定　※Start()で取得だと再生に間に合わなくNullエラー発生する
**Folder Name**・・・Resources以下のディレクトリ名
**Head Text**・・・画像ファイルの先頭文字　※`img_001` であれば`img_0`になる
**Image Length**・・・連番の最後の数字
**Is First Num 1**・・・連番画像の最初の数字が1の場合、✔をいれます
**Enable Skip First**・・・連番の最初の画像だけとばしたい場合、✔をいれます

同じ手順で、別のImageオブジェクトをつくってもそれぞれ再生可能です。

##おまけ機能☺
・**連番の始まりは0でも1でもOK**
・**連番の最初の画像だけスキップ**する処理を入れることも可（手動で最初の画像を消すこともできるけど、連番ファイルをリネームで直すの大変なので）
・Timeではなく、**FPS**に合わせて再生されます。※FPS設定手順⇒[【Unity】フレームレートの上げ方](https://qiita.com/takasy0331/items/2b155b3ca394952748bb)
・**再生中か停止中かを検知**することも可能です


##うまく動かない場合
**・連番が繰り返し再生される**
→Image Lengthの値が合ってない可能性があります。

**・fpsが反映されない**
→全てのLevelでDon't Syncを設定をしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/cf8f0a48-4a5d-f90c-a492-66bfa1371641.png)



##参考
https://qiita.com/a_nishimura/items/d1c33b3c3e3c5189f36a
Resourcesから生成する部分はこちらを参考にさせて頂きました！

##まとめ
フォルダ参照なので
大量に画像があってもサクッとできます◎（容量はやばいね）