22
15

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 3 years have passed since last update.

UnityでGif動画を撮影したい

Posted at

概要

Unity上でGif動画を読み込む方法はいくつかありますが、Gif動画を撮影するとなるとあまり情報が出てきません。
今回は「UnityでGif動画を撮影する方法」を紹介します。

紹介するライブラリ - Moments

カメラにコンポーネントをアタッチして、Record()を呼び出すだけでGif動画の作成および書き出しを実行してくれるライブラリです。
Zlibライセンスです。

使い方

1. カメラに Moments Recorder をアタッチする

1.png

カメラにMoments Recorderコンポーネントをアタッチします。

インスペクタから録画するGif動画の設定を行うことができます。
(解像度やフレームレート、圧縮の設定ができる)

なお、 Record Timeの値は「最大で録画できる時間(秒数)」を表しています。
ここで設定した時間を超えて録画することはできないので、実際に録画する秒数より少し長めにしておくとよいでしょう。

2. スクリプトから録画処理を呼び出す

ちょっとAPIにクセがあるので注意です。

  1. Recorder.StateRecorderState.PreProcessing(前の録画データの書き出し準備中)だったらいったん待つ
  2. Recorder.Record()を呼び出して録画を開始する
  3. 任意の秒数自分で待つ
  4. Recorder.Pause()を呼び出して録画を完了する
  5. Recorder.Save()を呼び出してファイルに書き出す(RecorderState.PreProcessingステートになる)
  6. 書き出しが完了する
using System.Collections;
using Moments;
using UnityEngine;

public class RecordSample : MonoBehaviour
{
    [SerializeField] private Recorder _recorder;

    private void Start()
    {
        // 1回録画した後に、次の録画準備が整ったことを伝えるコールバック
        _recorder.OnPreProcessingDone += () => { Debug.Log("録画準備が完了しました"); };

        // ファイルの書き出しが完了したコールバック
        _recorder.OnFileSaved += (i, s) => { Debug.Log($"{s} に保存しました"); };

        StartCoroutine(RecordeCoroutine());
    }

    IEnumerator RecordeCoroutine()
    {
        _recorder.SaveFolder = Application.dataPath;

        // 録画準備が整うまで待つ
        yield return new WaitWhile(() => _recorder.State == RecorderState.PreProcessing);

        // 録画開始
        _recorder.Record();

        // 2秒間録画する
        yield return new WaitForSeconds(2.0f);

        // 録画停止
        _recorder.Pause();

        // 保存
        _recorder.Save(filename: "RecordedFile");
    }
}

3. Gifファイルができあがる

TestGifRecord.gif

Moments、すごい。けどちょっと物足りない。

たったこれだけでGif動画が記録できるので、すごい便利です。
ファイル書き出しも別スレッドで実行してくれます。

こんなすごいMomentsですが、ちょっと足りない部分があります。
それはAPIが同期しかないところです。

UnityGifRecorder - Momentsをラップして使いやすくしたライブラリ

ということで、Momentsをラップする形で非同期APIを提供するライブラリを作ってみました。
(といっても本当に数行APIをラップしただけなので、こんな大層な名前つけるほどでも無いんですが…。ライセンスもいっちょ前にMITライセンスですが、正直中身の9割9分はMomentsそのまんまです)

UniTaskに依存しているのでこちらとセットで導入してください。

使い方

基本はMomentsRecorderと同じです。
というか中身はMomentsRecorderそのもので、それをUnityGifRecorderが薄くラップしてるだけです。

違いとしては録画と書き出しが非同期APIになっているところです。

public class RecordSample : MonoBehaviour
{
    // MomentsRecorder と UnityGifRecorder をセットでカメラに貼り付けてね
    [SerializeField] private UnityGifRecorder _recorder;

    private async UniTaskVoid Start()
    {
        var ct = this.GetCancellationTokenOnDestroy();

        // 録画パス指定
        _recorder.SaveFolder = Path.Combine(Application.dataPath, "TORISOUP", "UnityGifRecorder", "Demo", "output");

        // 指定秒数、録画する
        await _recorder.RecordAsync(seconds: 2.0f, DelayType.DeltaTime, token: ct);

        // ファイルに書き出す
        await _recorder.SaveAsync(fileName: "TestGifRecord");
    }
}

まとめ

  • Momentsを使えば簡単にUnityでGif動画が撮影できる
  • 非同期APIが恋しい人はUnityGifRecorderと合わせて使ってみるといいかも
22
15
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
22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?