Save System

Let's start talking about a save system!

I'd like to take some time to consider what we need to save in the context of the project as a whole. What do we need to save? The important things that come to mind are Inventory and Quest Progress, but given that the community knows more about the project than I do right now, I'd like to invite y'all to weigh in on this. Then once we know what we're aiming for we can build a plan.


Hey @bronsonzgeb , have you started to work on one? I have created my implementation:

As far as I know, there are three kinds for save systems.

Manual Saving

This kind of saving is done by pressing a save button in the options menu. Then the game progress upto that point of time is saved.

Checkpoint, Automatic saving

This is done automatically, the player don't need to worry about any sort of saving. The game will be automatically save when certain cutscenes are reached, or when game progress reaches at centain point.
In our case, we can save game when a Quest is completed, or a location is completed.

Positional, Save Point Saving
This is that kind, which I consider best, and what I have implemented now, in which there are SavePoints, maybe one in each Location/Scene. When player reaches and confirms, the game is saved upto that point of progress.

Now, my implementation.

I have used the Third type, the save point.
I have created a save point in each location scene. It has a new tag "SavePoint". New type of interaction, called Save is added. If player arrives in the range of a save point, the interaction HUD is displayed. And if E key is pressed, the SaveGame method on the SavePoint is called.
It raises a SaveGameEvent which is a GameobjectEventChannelSO, where the gameObject is that savepoint.
In the SaveManager, which is in the PersistenceScene, the event is listened and the real saving occurs.

It currently saves in which location is the player saving, for which I created a new RuntimeAnchor, called LocationAnchor.
It is set by the spawn system the current Location. So the spawnSystem is also modified for a field called "this location". So PlayerLocation is Updated every time Player changes location.
It also saves the SavePoint gameObject position (for spawing player there upon loading) and the player Inventory.

Now for loading, I think the game should be loaded when the continue button in the MainMenu scene is pressed. But for debugging, I added a load button. Pressing this will raise LoadGameEvent, which is a VoidEventChannelSO.

In the SaveManager, LoadGameEvent is listened and loads the game. It first loads the scene (location) in which the player saved the game. Then sets the player position accordingly to the SavePoint. For this it listens to the PlayerInstantiated Channel.
And then restores the playerInventory.

There are some conflicts. And I know as when I started to work on, Interaction Manager was changed after that (and many more, such as gameplay scene). @cirocontinisio , how do I fix them? (I haven't ran into this issue yet).

Here is the PR:

I welcome Reviews and suggestions.

You need to sync your fork with the main project. Here is how : In your case the upstream url will be the project's original repo. After following those steps, you will get a merge conflict in InteractionManager.cs since it was changed both by you as well as in the main repo. You will have to manually merge the code in that class, save it and commit it again.

Thanks @vjs22334 , I will give it a try.

Hey folks. When a tried running the project in the first time, a log error appear for me.


This error appear when I run the game in different scenes (like the Beach for example).
Checking the script FileManager i see in the MoveFile function that we create a new backup file. But as I running in the first time, to first file don't existe, raising a error.

I made a additional conditions to check if the first file exist and worked greate to me.

Great @JoaoSantos , Have you created a Pull Request?

1 Like

Not yet, I will create now. I will report an issue in the github;

@Harsh-NJ You can check the solution in this PR: