#はじめに…
Unityでスクリーンショットを取る場合…
- Application.CaptureScreenshot
- Texture2DをエンコードしてFile.WriteAllBytesで書き込む
この二通りがあるかと思います。
今回は、保存先を指定するために2の方法で保存します。
#暗くなる保存方法
- ProjectViewでRenderTextureを作成します
- 撮影したいCameraにRenderTextureを登録します
- 下記ソースコードのように実装します
ScreenShot.cs
Texture2D tex = new Texture2D(RenderTextureRef.width, RenderTextureRef.height, TextureFormat.RGB24, false);
RenderTexture.active = RenderTextureRef;
tex.ReadPixels(new Rect(0, 0, RenderTextureRef.width, RenderTextureRef.height), 0, 0);
tex.Apply();
//PNGに変換
byte[] bytes = tex.EncodeToPNG();
Object.Destroy(tex);
//保存
File.WriteAllBytes(Application.dataPath + "Hoge" + ".png", bytes);
これで保存した画像がコチラ
最初は、こういうもんなのかな?と思ってたんですが、違うみたいです。
#暗くならない保存方法
- 下記ソースコードのように実装します
ScreenShot.cs
//プレビュー用のレンダーテクスチャからサイズ取得
int resWidth = RenderTextureRef.width;
int resHeight = RenderTextureRef.height;
//RenderTextureを作る
RenderTexture rt = new RenderTexture(resWidth, resHeight, 24);
rt.antiAliasing = 8;
//Cameraに設定
camera.targetTexture = rt;
Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false);
camera.Render();
RenderTexture.active = rt;
//結果を読み込み
screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0);
camera.targetTexture = null;
RenderTexture.active = null; // JC: added to avoid errors
//破棄
Destroy(rt);
//PNGに変換
bytes = screenShot.EncodeToPNG();
//保存
File.WriteAllBytes(Application.dataPath + "Hoge" + ".png", bytes);
これで保存した結果がコチラ
本来の色で保存されています。
#まとめ…
Unity5.4.2p4現在では、new RenderTextureで保存する方が良さそうです。
何か別の方法で解決した方がいましたら、教えていただけると幸いです。