How to Implement Save Slots to Manage Multiple Saved Games in Unity | 2022 tutorial

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hey everyone my name is trevor and in this video we're going to expand on the save and load system created through a couple of previous tutorials to handle multiple saved games through save slots we'll cover how to organize our game's data to support multiple saved games and also how to display that information nicely to the player in a safe slots menu where we can use those save slots to start a new game with or load an existing game from and as an added bonus we'll also modify the continue button on the main menu to load the most recently played saved game and just as a quick disclaimer this tutorial is going to contain a lot of details specific to the save and load system and main menu that have already been created through two previous tutorials so if you haven't seen the previous two videos on how this system was created i highly recommend going through those first and then coming back to this tutorial afterwards and of course as with any of my tutorials everything we're going to do can be found on the github project which will be linked in the description of this video now before we jump into implementing anything i want to give a quick overview of how this is going to work in the save and load system that we're starting with there's a singleton class called the data persistence manager that manages our game data and also exposes some methods to allow the orchestration of saving and loading that data from any other script the data persistence manager uses a class called the file data handler to interact with storing and accessing data on our machine's local file system this includes serializing our data and writing it to a file as well as deserializing our data and reading it from that file the idea behind having a separate class to handle interactions with the method of storage is that it keeps the rest of our system mostly decoupled from the method of storage that we're using in other words this makes it easier to expand on or change the method of storage in the future if we choose to do so this is important for this tutorial because different methods of storage might have their own way of dealing with multiple saved games so we'll want to keep that in mind for how we organize the code that we're going to write with all of that said when it comes to storing multiple saved games in a file system it's actually going to be a really simple addition to the save and load system that we're starting with each save slot in the safe slots menu will have a unique id associated with it that we'll refer to as the profile id the profile id will be used to differentiate between different game data files stored in our method of storage for a file system we can modify our file data handler to take in the profile id when saving or loading data and then instead of saving that data straight to a single file we'll organize the different saved games into folders which names match that profile id each with their own saved data file inside of them and since these save slots are the ones dictating this profile id they can easily display information from the corresponding game data or just the word empty if there is no game data that exists yet for that profile id from there when a save slot is used to start a new game or load an existing game we'll just have to keep track of the currently selected profile id in the beta persistence manager and then use that for any saving and loading that occurs throughout the remainder of the game we'll also timestamp our data every time we save the game so that we can keep track of which save slot was most recently used with that information available we can use the continue button on the main menu to continue straight from that most recently played game without having to go through the safe slots menu at all and that's how it's going to work now let's jump into unity and start implementing this but first i want to give a quick recap of what our starting point looks like for this project we already have a simple main menu scene as well as a gameplay scene from the previous tutorials from the main menu we can start a new game which puts our data in a clean slate and transitions us to the gameplay scene or if data already exists we can continue from that saved data right now when our system saves data it's simply saved to the application.persistentdatapath directory as either a json or encrypted json format depending on how our data persistence manager is configured the project is using text mesh pro which you can install through unity's package manager as well as unity's new input system which can also be installed through the package manager if you're using unity's default input system though that's completely fine just keep in mind that when dealing with the menu navigation your event system is going to look a bit different than mine now that we've recapped where we're starting from the first thing we're going to do is make some modifications to the data persistence manager and file data handler classes so that we can support persisting multiple save files as mentioned in the beginning of this video we're going to do this by putting the data for each save profile in different folders which names represent the id corresponding to that profile we'll open up the file data handler class which is responsible for interacting with the file storage and in there we already have two methods set up to load data from a file and save data to a file to add the directory layer that we need it's a really simple change from how we already have things set up in the load method we'll just pass in a string parameter called profile id and then when we're building the path in which to save our data we'll insert the profile id string into the middle of the directory and the file name like so and then we'll do the same thing with the save method next we'll actually need to pass this in when we call these methods which is done in the data persistence manager so back in unity we'll open up the data persistence manager script by double clicking it towards the top of this file we'll add a private string variable called selected profile id which is eventually going to keep track of which profile we currently have selected but for now we'll just call this test so we can make sure that things are working so far then when we call the data handler load method we'll pass that in and likewise when we call the data handler save method we'll pass it in there as well and just so we don't get confused we'll delete any saved data we previously had and then we'll play the main menu scene to try this out we'll select new game to start a new game and then exit play mode which will save our data if we check where our data previously was instead of seeing a data file we'll now see a directory called test and our data file will be inside of there instead and of course if we change the selected profile id to something else like test2 and then do that again we'll see a test2 directory show up with a different data file in it which shows that this is working so far next we'll start adding some of the changes needed to support the save slots menu right now our system can only load a single profile at a time but for the safe slots menu we'll need to show data from each profile all at the same time we're going to keep things simple for this tutorial and add a method to our file data handler to load all of the existing profiles at once back in the file data handler class we'll create a public method called load all profiles that returns a dictionary that maps a string which will be the profile id to a game data object which will be the game data corresponding to that profile id the first thing we'll need to do is create a new dictionary called profile dictionary and then return that at the bottom of this method now in between here we'll need to loop over all of the directory names in the directory that we're storing the data in we can do that by creating a new directory info object with our data der path which represents the directory where our data lives and then call enumerate directories on that which gives us a collection of directory infos that we can iterate over and then we can loop through those in a for each loop like so and just as a quick note you'll need to add a using statement for system.io for your code to recognize the directory info class as well as a couple other classes that we're about to use back in that for each loop we can get the name of the directory we're iterating over or in other words our profile id by calling yourinfo.name and as a bit of a defensive programming check we'll also make sure our data file actually exists in that folder before we try to load it and add it to the dictionary this is important because if other directories get put in that main directory for any reason they may not actually relate to our saved data and instead may represent other data our application is storing so we can check this by creating the full path using path.combine and then using an if statement to check if the data file does or doesn't exist at that full path and if it doesn't we'll give ourselves some warning logging and then use the keyword continue to immediately continue to the next dur info in our directory infos now if we get past that check that means the file does exist and we can try to load it and add it to the dictionary we'll take advantage of our load method that's already been created in this class to get the game data for that profile id and then we'll do one last defensive programming check to make sure that the data isn't null since we've already checked that the file exists this shouldn't happen unless something goes horribly wrong with loading the data in which case we'll log an error to let ourselves know and of course if we successfully loaded the game data meaning it's not null we'll add it to the dictionary using the profile id as the key and the profile data as the value and that completes the method that we can use to get the game data from each profile all at once next we want to be able to get that data from other scripts so back in the data persistence manager we'll add a public method called get all profiles game data that returns a string to game data dictionary then call the method in the file data handler we just created and return the result of that the next thing we'll focus on is setting up the save slots menu back in unity under the canvas we'll create a new empty game object called save slots menu for simplicity's sake i'm going to duplicate the new game button we already have using control plus d on windows rename the game object to save slot and then move it under the save slots menu game object in the scene hierarchy and for now i'm just going to disable the main menu game object so that we can focus on building out our save slots menu for the save slot button we'll make it a bit bigger a width of 750 and a height of 200 seem pretty good and as for the colors we're just going to go with what was duplicated from the new game button we'll be writing a script a bit later to deal with when this is clicked but for now let's clear the on click method so that it doesn't confuse us later on so how we're going to do this is that we're going to have two different setups for this save slot one for when there is no data for that profile and another for when there is data we'll create two new empty game objects under the save slot game object one called no data content and another called has data content for no data content we'll just move this text mesh pro text into it and then change the text to say empty we'll also rename the game object to say empty text just for organizational purposes for when there is data instead of showing the word empty we'll want to show some information about the game data for this example we're just going to show the percentage the game has been completed as well as the amount of times that the player has died we'll just duplicate the empty text game object with control plus d on windows rename it to percentage complete text and then put in some placeholder text like 82 percent complete and then move that under the has data content game object and just so we can see this a bit better we'll disable the node data content game object for right now then we'll duplicate that text rename that game object to death count text change the text itself to say death count colon 26 as a placeholder make the text a bit smaller and then position it right under the percentage complete text in the scene and i think that looks pretty good for the save slot in a bit we'll duplicate this for multiple save slots but we'll get one working first we'll also want to have a back button so we can go back to the main menu we can just duplicate the new game button from the main menu rename the game object to back button remove the on click listener that was copied change the text to save back move it under the save slots menu and then position it in the scene to be at the very bottom of the screen so now let's actually write some code to make this functional we'll start with creating a script we can attach to the save slot to manage what the save slot should show in the scripts main menu folder of the project will create a new c-sharp script called save slot and then double-click it to open it up first we can get rid of these placeholder methods each save slot is going to have a profile id associated with it so we'll define that here and make it a serialized field variable so we can choose which profile id this save slot will correspond to we also want references to the no data content and has data content game objects so that we can toggle them on or off depending on if there's data for that profile and we'll also want references to anything else that needs to be set based on our game data so in this case that's going to be the percentage complete text and the death count text and since these are text mesh pro objects we'll need to add a using statement for tm pro at the top of this script then we'll create a set data method that will call from another script that we're going to make next the method will take in a gamedata object and we'll check if the data is null which will tell us whether or not data exists for this save slots profile id when there isn't data we'll set the no data content game object to be active and the has data content game object to be inactive and when there is data we'll do the opposite so that the has data content game object is the one that's active we also want to set the contents of our display here depending on the game data for this profile we're saving the death count to our game data directly so that's easily accessible however we're not directly saving the percentage our game has been completed but instead that needs to be calculated from other game data that we have saved one way to go about this in the save and load system that we're using is to add a method in the game data class to calculate and return that information so in the game data class we'll create a new method called get percentage complete in this case this is a very simple game where the only objective is collecting coins so we'll just loop through our data to see how many coins that we've collected then we'll divide the total coins collected by the total amount of coins and then multiply that by 100 to get the percentage and of course we don't want to divide by zero so we'll make sure that the count is not zero before we do that calculation and in this case i also don't want to display any decimals which is why i'm returning this as an integer but you could return this as a float and format it if you do want decimals now back in the save slot script we can set the percentage complete text using the method that we just created in our game data class and we can also set the death count text using the death count directly from our game data and finally we'll want to add a public get method to return the profile id that corresponds to this save slot which is going to be used by another script we'll create in just a bit now back in unity let's attach this script to the save slot we have by clicking on it in the scene hierarchy and then dragging the script onto it then we'll drag in all of the corresponding content from the scene hierarchy and for right now we're going to leave the profile id blank next we're going to create a script that's going to control our save slots menu as a whole which is also going to appropriately set the display content for each save slot in the scripts main menu folder of the project we'll create a new c-sharp script called save slots menu and then double-click it to open it up we'll create a private safe slot array called save slots and then in the awake method we'll use the git components in children method to initialize this variable with all of the child safe slot objects under the game object that this script will be attached to right now of course we only have one but we're going to write this script as if we have multiple we can then create a method called activate menu which we'll expand on later but for right now we'll just want to set these save slots appropriately depending on our saved data we can call the data persistence manager get all profiles data method that we created earlier to get a dictionary containing any data profiles we have saved then we'll loop through each of these save slots and then see if the profile id of our save slot lines up with any of the data that we've loaded by trying to get that data out of the dictionary using the save slots profile id regardless of if the data exists or not we'll call set data on that save slot which if you recall has a null check to determine whether or not data exists in which case it'll display different content depending on if there was save data or not eventually we're going to call this activatemenu method when navigating from the previous menu but for now just so we can see this working let's create a start method and then call activate menu from there now back in unity we'll drag the save slots menu script into the inspector while clicked on the save slots menu game object to add it as a component then let's hit play and see if this is working so far as we can see the save slot menu displays as empty which is perfect since right now our profile id for the save slot is an empty string which we don't have any saved data for as a reminder from earlier in this tutorial we have two safe profiles in our data right now with the profile ids being test and test2 so if we stop play mode and then replace the profile id for this save slot with test and then play it again we'll see that instead of being empty the save slot shows the saved data just like we want it to and that shows that everything is working up to this point the next thing we're going to do is set up the menu navigation so that we can get to this save slots menu through our main menu when we click new game real quick in unity scene hierarchy we'll disable the save slots menu and then enable the main menu then we'll open up the main menu script by double clicking it at the top we'll add a section for menu navigation and add a serialize field private variable for the save slots menu then when the new game button is clicked instead of creating a new game and loading the gameplay scene we'll remove all of that and instead activate our save slots menu by calling save slots menu dot activate menu and right after that we'll call this deactivate menu which is a method that we're going to create in this main menu script we'll create two new public methods called activate menu and deactivate menu which are going to correspond to when the main menu is either activated or deactivated for this menu it's really simple we'll just set the game object to be active when we activate and then inactive when we deactivate next in the save slots menu class let's remove the start method completely in activate menu at the very top we'll set this game object to be active and we'll also create a deactivate menu method and set the game object to be inactive in there and of course we're going to want to add the capability to navigate back to the main menu so just like in the main menu we'll add a section for menu navigation at the top of the script but this time the variable is going to be the main menu and then we'll create a method called on back clicked which is going to be the on click listener for the menus back button and in there we'll activate the main menu and then deactivate the save slots menu right after now back in unity let's hook all of this up in the inspector we'll drag in the save slots menu under the main menu and then drag in the main menu under the save slots menu to hook up the navigation between the two and then under the back button we'll add an on click listener drag in the save slots menu game object and then select the on back click function that we created then we can hit play to see how things go you'll notice right after we click the new game button it transitions us to the save slots menu correctly but all of a sudden we can't click anything this is because of how the first selected variable works in unity's event system there's an odd quark though that we have to deal with where if we try to set the selected game object for the event system through code we'll end up with an issue where the newly selected button won't be highlighted i'm not sure if there's a better way to handle this or not but the main way that i've found is to set the currently selected game object for unity's event system to null then wait until the end of the frame and then set the selected game object to the one that we want using a co routine but if anyone watching has a better way to go about this please feel free to mention it in the comments anyways we'll do this in a menu script that our other menus can inherit so that way we only have to write this code once in the scripts main menu folder we'll create a new c-sharp script called menu and then double-click it to open it up at the top we'll create a gameobject variable for the first selected button for that menu we'll also add a using statement for unityengine.event systems then in an on enable method which will make protected and virtual so that other scripts can overwrite it if needed we'll start a co-routine called set first selected and then pass in that first selected variable and then we'll create a coroutine method called set first selected where we'll set the event systems current selected object to null wait for the end of the frame and then set the event system's current selected object to be that first selected variable now in our save slots menu script we can extend from this menu script instead of mono behavior and then we can do the same thing for the main menu script then back in unity we'll drag in the new game button as the first selected for the main menu and then we'll drag in the save slot for the first selected in our save slots menu and then we can hit play and we'll see that we can navigate around between the two menus just as we'd expect but of course if we click the save slot right now nothing happens because we haven't hooked this up to an on click listener yet so we'll do that next but before we do that we're going to need to be able to change the selected profile id in our data persistence manager so in the data persistence manager script we'll add a public method called change selected profile id that takes in a string and in there we'll set the selected profile id to the one being passed in we'll also call load game right after this so that the game data that's in memory for the data persistence manager will always immediately get loaded to correspond to the profile that we changed to then back in the safe slots menu script we'll create a new method called on save slot clicked that will take in a save slot first we'll update the selected profile according to the save slot that was clicked by calling the method that we just created in the data persistence manager then we'll call the data persistence manager to create a new game which will initialize our data to default values and then finally we'll load the gameplay scene asynchronously which in this case is just called sample scene and to do this we'll need to add a using statement for unity engine dot scene management to the top of the script and while it's not at all required something i like to do when locking in a menu option is to disable all of the other buttons in the menu just to prevent something from getting double-clicked while the scene is loading at the top of this method we'll call a method called disable menu buttons that we're going to create then we'll create a new method called disable menu buttons at the bottom of this class to disable these save slot buttons we'll need to add something to the safe slot script in the save slot script we'll add a using statement for unity engine.ui and then we'll add a private button called save slot button then we'll get a reference to this by creating an awake method and then calling git component for the button component and last at the bottom we'll create a public method called set interactable that takes in a boolean and then sets the buttons interactable field to the boolean that's passed in now back in the safe slots menu script we can loop through each save slot and then set it to be non-interactable here and we'll also add a using statement for unityengine.ui and then add a serialize field button for the back button and then set that to be non-interactive as well in the disable menu buttons method so that all buttons can no longer be clicked when this method is called back in unity we can drag in the back button to our save slots menu then we'll go into our save slot game object and then add an on click listener we'll drag in the save slots menu game object and then select the on save slot clicked method that we created and finally we'll drag in the safe slot game object itself as the parameter to be passed in and now if we play this and then click that profile it throws us into our gameplay scene from the start just as we'd expect for starting a new game and if we exit right away and then go back to our save slots we'll see that the data has in fact reset and we're sitting at zero percent for that saved game now that we have a single save slot working for a new game let's duplicate this so that we have multiple save slots in the ui for right now we'll disable the main menu and enable the save slots menu so that we can see things better while we're working on them it would be a good idea to turn the save slot game object into a prefab so that if things change in the future it's easy for us to modify a single save slot and then apply that change to all of them we can do that by dragging the save slot game object into the prefabs folder like so and for the prefab we'll make the profile id be blank then in the scene hierarchy we can duplicate that save slot with ctrl d on windows create four of them in total and then drag them around the scene so they're positioned one after another like so then for the profile ids i'm just going to keep things simple and start with the number zero and then increment up to three so each has a unique profile id where zero is at the top and then three is at the bottom then we can disable the save slots menu again and then enable the main menu and now that we have something working i'm going to delete the previously saved data we have so it doesn't interfere and we're starting from a clean slate and after that we can hit play and play around with this a bit and we'll see that going through the new game button on our main menu is creating new games according to the save slots that we select of course though that doesn't do much good unless we can load the game as well so let's implement that next in unity we'll just duplicate the continue button rename the game object to load game button remove the on click listener function for now change the text to say load game and then drag it down just a bit in the scene the idea here is that we want the new game button and load game button to both navigate us to the save slots menu except the menu will behave slightly differently depending on which button we navigated from back in the safe slots menu script we'll create a boolean called is loading game and initialize it to false then we'll take in a boolean parameter through the activate menu method and then set the is loading game variable in this menu according to that parameter with that in place we can use this boolean to split some logic throughout this class depending on if we're loading or starting a new game first if we're loading we want to set any of the save slots that don't have data to be inactive so that they can't be clicked so when we loop through our save slots here what we can do is say if the data was null and we're loading the game then set the save slot to be non-interactable or otherwise set it to be interactable the only other variation here is how we transition to the next scene and whether we have new data or we load the data from an existing profile since the change selected profile id method also loads the game for us really all we need to do here is only start a new game if is loading game is false and then back in the main menu script when we activate the save slots menu through the new game button we'll pass in false and then we'll add a method called on load game click where we'll do pretty much the same as on new game clicked except when we activate the save slots menu will pass in true to indicate that we're loading back in unity we need to hook up the load game buttons on click listener by clicking the plus button here dragging in the main menu game object and then selecting the on load game clicked method that we just created now if we go into play mode and click the load game button we'll see that the save slots without data can't be selected and if we load this save slot here we can see that the game is loaded from where we left off for this saved game just like we wanted and if we were to choose new game instead we'd see that all of these save slots can be selected to create a new game with and if we do so by selecting this save slot again we can see that it started a new game for that save slot overwriting our saved data and putting us back to the beginning of the level now before we go on to implementing the continue button there is a small thing that we should fix just really quick if we get rid of these saved data for the first slot and then try to load the game you'll see that at first nothing is selected this is because our first selected button in our event system is still the first save slot but in this case it's non-interactable which makes it look like nothing is selected luckily this is a pretty easy fix in the safe slots menu activate menu method we'll add a game object variable called first selected right above this for loop and then default it to the back button then if we enter this else block we'll check if the first selected is still the back button and if it is we'll set it to the save slot instead and then at the very end of this method we'll call that coroutine to set the currently selected game object now if we go back and play this we'll see that the first selected option is the first safe slot that has data for load game and it still selects the top slot for new game the next thing we should do is disable the load game button when there is no data to load in the main menu script we'll add a serialize field button for the load game button and just like with the continue game button we'll set interactable to false if the data persistence manager doesn't have game data and of course remember to drag in the load button to the main menu script in unity right now if we play this these buttons will be disabled regardless of if there is or isn't data and this is because in the data persistence manager we're not loading data at all at startup how we'll want to go about this is defaulting the game data to one of our profiles if one exists when the data persistence manager first starts up we could just use the first profile it finds but we're actually going to timestamp our data every time we save so that we can default to the most recently played saved game in the gamedata script we'll add a public long variable called last updated which is what we'll use to store a serialized date time object every time we save and next in the data persistence manager we'll scroll down to the save game method every time we save the game we'll update that last updated variable by calling system.datetime.now.2 binary which gets the current date and time for the system you're running on and then serializes it to binary which can more easily be saved next in the file data handler class we need to create a method that will give us the profile id for the most recently played profile so we'll create a public method called get most recently updated profile id we'll take advantage of our load all profiles method by calling that to get all of these saved profiles and then in a for each loop we'll loop through each key value pair where the key is the profile id and then the value is the game data for that profile with how the load all profiles method works we shouldn't be getting any null game data back from it but even so it would be a good idea to check if the data is null here as kind of a defensive check just in case the load all profiles method changes in the future and for that base case we'll just continue which will immediately move on to the next entry in our loop to keep track of which profile id was the most recently played we'll create a string called most recent profile id at the top of this method and initialize it to null then if we get past this base case in our for each loop that means that data exists and was found for that profile id if the most recent profile id is still null that means that this is the first saved data that we've come across that exists so we'll set that one as the most recent profile id otherwise we'll need to compare the new profile id to the current most recently played profile id to determine which one is the most recent since these are saved as binary within our data we'll need to convert them back to the date time objects first and then we can compare them with a logical operator where we'll check if the new profile's date time is greater than the current most recent date time if it's greater that means it was played more recently and so we'll set the most recent profile id to the new one and then at the end of this method after we've looped through each profile we'll return the most recent profile id and just to note if we don't have any saved data at all this will end up being null that gets returned from here with how we have things set up this introduces the possibility of the profile id being null when we save or load data through the file data handler and because we're using that to create the full string path with path.combine this will throw an error if that value is null there are a lot of ways we could go about managing this but we're going to keep things simple and just add a base case to the top of the load and save methods for when the profile id gets passed in as null so if the profile id is null when we enter this load method we can return null here right away since there wouldn't be any data defined for a null profile id anyways and we'll do the same at the top of the save method except we'll just return next back in the data persistence manager we'll start out the selected profile id as an empty string and then we'll scroll down to the awake method and right after we've created the data handler we'll set the selected profile id equal to the result of the method that we just created and if we go back into play mode we're able to select load game again because there is some saved data that we can load and we can also now select the continue button which will start the game with the most recently played profile and just to see this a bit better we can start another new game and exit to save it and now when we hit continue it starts from the new game since we played it most recently instead of the other saved game that we have and if we delete all of our saved data we'll see that the continue and load game buttons are non-interactable since we don't have any data to load or continue from which shows that all of this is implemented just like we wanted the last thing i want to add for this tutorial are some improvements to the debugging options that we have these next changes are meant to be used in development when starting up the game through a scene that isn't the main menu so we'll switch over to the gameplay scene by double clicking it in the project the first thing we might want to do in development is completely disable data persistence so that the game doesn't save or load at all in the data persistence manager we'll add a serialized field private boolean variable called disable data persistence and initialize it to false then in the awake method it's a good idea to make it clear that data persistence is disabled by logging a warning and next in load game if this variable is true we'll simply return at the top and we'll do the exact same thing for the save game method now the next thing that might be useful is to override the selected profile id we'll add two variables at the top one for whether or not to override the profile id and another for what to override that profile id to then in the awake method at the very end we'll say that if override selected profile id is true then we'll set our selected profile id equal to the test selected profile id and we'll also log a warning in this case just to make it clear to ourselves that the selected profile id is being overridden and back in unity in the gameplay scene we can check the override selected profile id checkbox here and then start the game we'll see right away the warning login we put in indicating the profile id was overwritten to one called test and upon saving the game we'll see that the test directory shows up in our file system as well as a profile and likewise we can check the disabled data persistence variable and if we press play we'll see that no data was loaded and of course when we exit no data is saved and that's it for this video thank you so much for watching this ended up being one of the longer video tutorials i've done so awesome job if you made it to the end and i really hope you found it to be helpful in some way if you did please give it a thumbs up so more people see it and if you want to see more from me be sure to hit the subscribe button as well those things can really help a small channel like this and i appreciate it a ton also be sure to take a look at the pinned comment of this video where i'll put any bug fixes or corrections to things related to this video as appropriate you're also welcome to come by my discord server which is a great place to ask questions suggest a video topic or just show off the game that you're creating you can also follow me on twitter or instagram where i mostly post about the game that i'm creating anyways thanks again for watching and i hope this was helpful [Music]
Info
Channel: Shaped by Rain Studios
Views: 29,898
Rating: undefined out of 5
Keywords: trevermock, trevormock, trevor, trever, mock, save slots, save slots tutorial, save slots tutorial unity, save profiles, multiple saves unity, multiple saves, save slots menu, save slots menu tutorial, save & load system, save load unity, save system unity, multiple save files, multiple save files unity, multiple saves tutorial, multiple save files tutorial, save and load system, save and load unity, multiple saved games, multiple saved games unity, unity save and load
Id: Kokt0c8sbNc
Channel Id: undefined
Length: 35min 12sec (2112 seconds)
Published: Tue May 24 2022
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.