Infinity PBR by Magic Pig Games
  • Infinity PBR Documentation
  • Game Modules 4
    • ➡️Quick Start
    • 📽️Video Tutorials
      • Quick Start: Creating Game Module Objects
      • Automating Start Actions on GameModulesActor
      • Inflicting Damage with Conditions
      • Updating UI (and more) with Blackboard Notes
      • Dynamic Menus with Item Objects and Dictionaries
      • Create Custom Quest Rewards
      • Save and Load Game Data
      • Stats: Deep Dive
      • Items: Deep Dive
      • Conditions: Deep Dive
      • First Person Movement
      • Tutorial: "Overheal" Effect with Condition & Stats
      • Tutorial: Create a Character & Actor Class Inheriting from GameModulesActor
    • 👀Game Modules Viewer
      • Viewer: Dictionaries
      • Viewer: Stat / GameStatList
      • Viewer: ItemObject / GameItemObjectList
      • Viewer: ItemAttribute / GameItemAttributeList
      • Viewer: Condition / GameConditionList
      • Viewer: Quest / GameQuestList
    • V4 Migration Tips
      • Introducing GameModulesActor
      • Interfaces
      • No More Tick*
      • Dictionaries
      • Repositories
      • Tips from Upgrading "Legend of the Stones"
    • Important Information
      • Game Modules Overview
      • Inherit from GameModulesActor
      • Things to not forget to do
      • Bugs, Backups, and Demos
      • FAQ / Tips & Tricks
      • Required Prefabs
      • Game Module Repository
      • Release Notes
    • Module Documentation
      • Game Modules Actor
      • Game Module "Lists"
        • Get() Methods
          • GameStatList Get() Methods
          • GameItemObjectList Get() Methods
          • GameItemAttribute Get() Methods
          • GameConditionList Get() Methods
          • GameQuestList Get() Methods
        • Contains() Methods
          • GameStatList Contains() Methods
          • GameItemObjectList Contains() Methods
          • GameItemAttributeList Contains() Methods
          • GameConditionList Contains() Methods
          • GameQuestList Contains() Methods
        • Count() Methods
          • GameStatList Count() Methods
          • GameItemObjectList Count() Methods
          • GameItemAttributeList Count() Methods
          • GameConditionList Count() Methods
          • GameQuestList Count() Methods
        • Remove() Methods
          • GameStatList Remove() Methods
          • GameItemObjectList Remove() Methods
          • GameItemAttributeList Remove() Methods
          • GameConditionList Remove() Methods
          • GameQuestList Remove() Methods
        • GameStatList
        • GameItemObjectList
        • GameItemAttributeList
        • GameQuestList
        • GameConditionList
      • Blackboard
        • Blackboard.cs
        • Blackboard Follower
        • Blackboard Note
        • Blackboard Event
        • Blackboard Values
        • Tips & Tricks
          • Use extension methods to check BlackboardNotes (or events)
      • Stats
        • IHaveStats
        • Stat.cs
        • GameStat.cs
        • GameStatList.cs
        • Mastery Levels
      • Loot
        • LootItems.cs
        • LootBox.cs
        • GameLootBox.cs
        • Generating & Handling Loot
        • Custom Loot Generation Algorithm
      • Items
        • ItemObject.cs
          • Manage Item Objects
          • Allowed Item Attributes
          • Starting Item Attributes
          • Item Attribute Variables
            • Variables Methods
        • GameItemObject.cs
        • GameItemObjectList.cs
        • ItemAttribute.cs
          • Manage Item Attributes
          • General Settings
          • Name Settings
          • Requisite Attributes
        • GameItemAttribute.cs
        • GameItemAttributeList.cs
        • Code Examples
      • Conditions
        • Condition.cs
          • Main Settings
          • Condition Time
          • Effects on Points
        • GameCondition.cs
        • GameConditionList.cs
        • Expiration Condition Handler
        • Code Examples
      • Quests
        • Quest
          • Main Settings
          • Quest Step Settings
        • Quest Steps
        • Quest Conditions
          • Create a Custom Quest Condition
            • Your Quest Condition
            • Your Quest Condition Editor
            • Your Quest Condition Drawer
          • Quest Condition Details
            • Blackboard Value Bool
            • Blackboard Value GameObject
            • Blackboard Value Number
            • Blackboard Value String
            • Final Stat Is
            • Game Condition List Contains
            • Game Item Object List Contains
            • Game Stat List Contains
          • Quest Condition Enums
        • Quest Rewards
          • Create a Custom Quest Reward
            • Your Quest Reward
            • Your Quest Reward Editor
            • Your Quest Reward Drawer
          • Quest Reward Details
            • Point Reward
            • Condition Reward
            • Quest Quest Reward
            • Item Object Reward
          • Custom Quest Reward Handler
        • GameQuest
        • GameQuestList
        • Quest Events
        • Demo Scene Quests
          • Push the Button
          • Add Money
          • Don't Get Poisoned
          • Rescue the Puppy
      • Voices
        • Voices
        • Voice.cs
        • Code Examples
      • Dictionaries
        • Dictionaries Setup
        • Dictionaries Methods
        • KeyValue Methods
        • Save and Load
        • Object Reference
      • Gametime & Timeboard
        • Timeboard
          • Timeboard Events
          • TimeboardFollower
        • Gametime
          • Pause Level
          • Time Options
          • Properties & Methods
        • TimeSpan
        • Code Examples
      • Property Code
      • Lookup Table
      • Save and Load
        • GameList & GameFile
        • Making objects saveable
        • Saving, and Loading
        • BlackboardEvents sent by Save and Load
    • Game Module "Systems"
      • Drag-and-Drop Inventory System
        • Scripts
          • PanelManager
          • OnScreenItem
          • Panel
          • BoxManager
        • Scene & Class Setup
        • Item / Object Setup
        • Item / Inventory Setup
        • Box Setup (Chests, Bags, Other Inventories)
        • Setup Your Scene
      • First Person Movement
      • Character Creation
    • Game Module Demo Projects
      • Party Based RPG
        • Title Scene
        • Character Creation Scene
        • World & Dungeon Scenes
    • Magic Time for Game Modules
  • ✨Northstar Tracking System
    • ✅Overview & Quickstart
      • ➡️Quick Start
      • 🫐Demo Scene
      • 🛠️Customizing & Overriding
        • Create a Custom Navigation Bar
        • Create a Custom Compass / Radar
        • Runtime Overrides
          • Screen & Edge Overlay
          • Navigation Bar
          • Compass / Radar
      • ☄️Tips & Code Examples
    • Northstar Documentation
      • Global Northstar Settings
      • Northstar Overlay Settings
      • Compass & Radar
        • Compass
        • Radar
      • Northstar Screen Overlay
        • Screen & Edge Overlay
        • Navigation Bar
      • Tracked Target Compass Radar
      • Tracked Target Overlay
        • Types
        • Override Values
      • Overlay Icon
      • Compass Icon
      • Distance Text
  • 🚀Projectile Factory
    • 👀Overview & Quickstart
      • ➡️Quick Start Guide
        • Create Your First Projectile
        • Add Projectile Factory & Create a Projectile Spawner
        • Use 3rd Party Integrations
        • Extending Projectile Factory
        • Making Lasers & Similar Attached Projectiles
      • 💡FAQs + Important Reminders
    • Game Modules 4 Integration
      • Projectiles with TimeMod
    • Magic Time for Projectile Factory
    • ✅3rd Party Particle Integrations [16]
      • ▶️Archanor VFX [5]
        • Sci-Fi Arsenal
        • Polygon Arsenal
        • Magic Arsenal
        • Retro Arsenal
        • Rainbow Magic
      • ▶️Gabriel Aguiar Prod [2]
        • Unique Projectiles Vol. 1
        • Unique Projectiles Vol. 2
      • ▶️HOVL Studio [4]
        • Toon Projectiles
        • Toon Projectiles 2
        • AAA Stylized Projectiles Vol. 1
        • AAA Projectiles Vol. 2
      • ▶️kripto289 [1]
        • Realistic Effects Pack 4
      • ▶️FORGE3D [1]
        • Sci-Fi Effects
      • ▶️Knife [1]
        • PRO Effects - Sci-Fi Shooter FX
      • ▶️Jean Moreno [1]
        • Cartoon FX Remastered
      • ▶️Synty Studios [1]
        • 🟡Synty Studios Particles
    • Projectile Factory Documentation
      • 🔫Projectile Spawner
        • Projectile Spawner Code
      • 🚀Projectile
        • Projectile Code
        • Projectile Data
      • ✨Spawn Behavior
        • Spawn Behavior Code
        • Spawn Behavior Modification
      • 🕊️Behaviors
        • Behavior Examples
      • ⚡Events
      • 👁️Observers, Global Observers, and Observer Objects
        • Toggle Objects At Events Observer Object
      • 👩‍💼Factory Manager
      • 🏹Trajectory
      • 🎱Object Pooling
      • 🤩Create Custom Behaviors
      • Spawn Point Manager
      • Helper Tools
        • Projectiles Quick Editor
        • Set Trail Auto Destroy to False
        • Set Layer of All Projectiles
        • Remove Colliders
      • Additional Scripts
        • Destroy or Pool Object
        • Project Force
        • Raycast Shooter + Handlers
        • Projectile Utilities
  • Additional Systems & Tools
    • 🎨Runtime Color Sampler
      • Quick Start
      • Demo Walkthrough
      • Runtime Color Sampler (Prefab & Class)
        • Sampler Sphere
        • Sampler Camera
      • Runtime Listener
      • Runtime Color Settings
      • Scripting
      • Additional Classes
    • 🙎‍♀️Portrait Avatars
      • Setup
        • Create a Portrait Avatar
        • Create a UI Portrait
      • Portrait Avatars
        • Scripting
      • Portrait3D
      • Portrait2D
      • Portrait UI
      • Avatar Camera
      • Important Considerations
    • 🎛️Audio Clip Combiner
    • 🌈Color Shifter
    • 🛠️Support Classes
      • Utilities.cs
      • InfinityExtensions.cs
  • ⌛Magic Time - Local Time Scale
    • Overview
    • ➡️Quick Start
    • 🛠️Integrations
    • 💡FAQ
    • Local Time Scale
      • Local Time Scale Scripting
    • Magic Time Manager
      • Magic Time Manager Scripting
    • Magic Time User
      • IHaveLocalTime
      • Magic Time User Scripting
      • Additional "Magic Time User" Components
    • Time Zone
  • Equipment Systems
    • Overview
    • Blend Shapes Manager
    • Blend Shapes Preset Manager
    • Prefab and Object Manager
      • Humanoid Demo & Setup
      • EquipmentObject.cs
      • Prefab Groups
      • Variables
      • Scripting Examples
    • Wardrobe Prefab Manager
  • 📽️General Tutorials
    • Quick 3rd Person Controller
  • ⚔️Legend of the Stones
    • Actors, Players, NPCs
    • Systems
      • Game State
  • External Links
  • Get them at the Asset Store
  • Connect on Discord
  • YouTube
  • Twitch
  • 🚧Work In Progress / Coming Soon
