MRが楽しい

MRやVRについて学習したことを書き残す

Unityアプリで画面のキャプチャを保存する その2(画面キャプチャをテクスチャで取得する)

本日は Unity の小ネタ枠です。
Unityアプリで画面のキャプチャを保存する方法について記事にします。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

ScreenCapture.CaptureScreenshotAsTexture

ScreenCapture.CaptureScreenshotAsTextureを利用するとTexture2Dとしてスクリーンショットが取得できます。
docs.unity3d.com

サンプルスクリプト

Texture2Dを取得し、Imageコンポーネントに設定したりファイル形式を指定して出力するサンプルスクリプトを作成しました。
・ScreenshotAsTextureTest.cs

using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class ScreenshotAsTextureTest : MonoBehaviour
{
    [SerializeField]
    private Image applyImage;

    /// <summary>
    /// キャプチャの実行関数
    /// </summary>
    public void Capture()
    {
        CaptureScreensAsTexturehotByUnityEngine();
    }

    private void CaptureScreensAsTexturehotByUnityEngine()
    {
        // スクリーンキャプチャをテクスチャとして取得する
        Texture2D screenshot = ScreenCapture.CaptureScreenshotAsTexture();

        // テクスチャから新しいスプライトを作成して適用する
        Sprite sprite = Sprite.Create(
            screenshot,
            new Rect(0, 0, screenshot.width, screenshot.height),
            new Vector2(0.5f, 0.5f)
        );

        // 取得したスクリーンショットをUI Imageに適用する
        applyImage.sprite = sprite;
        Debug.Log($"スクリーンショットを取得しました。サイズ: {screenshot.width}x{screenshot.height}");

        // スクリーンショットをPNGに変換して保存する
        var date = DateTime.Now.ToString("yyyyMMdd");
        string filename = $"screenCapture_{date}.png";
        string path = Path.Combine(Application.persistentDataPath, filename);

        // 透過を除外したい場合はテクスチャの全てのピクセルのアルファ値を255(不透明)に設定する
        var pixels = screenshot.GetPixels();
        for (int i = 0; i < pixels.Length; i++)
        {
            pixels[i].a = 1.0f;
        }
        screenshot.SetPixels(pixels);
        screenshot.Apply();

        var png = screenshot.EncodeToPNG();
        File.WriteAllBytes(path, png);
        Debug.Log($"ScreenCapture File : {path}");
    }
}

ボタンを押下してキャプチャを行うと以下のようにImageが反映されます。