1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-26

  
  
  
この記事は

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

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

##GIF画像を作る

2019/04/20 追記
最強のGif画像作成ツールを教えてもらいましたとさ。めでたしめでたし。。。


「いいから黙って使わせろ」という方はこちらからダウンロードしてください→GitHub

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

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

git Gif画像作成.png
 
ダウンロードして解凍してUnityのProjectにぶち込みます。
私がぶち込んだ際にはエラーが出ました。でも慌てないでください。
深呼吸してエラーメッセージを読みましょう。

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

使い方を書きます。

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

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

public float ReturnBufferSize()
{
  return returnBufferSize = m_BufferSize;
}

m_BufferSizeというのは録画時間のことを指します。
次の工程で録画時間を他クラスに渡す必要があります。
そこで、録画時間を返すメソッドを用意しました。

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

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

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

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

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

##実際に動かしてみた

カウントRec.png
キーボードのRで録画のカウントダウンが開始します。
3秒後(正確には4秒後)に録画が開始されます。

録画開始後は録画終了までの秒数が表示されます。
もう一度録画をやり直したい場合はRを、保存したい場合はSを押します。
勝手に保存されるように変更しました。
Save Gif.png
保存開始後は保存終了までのパーセンテージが表示されます。
保存完了後はファイルの保存場所が表示されます。

Saved Gif.png
Editorウインドウを一度たたんで開くと保存されています。

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

###BufferSizeは自然数で
BufferSize.png
エラーメッセージの通りです。

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

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?