Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモ

Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモです。

背景

ScreenCapture-CaptureScreenshot – Unity スクリプトリファレンス

CaptureScreenshot を使うのも便利でサンプルを結構見かけるのですが、これですと一度ファイルが保存された後に、もう一度読み込む必要があって、ひと手間がかかります。もともと保存する用途ならいいのですがスクリーンショットを撮影したあとに、すぐサーバーに画像データを送りたいときに冗長だなと思っていました。

ScreenCapture-CaptureScreenshotAsTexture – Unity スクリプトリファレンス

その点、CaptureScreenshotAsTexture は Texture2D オブジェクトで取得できファイル保存処理はありません。あとは Texture2D オブジェクトから画像を切り取ったり、画像データを Texture2D.EncodeToJPG すれば JPEG に変換できますし、画質も設定できます。もちろん Texture2D.EncodeToPNG なら PNG に変換できて取り回しがしやすいのでまとめておきます。

Unity に Cube を準備

image

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 データが入っています。

image

これをうまく取りまわせばサーバーに画像を送るデータとして使えたり、画像を切り取ったり、ファイル保存をすることができます。