【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.