サクッとエディタ上でゲームビューのスクショを撮る方法について調べてみると、Recorderを使って結簡単にできそうだったのでそれについてメモをしておきます
注意点
Recorderはエディタ上でのみ動作します。 ビルド後のゲーム上でスクショを撮る機能は実装できません。
環境
Unity 2021.2.8f1
Recorder3.0.3
Recorderの導入
Package ManagerからRecorderを導入します。
スクリーンショット用のサンプルプログラムを導入
Package ManagerのSamplesからスクリーンショット撮影用のサンプルプログラム(Screenshot Capture Sample)を入手します。
使い方
動画のように適当なゲームオブジェクトを作成して、サンプルプログラムのスクリプトをアタッチすれば、そのまま使うことができます。
ゲームを再生すると、「Capture ScreenShot」というボタンがゲームビューに表示されるので、これをクリックすればスクリーンショットを撮影することができます。
スクリーンショットの保存先は、プロジェクトのフォルダに「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上でスクリーンショットを撮る方法は調べると色々出てきますが、 割とすぐに導入できる解決方法として参考にしてみてください。