最近リリースしたアプリ(チャリで来た。カメラ)で、画面のスクリーンショットを 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って形になるかと。