うどんてっくメモ

技術的なメモをまったりと

【Unity】Unity Recorderをスクリプトから実行する

はじめに

本記事の検証環境は以下になります。バージョンが違う場合には挙動やAPIが違う場合がありますので、ご留意ください。

  • Unity 2022.3.0f1
  • Unity Recorder 4.0.1

Unity Recorderとは

Unity RecorderはUnity Editor上でのシーン描画の動画や連番画像での記録や、オブジェクトの動きを記録する公式が提供する機能です。

assetstore.unity.com

利用する際にはPackage Managerから導入します。 基本的な使い方は以下の記事が丁寧に解説してくれていますので、参照してみてください。

qiita.com

Unity Recorderをスクリプトから呼び出す

本記事では基本的な使い方であるGUIからの利用ではなく、スクリプトから呼び出す方法を紹介します。

スクリプトから呼び出す際には、大まかに次の流れで実行できます。

  • RecorderControllerSettingsの用意
  • 各種RecorderSettingsの設定
  • RecorderControllerSettingsへのRecorderSettingsの設定
  • RecorderControllerからPrepareRecordingの呼び出し(録画準備)
  • RecorderControllerからStartRecordingの呼び出し(録画開始)
  • RecorderControllerからStopRecordingの呼び出し(録画終了)

RecorderControllerSettingsはScriptableObject形式の大元の設定です。RecorderWindowで操作する際も裏ではこれを用いて録画形式の設定を行なっています。 RecorderWindowが使っている設定はLibraryで管理されていて、GetRecorderControllerSettings GetGlobalSettingsで取得できます。 自前でスクリプト上からも普通のScriptableObjectの容量で生成可能です。

// 設定の生成
var setting = ScriptableObject.CreateInstance<RecorderControllerSettings>();

// グローバル設定
var settingGlobal = RecorderControllerSettings.GetGlobalSettings();

RecorderSettingsは動画や音声といった項目ごとの設定を行います。継承したクラスがいくつか用意されていて、それらを適宜設定します。

RecorderSettings 役割
AnimationRecorderSettings AnimationClipの記録
ImageRecorderSettings 連番画像の記録
MovieRecorderSettings 動画の記録
AudioRecorderSettings 音声の記録

本記事では動画の記録のためのMovieRecorderSettingsと音声の記録ためのAudioRecorderSettingsの設定の実装をサンプルとして示します。

// ScriptableObjectの生成
var movieRecorderSettings = ScriptableObject.CreateInstance<MovieRecorderSettings>();
var audioRecorderSettings = ScriptableObject.CreateInstance<AudioRecorderSettings>();

// 動画の記録設定
movieRecorderSettings.FrameRate = 30f;
movieRecorderSettings.ImageInputSettings = new GameViewInputSettings
{
    OutputWidth = 1080, 
    OutputHeight = 1920,
};
// エンコード周りはIEncoderSettingというinterfaceで管理されていて、特定の設定のテンプレートが派生クラスとして用意されている
movieRecorderSettings.EncoderSettings = new CoreEncoderSettings
{
     Codec = CoreEncoderSettings.OutputCodec.MP4,
     EncodingQuality = CoreEncoderSettings.VideoEncodingQuality.Medium,
};
movieRecorderSettings.OutputFile = "file_name";
movieRecorderSettings.Enabled = true;

// 音声の記録設定
audioRecorderSettings.OutputFile = Application.temporaryCachePath;
audioRecorderSettings.Enabled = true;

AudioRecorderSettingsなどは元々internalだったのですが、最近になってpublicになったりと結構変更が激しい部分なのでバージョンには注意してください。 そして、RecorderSettingsはAddRecorderSettingsでRecorderControllerSettingsに設定を行います。

setting.AddRecorderSettings(movieRecorderSettings);
setting.AddRecorderSettings(audioRecorderSettings);

ここまで完了したら録画処理を呼び出すだけです。RecorderControllerのインスタンスを生成し、準備したRecorderControllerSettingsを渡します。 後はStartRecordingで開始し、StopRecordingで終了です。StartRecordingを呼び出す前には一回PrepareRecordingを呼び出す必要があります。

var recorderController = new RecorderController(setting);
recorderController.PrepareRecording();
recorderController.StartRecording();

// なんやかんや記録したいことをする

recorderController.StopRecording();

以上がUnity Recorderの機能をスクリプトから呼び出す大まかな手順になります。 最後にまとめた最低限のコードを貼っておきます。

var setting = ScriptableObject.CreateInstance<RecorderControllerSettings>();

// ScriptableObjectの生成
var movieRecorderSettings = ScriptableObject.CreateInstance<MovieRecorderSettings>();
var audioRecorderSettings = ScriptableObject.CreateInstance<AudioRecorderSettings>();

// 動画の記録設定
movieRecorderSettings.FrameRate = 30f;
movieRecorderSettings.ImageInputSettings = new GameViewInputSettings
{
    OutputWidth = 1080, 
    OutputHeight = 1920,
};
// エンコード周りはIEncoderSettingというinterfaceで管理されていて、特定の設定のテンプレートが派生クラスとして用意されている
movieRecorderSettings.EncoderSettings = new CoreEncoderSettings
{
    Codec = CoreEncoderSettings.OutputCodec.MP4,
    EncodingQuality = CoreEncoderSettings.VideoEncodingQuality.Medium,
};
movieRecorderSettings.OutputFile = "file_name";
movieRecorderSettings.Enabled = true;

// 音声の記録設定
audioRecorderSettings.OutputFile = Application.temporaryCachePath;
audioRecorderSettings.Enabled = true;

setting.AddRecorderSettings(movieRecorderSettings);
setting.AddRecorderSettings(audioRecorderSettings);

var recorderController = new RecorderController(setting);
recorderController.PrepareRecording();
recorderController.StartRecording();

// なんやかんや記録したいことをする

recorderController.StopRecording();

おわりに

Unity Recorderはスクリプトからも簡単に使えて便利です。Device Simulatorだと使えなかったりするのでめんどくさい部分もまだまだありますが、今後も改善されていきそうで少し期待しています。

筆者の職場ではこれを用いてUnityエディタ上でのテストの録画だったり、3D描画のチェックの自動化に用いたりしています。 やや使い道はトリッキーですが、ぜひ興味のある方は使ってみてください。