Unityで画面のスクリーンショットを撮る(Application.CaptureScreenshotじゃない方法)

  • 35
    Like
  • 0
    Comment
More than 1 year has passed since last update.

最近リリースしたアプリ(チャリで来た。カメラ)で、画面のスクリーンショットを Application.CaptureScreenshot で取得してさらにその画像を加工する、ということを行ったのだが、もっと簡単な方法があったよ・・・(T_T)

Unityでスクリーンショットを撮る方法

Application.CaptureScreenshot

一番オーソドックスな方法。ファイル名を指定するだけでスクリーンショットをファイルに保存する。
実際アプリで使ってみたけど、意外と使いづらい。

  • パスではなくファイル名指定なので保存箇所が Application.persistentdatapath 1択
  • 「ファイルに保存される」「保存終了時のコールバックがない」ので、完成した画像をすぐに使いたい場合は待ち処理を組む必要がある

Render Texture

リアルタイムに更新可能なTexture「Render Texture」をTexture2Dとして取得する方法。
こっちの方が柔軟性はあるけど、Render Texture -> Texture2D への変換の手間や、uGUIと併用したりすると少し面倒。
ただ、この方法はカメラで映してるものをTextureとして出力するので、レイヤー分けが可能で、表示オブジェクトの制御が出来たりする(自由度は一番高い)。

Texture2D.ReadPixels

そしてこれ。

スクリーン画面からテクスチャデータへと保存するためのピクセルデータを読み込みます

これじゃんΣ(゚д゚;)!!
このメソッドがあることは知ってたけど、名前から予想出来なかったよ_| ̄|○

IEnumerator LoadScreenshot()
{
    yield return new WaitForEndOfFrame();

    var texture = new Texture2D(Screen.width, Screen.height);
    texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    texture.Apply();
}

void OnPostRender()
{
    if(isCreate)
    {
        var texture = new Texture2D(Screen.width, Screen.height);
        texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        texture.Apply();

        isCreate = false;
    }
}

描画が完了してからでないとエラーが出るので、コルーチンで yield return new WaitForEndOfFrame() の後に処理するか、OnPostRender 内で行うと良い。

最後に

Texture2D.ReadPixels、静的メソッドでもないし、汎用的な名前だし、Texture2D.SetPixels と混同したりして、気づかなかった。。。
今までめっちゃメンドクサイことをしてたよ(´・ω・`)ショボーン

※追記

Render Texture を Texture2D として取得する方法も、最終的にはTexture2D.ReadPixels で読み込む形になるから、結局2通りって感じなのかな?テラシュールさんで「RenderTextureをTexture2DにしてSpriteに使用する」こんな方法も紹介されてたけど、あまり推奨してないようだし、素直に 単にスクショを撮りたい→Application.CaptureScreenshotスクショを加工したい→Texture2D.ReadPixelsって形になるかと。

Author

http://okamura0510.jp