[UE5] Need help debugging a broken Save System – we’ve been stuck for days

Hi everyone,

We’re currently developing a game in Unreal Engine 5, and we’ve run into a serious issue with our Save/Load system. We’ve spent a lot of time trying to debug it ourselves, but we’re at the point where we feel we need fresh eyes from more experienced developers.

We’re not looking for someone to solve everything for us—we’d really appreciate any ideas, suggestions, or even a direction to investigate. If anyone has dealt with similar SaveGame issues before, your experience could save us a huge amount of time.

Project Information

* Engine Version: 5.4.4
* Blueprint
* Platform: PC

Our Save System

Well, we are working on our first game, but mostly it’s learning purposes, I’ve made a save system and It was working nicely, but after one feedback about multiple saving slots, I tried some stuff and it ended up broken and more I try to make it correct it’s getting even worse.
Since I mentioned that it’s our first project, I’ve never learnt revision control and I’m so frustrated about it. So, after some tweaks and adjustments I can proudly say my save system doesn’t exist at all. :frowning:

In Our Game we have some little info to save and plus we have only one playable level. second one is MainMenu Level. so here’s variables we need to save and load: Players Positions, Checkpoints, Timer, Falling, bHasWeapon, DifficultyMode. I know it’s really low and it should be simple comparing to multi-level games with inventory system and so on, but still it’s so hard to make it work for me as a noob dev.

The main problem in my opinion is that I don’t know where to build useful things. but here’s what I built before:
BPI_SaveGame - RequestSaveGame, RequestLoadGame, RequestDeleteGame.
BP_GameInstance - Save Function, Load Function, Save Checkpoints and Save Timer.
BP_SaveGame has this variables - Player position,bWeapon, Activated Checkpoints, Game Difficulty, Stored Timer, Fallings.
BP_Character - TImer Counting on Tick, Requesting Saved Variables on beginplay, if Save game exists.

So I have and will have only 2 slots and 2 buttons, Slot 1 and Slot 2. if player clicks Slot 1 it was casting to Game Instance and Set the CurrentSlotName to Slot 1, Save with Slot 2 but it wasn’t working properly.
when I was clicking Slot 1 it was creating game and Slot1.sav file, but when I was clicking Slot2 it was creating game too, but it was spawning character to the checkpoint, but I never touched the checkpoint I was going in to the main menu, loading Slot2 and it waas spawning the character at the PlayerStart location(Exactly where it should have been).

If you notice something fundamentally wrong with our architecture, please don’t hesitate to point it out. We’d much rather redesign part of the system than keep patching a broken implementation.

Even if you only have a theory or an idea of where to look next, we’d really appreciate it.

Thanks a lot for taking the time to read this. Any help is genuinely appreciated.

Seems like this could be your issue:

Difficultyis being assigned to CurrentSlotName.


Some random notes:

  • Consider using a separate “system” SaveGame that stores the available save slots and data such as slot name, playtime, difficulty, or last checkpoint. You could load this during the GameInstance Init event keeping it ready to populate the load menu.
  • I also noticed duplicated logic in the widget. You could create a reusable slot button widget and instantiate per available slot from the system SG. Each button would only report the selected slot name back to the GameInstance.
  • Ideally, save/load should be centralized in the GameInstance rather than scattered across widgets, characters, and actors. The widgets should only request an action while the GameInstance decides whether to create, load, save, or delete that slot. Actors and the character can still be responsible for providing and applying their own save data, but they should not directly manage slot files or decide which slot is active.