スクリーンショットを保存

Unity

スクリーンショットを撮影して保存する方法です。
画像のように透過画像にも対応しています。(白黒の四角背景が透過部分です)

描画完了後に呼び出す必要があり、コルーチンを使用しています。

    void Update()
    {
        // クリックしたらスクリーンショット撮影
        if (Input.GetMouseButtonDown(0))
        {
            StartCoroutine("ScreenShot");
        }
    }

    /// <summary>
    /// スクリーンショット
    /// </summary>
    /// <returns></returns>
    IEnumerator ScreenShot()
    {
        yield return new WaitForEndOfFrame();

        // 画像生成
        Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);
        tex.alphaIsTransparency = true;
        tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        tex.Apply();

        // byteデータに変換
        byte[] bytes = tex.EncodeToPNG();

        // 破棄
        DestroyImmediate(tex);

        // 日付をファイル名にする
        DateTime dt = DateTime.Now;
        string dateStr = dt.Year + "_" + dt.Month + dt.Day + "_" + dt.Hour + dt.Minute + "_" + dt.Second;

        // 保存
        File.WriteAllBytes(Application.dataPath + "/" + dateStr + ".png", bytes);
    }

途中で詰まったこと

なぜだか下画像のように白黒っぽくなることがありました。
原因なのですが、結論から言うと
ポストプロセスのFXAA(アンチエイリアシング)にある、
Keep Alphaという項目ににチェックが入っていないことでした・・・。

これに気付かなくてしばらく悩んでいました。
ちなみにTAAやMSAAでは色が変になりませんでした。
ご参考までに。

© Unity Technologies Japan/UCL

コメント

タイトルとURLをコピーしました