TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

Recorderを使ってスクリーンショットを撮影する【Unity】


PR

f:id:tat1kun:20220118214452p:plain
Recorderのアイコン(?)

サクッとエディタ上でゲームビューのスクショを撮る方法について調べてみると、Recorderを使って結簡単にできそうだったのでそれについてメモをしておきます

注意点

Recorderはエディタ上でのみ動作します。 ビルド後のゲーム上でスクショを撮る機能は実装できません。

環境

  • Unity 2021.2.8f1

  • Recorder3.0.3

Recorderの導入

Package ManagerからRecorderを導入します。

f:id:tat1kun:20220118210553p:plain

スクリーンショット用のサンプルプログラムを導入

Package ManagerのSamplesからスクリーンショット撮影用のサンプルプログラム(Screenshot Capture Sample)を入手します。

f:id:tat1kun:20220118210601p:plain:h400

使い方

動画のように適当なゲームオブジェクトを作成して、サンプルプログラムのスクリプトをアタッチすれば、そのまま使うことができます。

f:id:tat1kun:20220118210911g:plain

ゲームを再生すると、「Capture ScreenShot」というボタンがゲームビューに表示されるので、これをクリックすればスクリーンショットを撮影することができます。

f:id:tat1kun:20220118210905p:plain

スクリーンショットの保存先は、プロジェクトのフォルダに「SampleRecordings」という新規フォルダが作成され、 そこの下に画像が保存されます。

※保存されるのはAssetsフォルダ直下じゃないのでエディタ上から確認しようとすると見つからないことに気を付けてください

保存先の仕様などについて

そのままだと全く設定をいじれませんが、一応保存先、拡張子、解像度などはサンプルプログラム自体を編集すれば変更できます。

簡単にですが、インスペクタ上に解像度や保存する拡張子の設定を表示できるようにしてみました。

#if UNITY_EDITOR

using System.IO;
using UnityEditor.Recorder;
using UnityEditor.Recorder.Input;

namespace UnityEngine.Recorder.Examples
{    
    public class CaptureScreenShotExample : MonoBehaviour
    {
        RecorderController m_RecorderController;
        [SerializeField]
        int m_outputWidth = 1920;
        int outputWidth
        {
            get { return m_outputWidth; }
            set { m_outputWidth = value; }
        }
        [SerializeField]
        int m_outputHeight = 1080;
        int outputHeight
        {
            get { return m_outputHeight; }
            set { m_outputHeight = value; }
        }
        [SerializeField]
        ImageRecorderSettings.ImageRecorderOutputFormat m_OutputFormat = ImageRecorderSettings.ImageRecorderOutputFormat.PNG;
        ImageRecorderSettings.ImageRecorderOutputFormat outputFormat
        {
            get { return m_OutputFormat; }
            set { m_OutputFormat = value; }
        }
        

        void OnEnable()
        {
            var controllerSettings = ScriptableObject.CreateInstance<RecorderControllerSettings>();
            m_RecorderController = new RecorderController(controllerSettings);

            var mediaOutputFolder = Path.Combine(Application.dataPath, "..", "SampleRecordings");

            // Image
            var imageRecorder = ScriptableObject.CreateInstance<ImageRecorderSettings>();
            imageRecorder.name = "My Image Recorder";
            imageRecorder.Enabled = true;
            imageRecorder.OutputFormat = outputFormat;
            imageRecorder.CaptureAlpha = false;

            imageRecorder.OutputFile = Path.Combine(mediaOutputFolder, "image_") + DefaultWildcard.Take;

            imageRecorder.imageInputSettings = new GameViewInputSettings
            {
                OutputWidth = outputWidth,
                OutputHeight = outputHeight,
            };

            // Setup Recording
            controllerSettings.AddRecorderSettings(imageRecorder);
            controllerSettings.SetRecordModeToSingleFrame(0);
        }

        void OnGUI()
        {
            if (GUI.Button(new Rect(10, 10, 150, 50), "Capture ScreenShot"))
            {
                m_RecorderController.PrepareRecording();
                m_RecorderController.StartRecording();
            }
        }
    }
}

#endif


おわりに

Unity上でスクリーンショットを撮る方法は調べると色々出てきますが、 割とすぐに導入できる解決方法として参考にしてみてください。

参考

About Recorder | Recorder | 3.0.3