Powered by GitBook
On this page
  • SaveableObjectId()
  • SaveState() and LoadState()

Was this helpful?

  1. Game Modules 4
  2. Module Documentation
  3. Save and Load

Making objects saveable

v4.0

PreviousGameList & GameFileNextSaving, and Loading

Last updated 1 year ago

Was this helpful?

Objects can automatically save and load their data once the method is started on the Save and Load module.

To make an object saveable, first add the Savable component to them.

The component will automatically generate a Save ID, which is unique to this object. This value must be unique among all of the Saveable objects.

Once set, the Save ID should *NEVER* change. If the Save ID changes, data will not be loaded into the object!

I've added the giant "Unlock" button to help ensure you do not accidentally change this value. If you'd like to change it, click "Unlock" first.

Next, make sure the classes on the object which need to be saved implements ISaveable.

ISaveable requires the following methods:

public string SaveableObjectId();

public object SaveState();
public void LoadState(string jsonEncodedState);
        
public void PreSaveActions();
public void PostSaveActions();

public void PreLoadActions();
public void PostLoadActions();

The Pre- and Post- actions are optional. While you'll have to add them to your class, you may choose to not use them for any purpose.

SaveableObjectId()

The SaveableObjectId() can be randomly generated by your script or you can set it to somethign more human readable. There should only be one class with a specific Saveable Object Id on each Saveable object. However, the same Saveable Object Id can live on multiple different Saveable objects.

