Help us understand the problem. What is going on with this article?

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

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って形になるかと。

tempura
フリーランスのゲームプログラマー
https://tempura-kingdom.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした