@bloodrosesoll2 (kroro)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

セーブスロットを複数作りたい!(unity)

解決したいこと

ゲームのセーブとロードなのですが、セーブスロットを複数欲しいのですが調べても出てこなかったので分かる方いましたらご教授お願い致します。
現状一つのセーブデータをロードすることしか出来ないので。
それを詳しく説明している記事や動画などの情報でもかまいませんのでよろしくお願いします。

0 likes

2Answer

王道ではないですが一番気軽なやり方として

PlayerPrefs.SetStringを使うやり方があります
Stringで扱えるということはSerializeした任意のデーター型を突っ込めるということであります。
Serializeした任意のデーター型を取り扱う定番の型式としてはJson、YAMLなどがありますがUnityだとJsonが定番かなと思います。

Jsonについて知らないのであればまあ詳しく説明しているサイトがいくつもあるので私が下手な説明をするよりよいかと思うのでそちらに譲ります。

ここから先はJsonを知ってる体で書きます。
UntiyのDefaultのJsonシリアライザ・デシリアライザであるJsonUtilityはJson配列の扱いが出来ないため余りこの手の用途には向きません(セーブデーターのスロットは配列、Listで表現することが多いと思うので)

https://takap-tech.com/entry/2021/02/02/222406
※無理やりできるけど・・・

https://zenn.dev/tech_memorandum/articles/10c18b2e8b39ae
またはセーブデーター型の中にSerializable属性を定義した配列を定義して
更にそのTもSerializableな型として定義することでDefaultのJsonUtilityで配列を扱うことができます。

処理速度は遅いですが充実したデーター型を扱えるJsonNetの方がこの場合は向いてるかと思います。(セーブデーターの使用頻度は限られているのでパフォーマンスを気にする必要性は薄いので)
https://fineworks-fine.hatenablog.com/entry/2022/08/25/073000

後はゲーム仕様に沿ったセーブデーター型を設計し、JsonObjectとなるデーターをシリアライズしてPlayerPrefs.SetStringの指定したKeyに保存します
ロード時はGetStringで同様に読み込み、デシリアライズすればOKです。

デシリアライズに失敗したらセーブデーターが保存されてないと判定して自動で新規作成しましょう。

※他参考
https://webnation.co.jp/json-net-use-on-unity/

※なぜこのやり方が王道ではないかというとPlayerPrefsはOSによって挙動が違います、特にWebGLの場合はcookie領域に依存するからです、
要件が不明なのでなんとも言えませんが究極的な理想はアカウントと紐づけたDBとAPIを使ったサーバーサイドでの保存です

1Like

分かりやすい助言ありがとうございます!
セーブとロード以外はだいたい強引にプログラム出来たのですがセーブとロードだけがいまいち分からなかったのでとても助かりました!
ありがとうございます!

0Like

Your answer might help someone💌