The saved data is stored in a structure based on teh Save ID & Saveable Object ID combined.

// Use a specific Saveable Object Id
[SerializeField] private string _saveableObjectId = "Game Data";
public string SaveableObjectId() => _saveableObjectId;

// Generate a random Saveable Object Id
// If the value of _saveableObjectId is not set, we will create a new random string
// and set it. Otherwise, we will return the value.
[SerializeField] private string _saveableObjectId;
public string SaveableObjectId() 
    => string.IsNullOrWhiteSpace(_saveableObjectId) 
        ? _saveableObjectId = GUID.Generate().ToString() 
        : _saveableObjectId;

Use the AI to speed up development

Did you know if you copy/paste the documentation below into ChatGPT, and then paste in your struct, it can make the SaveState() and LoadState() methods for you?

That should save you a good 5 minutes :)

SaveState() and LoadState()

You will need to add a new struct to contain the saved data. In this you will specify which data in your class should be saved. Note that only data types which can be serialized can be saved. Here is the struct from the GameData object in the Party Based RPG demo game, which can be found in GameData.cs.

[System.Serializable]
public struct GameDataSaveData
{
    public string uid;
    public string gameName;
    public GameStatList partyStats;
    public List<DemoActor> players;
    public int activePlayerIndex;
    public Vector3 position;
    public Quaternion rotation;
    public GameQuestList quests;
}

SaveState()

In your SaveState() method, you will create a new data object from your struct, and populate it with the current values. The method will return the data object to the Saveable class, which will combine it with all the other classes with saved data, encode it, and send it to the Save and Load module.

You can do more than just what is displayed below, of course, by adding additional code to the SaveState() method.

public object SaveState()
{
    var data = new GameDataSaveData
    {
        uid = Uid(),
        gameName = _gameName,
        partyStats = partyStats,
        players = players,
        activePlayerIndex = ActivePlayerIndex,
        position = PlayerObjectPosition,
        rotation = PlayerObjectRotation,
        quests = quests
    };
    
    return data;
}

LoadState()

Your LoadState() method will do the opposite of SaveState(). A JSON encoded string will be provided, and your method will need to decode the string into the struct you've created, and then populate the values in your class with the values from the decoded object.

In the example below, since the GameData class is a singleton, the GameDataIsSetButIsNotThis() method will return true if this instance of GameData is not the registered singleton, and skip loading, avoiding a potential error.

After the data is loaded, we also call StartActions(), a method which sets up objects in the scene.

These are examples of additional logic you can add into your save and load methods.

public void LoadState(string jsonEncodedState)
{
    // If this is not the Singleton GameData, we do nothing.
    if (GameDataIsSetButIsNotThis())
        return;
           
    // Decode the JSON data into a GameDataSaveData object
    var data = JsonUtility.FromJson<GameDataSaveData>(jsonEncodedState);
            
    // Set the values from data to the GameData object
    _uid = data.uid;
    _gameName = data.gameName;
    partyStats = data.partyStats;
    players = data.players;
    ActivePlayerIndex = data.activePlayerIndex;
    quests = data.quests;

    // Do the StartActions()
    StartActions();
}

If you are using a Character Controller, you likely will need to disable it prior to setting your Transform values, then enable it right after. Otherwise, it will block your object from moving, if it's already live in the scene.

public void LoadState(string jsonEncodedState) { var data = JsonUtility.FromJson(jsonEncodedState);
        CharacterController.enabled = false;
        this.actor = data.actor;
        Transform.position = data.position;
        Transform.rotation = data.rotation;
        CharacterController.enabled = true;
        
        // Add any additional logic post-loading if needed
}

Here's an example of my LoadState() method on the "Party" object in . This object is the in-world representation of the player with the camera etc.

Here's an example.
Legend of the Stones