Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモです。
背景
ScreenCapture-CaptureScreenshot – Unity スクリプトリファレンス
CaptureScreenshot を使うのも便利でサンプルを結構見かけるのですが、これですと一度ファイルが保存された後に、もう一度読み込む必要があって、ひと手間がかかります。もともと保存する用途ならいいのですがスクリーンショットを撮影したあとに、すぐサーバーに画像データを送りたいときに冗長だなと思っていました。
ScreenCapture-CaptureScreenshotAsTexture – Unity スクリプトリファレンス
その点、CaptureScreenshotAsTexture は Texture2D オブジェクトで取得できファイル保存処理はありません。あとは Texture2D オブジェクトから画像を切り取ったり、画像データを Texture2D.EncodeToJPG すれば JPEG に変換できますし、画質も設定できます。もちろん Texture2D.EncodeToPNG なら PNG に変換できて取り回しがしやすいのでまとめておきます。
Unity に Cube を準備
Unity に Cube を準備します。
Cube に CubeEvent.cs を割り当て
Cube に CubeEvent.cs を割り当てます。コードは以下の通りです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeEvent : MonoBehaviour { // キャプチャされた画像データ byte[] dataImage; void Start() { StartCoroutine(DoScreenShot()); } IEnumerator DoScreenShot() { Debug.Log($"DoScreenShot"); // レンダリング後に処理を開始 yield return new WaitForEndOfFrame(); // Texture2D でスクリーンショットを取得 Texture2D textureScreenCapture = ScreenCapture.CaptureScreenshotAsTexture(); // EncodeToJPG で JPEG に変換する。EncodeToPNG なら PNG に変換できる dataImage = textureScreenCapture.EncodeToJPG(); Debug.Log($"撮影完了"); Debug.Log($"{dataImage}"); // textureScreenCapture を削除 UnityEngine.Object.Destroy(textureScreenCapture); } }
動かしてみる
実際に Play で再生してみると、以下のように撮影が成功し dataImage の中に Texture2D.EncodeToJPG で JPEG に変換したデータが入っています。今回は、何かしらに投影したり、保存したりはしませんが JPEG データが入っています。
これをうまく取りまわせばサーバーに画像を送るデータとして使えたり、画像を切り取ったり、ファイル保存をすることができます。