【Unity(C#)】カメラに映った世界をGIF画像にする方法

　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。

##GIF画像を作る

2019/04/20　追記
[最強のGif画像作成ツール](https://github.com/NickeManarin/ScreenToGif/releases)を教えてもらいましたとさ。めでたしめでたし。。。

---
「いいから黙って使わせろ」という方はこちらからダウンロードしてください→[GitHub](https://github.com/ForJobOk/GIF_Create)

Unityで動画やGIF画像無しに説明するのしんどいので調べました。

ありました→https://github.com/Chman/Moments.git

![git Gif画像作成.png](https://qiita-image-store.s3.amazonaws.com/0/244071/1bd05256-0a09-1aa5-a194-84ed5c022f64.png)
　
ダウンロードして解凍してUnityのProjectにぶち込みます。
私がぶち込んだ際にはエラーが出ました。でも慌てないでください。
深呼吸してエラーメッセージを読みましょう。

私のエラーは`MinAttribute`というクラス名を違う適当な名前に変更したら消えました。


使い方を書きます。

##使い方
###①既存のScriptに追加

`Recorder`というScriptを開きます。
Recorderクラスのフィールドに`float returnBufferSize;`を追加し、
下記メソッドを追加します。

```C#
public float ReturnBufferSize()
{
  return returnBufferSize = m_BufferSize;
}
```
`m_BufferSize`というのは録画時間のことを指します。
次の工程で録画時間を他クラスに渡す必要があります。
そこで、録画時間を返すメソッドを用意しました。

###②新しいScriptを作る
便利なメソッドがたくさん用意されていたので助かりました。
ところどころよくわかりませんが動いたので良しとしましょう。


追記:2019/02/01
すみません、なんか間違えたっぽいんで直しました。

```C#
using UnityEngine;
using System;
using Moments;
using System.Collections;
public class Rec : MonoBehaviour
{
    bool isRec;
    bool isSave;

    int countTryRec;

    Recorder rec;

    Coroutine runCoroutine;

    void Start()
    {
        print("Rで録画開始");
        rec = GetComponent<Recorder>();
        rec.OnPreProcessingDone = OnProcessingDone;
        rec.OnFileSaveProgress = OnFileSaveProgress;
        rec.OnFileSaved = OnFileSaved;

        //BufferSizeがfloatだとめんどうなのでエラーメッセージで忠告する
        if (rec.ReturnBufferSize() - (int)rec.ReturnBufferSize() != 0)
        {
            Debug.LogError("BufferSizeを自然数にしろ");
        }
    }

    //保存開始時
    void OnProcessingDone()
    {
        print("保存開始");
    }

    //保存中　idという引数はよくわからん
    void OnFileSaveProgress(int id, float percent)
    {
        print("保存中:" + Math.Truncate(percent * 100.0) + "/" + "100％");
    }

    //保存終了時　idという引数はよくわからん
    void OnFileSaved(int id, string filepath)
    {
        print("保存完了:" + "100" + "/" + "100％" + filepath);
        isSave = false;
    }

    void Update()
    {
        //録画 ->　録画中、セーブ中は押せない
        if (Input.GetKeyDown(KeyCode.R) && isRec == false)
        {
            runCoroutine = StartCoroutine(RecCountDown());
        }
    }

    //録画開始～終了まで
    IEnumerator RecCountDown()
    {
        isRec = true;

        float second = 1f;
        int count = 0;

        //録画カウントダウン
        print("録画開始まで");
        yield return new WaitForSeconds(second);
        print("3");
        yield return new WaitForSeconds(second);
        print("2");
        yield return new WaitForSeconds(second);
        print("1");
        yield return new WaitForSeconds(second);
        print("開始");
        rec.Record();

        //残り秒数の表示
        for (int i = 0; i < rec.ReturnBufferSize(); i++)
        {
            yield return new WaitForSeconds(second);
            count++;
            print("録画時間" + ":" + count + "/" + rec.ReturnBufferSize()+"秒");
        }

        //録画終了
        print("録画終了");

        //保存開始
        rec.Save();


        yield return new WaitForSeconds(second);
        isRec = false;

        StopCoroutine(runCoroutine);

    }


}
```
###③カメラに①、②をAdd Componentする
![Recorder.png](https://qiita-image-store.s3.amazonaws.com/0/244071/7c14c587-7cdf-8d24-994e-5b2a9b0f8f9c.png)

使いどころとしては以下3つくらいだと思います。

| パラメーター名       |       機能 | 
|:-----------------|------------------:|
| Frame Per Second             |              小さいとカクカク、大きいとヌルヌル |
| Repeat          |           画像の繰り返し回数 | 
| Buffer Size            |              再生時間(録画時間)|  

##実際に動かしてみた

![カウントRec.png](https://qiita-image-store.s3.amazonaws.com/0/244071/4829036b-3538-9b15-1578-30cf194da89a.png)
キーボードの`R`で録画のカウントダウンが開始します。
3秒後(正確には4秒後)に録画が開始されます。

録画開始後は録画終了までの秒数が表示されます。
もう一度録画をやり直したい場合は`R`を、~~保存したい場合は`S`を押します。~~
勝手に保存されるように変更しました。
![Save Gif.png](https://qiita-image-store.s3.amazonaws.com/0/244071/b3c9e1e5-8259-2f88-0684-27787be4eb07.png)
保存開始後は保存終了までのパーセンテージが表示されます。
保存完了後はファイルの保存場所が表示されます。

![Saved Gif.png](https://qiita-image-store.s3.amazonaws.com/0/244071/1634edc9-1c0f-4369-8f7e-249d63abadda.png)
~~Editorウインドウを一度たたんで開くと保存されています。~~

追記(2019/03/02)：ProjectWindowのRefresh機能を追加しました。

###BufferSizeは自然数で
![BufferSize.png](https://qiita-image-store.s3.amazonaws.com/0/244071/7561ba9d-9ae0-aa22-c3d8-524a42680529.png)
エラーメッセージの通りです。


　
　　
これのおかげでいろんな記事が書けるようになった気がします。
もっとこうした方がいいとか、他の簡単な方法とかあれば教えてください。
個人的にはシーンビューをGIFにできたら便利だなーと思いました。