【Unity】セーブデータにサムネイルを含める
やること
セーブデータ一覧で、ゲーム画面がサムネで表示されてるやつ。
コード
public async UniTask<byte[]> GenerateThumbnail(MonoBehaviour coroutineRunner) { Texture2D thumbnail = null; await TextureUtil.CaptureScreenshot(width, height, _ => thumbnail = _).ToUniTask(coroutineRunner); var jpg = thumbnail.EncodeToJPG(); Destroy(thumbnail); return jpg; }
TextureUtil.CaptureScreenshotの実装は↓
github.com
表示時にはTexture2D.LoadImage(byte[])してRawImageコンポーネントに投げれば良い。
解説1.テクスチャのリサイズ
これが一発でとはいかない。
いかにもできそうなTexture2D.Resizeはピクセル情報が初期化されるし、Graphics.ConvertTextureでは変更が反映されないようだ(VRAMが書き換わるだけなのか?よくわからんけど。)
参考
解説2.UniTaskの非対応部分
ScreenCapture.CaptureScreenshotAsTexture();を呼ぶにはyield return new WaitForEndOfFrame();で待つ必要がある。これがUniTaskでは非対応。READMEにもそう書いてある。
Some methods that require coroutine's end of frame(ScreenCapture.CaptureScreenshotAsTexture, CommandBuffer, etc) does not work correctly when replace to async/await. In that case, use a coroutine.