概要
Unity上でGif動画を読み込む方法はいくつかありますが、Gif動画を撮影するとなるとあまり情報が出てきません。
今回は「UnityでGif動画を撮影する方法」を紹介します。
紹介するライブラリ - Moments
カメラにコンポーネントをアタッチして、Record()
を呼び出すだけでGif動画の作成および書き出しを実行してくれるライブラリです。
Zlibライセンスです。
使い方
1. カメラに Moments Recorder
をアタッチする
カメラにMoments Recorder
コンポーネントをアタッチします。
インスペクタから録画するGif動画の設定を行うことができます。
(解像度やフレームレート、圧縮の設定ができる)
なお、 Record Time
の値は「最大で録画できる時間(秒数)」を表しています。
ここで設定した時間を超えて録画することはできないので、実際に録画する秒数より少し長めにしておくとよいでしょう。
2. スクリプトから録画処理を呼び出す
ちょっとAPIにクセがあるので注意です。
-
Recorder.State
がRecorderState.PreProcessing
(前の録画データの書き出し準備中)だったらいったん待つ -
Recorder.Record()
を呼び出して録画を開始する - 任意の秒数自分で待つ
-
Recorder.Pause()
を呼び出して録画を完了する -
Recorder.Save()
を呼び出してファイルに書き出す(RecorderState.PreProcessing
ステートになる) - 書き出しが完了する
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ファイルができあがる
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と合わせて使ってみるといいかも