さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【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が書き換わるだけなのか?よくわからんけど。)

参考

qiita.com

解説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.

github.com