【Unity】スクリーンショットを Texture2D へ書き込む

DEVELOP, Unity

画面をキャプチャーして、そのテクスチャをオブジェクトに張り付けたいことってありますよね。

目次

サンプルコード

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
class ScreenCapture : MonoBehaviour
{
    public void Run( Action<Texture2D> _onComplete, float _quality = 1.0f)
    {
        StartCoroutine(this.Take(_onComplete, _quality));
    }
 
    private IEnumerator Take(Action<Texture2D> _onComplete, float _quality)
    {
        // 1フレームレンダリング完了まで待つ。
        yield return new WaitForEndOfFrame();
 
        int capture_width = (int)((float)Screen.width * _quality);
        int capture_height = (int)((float)Screen.height * _quality);
 
        Texture2D screenShot = new Texture2D(capture_width, capture_height, TextureFormat.RGB24, false );
 
        screenShot.ReadPixels( new Rect( 0, 0, screenShot.width, screenShot.height ), 0 , 0 );
        screenShot.Apply();
        _onComplete.Call(screenShot);
        yield break;
    }
    public static ScreenCapture Create(GameObject _parent)
    {
        GameObject go = new GameObject("ScreenCapture");
        go.transform.SetParent(_parent.transform);
        
        ScreenCapture capture = go.AddComponent<ScreenCapture>();
        return capture;
    }
}

レンダリングが完了するまで1フレーム待っている所がポイント。直前の物で良いなら待たなくても良い。

使い方

var capture = ScreenCapture.Create(this.gameObject);
capture.Run(_onComplete:(__tex2D )=>
{
	// _TODO
});

Posted by kazupon