|
執筆バージョン: Unreal Engine 5.8
|
今回はエンジン改造せずにセーブデータの保存先を変更する方法をご紹介します。
Save Game to Slotの保存先変更
セーブを行う際にはSave Game to SlotまたはAsync Save Game to Slotを使用することができます。

試しにセーブをしてみましょう。
まず、SaveGameObjectを作成してBP_SaveDataとします。

次に以下の処理をレベルBP上に作成してセーブを行ってみます。

SaveData.savというファイルが【プロジェクト名】 > Saved > SaveGames以下に作成されています。

SlotNameにフォルダ名ごと指定するとSaveGamesフォルダ以下のパスを任意のものにできます。
今回はMyFolderという固定の文字列を指定していますが、SteamでアカウントIDを取得してフォルダ名に使用するとアカウントごとにセーブデータの保存先を変更するといったことも可能です。


EnhancedInputUserSettingsの保存先変更
EnhancedInputのセーブ処理はエンジン側でSaveGametoSlotを呼んで保存しているため、別途パスを変更する対応が必要になります。
PlayerCharacterで以下のような処理を行ってみると、EnhancedInputの設定値が【プロジェクト名】 > Saved > SaveGames > EnhancedInputUserSettings.savに保存されます。


EnhancedInputUserSettings.savの保存先を変更する方法を2つご紹介します。
InputSettingsSaveSlotNameの書き換え
ProjectSettings > Engine > Enhanced Input > User Settings > Input Settings Save Slot Nameの値を書き換えることで保存先を変更することができます。

この設定はDefaultInput.iniからも可能です。
|
|
[/Script/EnhancedInput.EnhancedInputDeveloperSettings] InputSettingsSaveSlotName=MyFolder/EnhancedInputUserSettings |
UEnhancedPlayerInput::GetUserSettingsSaveFileNameをオーバーライド
EnhancedInputを保存する際に使用するSaveSettingsは以下のような実装になっており、パスの指定はGetSaveFilenameで行われています。
|
|
void UEnhancedInputUserSettings::SaveSettings() { if (ULocalPlayer* OwningPlayer = GetLocalPlayer()) { UGameplayStatics::SaveGameToSlot(this, GetSaveFilename(OwningPlayer), OwningPlayer->GetLocalPlayerIndex()); UE_LOGF(LogEnhancedInput, Verbose, "Enhanced Input User Settings saved!"); } else { UE_LOGF(LogEnhancedInput, Warning, "Attempting to save Enhanced Input User settings without an owning local player!"); } } |
さらにGetSaveFilenameの実装を見てみましょう。
|
|
FString UEnhancedInputUserSettings::GetSaveFilename(const ULocalPlayer* LP) { check(LP); UEnhancedPlayerInput* PlayerInput = LP->GetSubsystem()->GetPlayerInput(); check(PlayerInput); return PlayerInput->GetUserSettingsSaveFileName(); } |
UEnhancedPlayerInput::GetUserSettingsSaveFileName()でパス指定用の文字列が作成されているので、この処理をオーバーライドすればパスの書き換えができそうです。
では、パスを変更していきましょう。
まず、エディター上でTools > New C++ ClassからEnhancedPlayerInputを継承したクラスを作成します。

次に、GetUserSettingsSaveFileNameをオーバーライドして以下のような処理を作成します。
|
|
UCLASS() class BLOGSAVE_API UMyEnhancedPlayerInput : public UEnhancedPlayerInput { GENERATED_BODY() public: virtual FString GetUserSettingsSaveFileName() const override; }; |
|
|
FString UMyEnhancedPlayerInput::GetUserSettingsSaveFileName() const { FString MyFolderName = "MyFolder"; return FString::Printf(TEXT("%s/"), *MyFolderName) + Super::GetUserSettingsSaveFileName(); } |
最後にProjectSettings > Engine > Input > Default Player Input Classの値に作成したクラスを指定します。

この設定はDefaultInput.iniからも可能です。
|
|
[/Script/Engine.InputSettings] DefaultPlayerInputClass=/Script/BlogSave.MyEnhancedPlayerInput |
まとめ
エンジン改造をできるだけしたくないといった状況もあると思うので、今回ご紹介した方法が参考になれば幸いです。