Steamでゲームをリリースするときは、セーブデータの保存パスにSteamIDを入れよう!

具体的に言うと、
C:/Users/{UserName}/AppData/Local/{GameTitle}/Save/{SteamID}/
というディレクトリ以下にファイルを置いていくのが理想系かなと思います。
LocalがLocalLowだったり、Saveの部分が違ったりするのは趣味の範囲。

伝えたいことは、
セーブデータのファイルを保存するディレクトリのパスにSteamIDが含まれるようにしよう
だけです。

これはSteamクラウドのドキュメントで推奨されている事です。
(「ファイルパスの保存」の項目。)
partner.steamgames.com

Steamはなぜこんなことを推奨しているの?

パッと思いつくのは、Steamアカウントを切り替えた時にアカウントに紐づいたセーブデータを読み込むため。
ですが、「Steamアカウントが別々の人、Windows上のユーザーも別々なのでは・・・?」って思いますよね。
自分も思います。
(Windows上のユーザーが別なら、パスにUserNameが含まれているので問題は起こらない。)

対応して欲しい本当の理由

最近流行りのSteamDeck。
Steamも力を入れているのでユーザーが徐々に増えているようなのですが、
なんとSteamOS上では C:/Users/{UserName}/AppData/ 以下にファイルを保存しても
パスにユーザー名が入らず、セーブデータが共有されてしまう問題があります。
(本当はSteamOS側でいい感じにして欲しい・・・)

この問題、修正されました!!!

結論

正しくSteamアカウントに紐づいたセーブデータでゲームを遊べるように、
セーブデータのファイルを保存するディレクトリのパスにSteamIDが含まれるようにしよう!

余談

Steamクラウドなんて使う予定ないんだけど・・・と思ってるそこのあなた!
Steam自動クラウドという機能を使うと、Steamworksでセーブデータの保存パスを入力するだけで
端末間で勝手にセーブデータを共有してくれてめっちゃ簡単で便利なので、ぜひ使いましょう!

参考: Unityの場合

var steamID = Steamworks.SteamUser.GetSteamID().ToString(); // Steamworks.NETの場合
var path = Path.Combine(Application.persistentDataPath, "Save", steamID, "SaveData.txt");

こんな感じで保存すると
C:/Users/{UserName}/AppData/LocalLow/{CompanyName}/{ProductName}/Save/{SteamID}/SaveData.txt
に保存されることになります。

参考: UEの場合

UEの場合が厄介で、SaveGameを利用する場合、保存パスの変更ができません。
保存パスを変更するにはエンジンコードに手をいれる必要があるみたいなのですが、
何かスマートな解決法が実装されて欲しいですね・・・

forums.unrealengine.com