Example Script

An example script.

This script saves the player's transform values in a save state and a string in player settings. This script is used for the demo scene.

using Esper.ESave.SavableObjects;
using UnityEngine;

namespace Esper.ESave.Examples
{
    /// <summary>
    /// An example script that saves and loads the player's position and rotation.
    /// </summary>
    public class SaveLoadExample : MonoBehaviour
    {
        /// <summary>
        /// The ID used for saving the player transform.
        /// </summary>
        private const string playerTransformID = "PlayerTransform";

        /// <summary>
        /// The ID used for saving a random setting.
        /// </summary>
        private const string mySettingID = "MySetting";

        /// <summary>
        /// The player transform.
        /// </summary>
        [SerializeField]
        private Transform playerTransform;

        /// <summary>
        /// Creates a save state.
        /// </summary>
        public void CreateSave()
        {
            // Create a save state with the ID 0 if it doesn't exist
            // Passing an ID parameter is not necessary, as a save state will still be created with the first
            // available ID
            ESave.CreateSave(0);
        }

        /// <summary>
        /// Saves the data. Only the player position is saved.
        /// </summary>
        public void Save()
        {
            // This method is recommended as it works no matter which multithread mode is set
            // If multithread mode is set to disabled, using OnComplete's will not be necessary

            // Ensure there's an active save state (only the active save can be edited)
            if (SaveState.active != null)
            {
                // Save the player transform (use the ToSavable extension because the Transform class itself is not savable)
                SaveState.active.AddData(playerTransformID, playerTransform.ToSavable()).OnComplete(data =>
                {
                    // This method confirms all changes made to a save state
                    ESave.Save(0);
                });
            }
            else
            {
                ESaveLogger.LogWarning("Load the save first!.");
            }

            // Saving a value to player settings
            var settings = ESave.GetPlayerSettings();

            settings.AddData(mySettingID, "I am data!").OnComplete(result =>
            {
                Debug.Log("Saved a setting to player settings.");
            });

            // The commented method below will only work if multithread method is set to disabled
            //if (SaveState.active != null)
            //{
            //    SaveState.active.AddData(playerTransformID, playerTransform.ToSavable());
            //    ESave.Save(0);
            //}
            //else
            //{
            //    ESaveLogger.LogWarning("Load the save first!.");
            //}

            //var settings = ESave.GetPlayerSettings();
            //settings.AddData(mySettingID, "I am data!");
            //Debug.Log("Saved a setting to player settings.");
        }

        /// <summary>
        /// Loads the data. This just loads the player position and sets it.
        /// </summary>
        public void Load()
        {
            // Load the save state with the ID 0 if it exists
            ESave.Load(0).OnComplete(saveState =>
            {
                // Set the position data if it exists
                if (saveState != null && saveState.HasData(playerTransformID))
                {
                    // Get the saved data
                    saveState.GetData<SavableTransform>(playerTransformID).OnComplete(result =>
                    {
                        // Since character controller is used, it needs to be disabled before setting the position
                        var characterController = playerTransform.GetComponent<CharacterController>();
                        characterController.enabled = false;

                        // Set the position and rotation
                        playerTransform.SetPositionAndRotation(result.Position, result.Rotation);

                        // Now we can reenable the character controller
                        characterController.enabled = true;
                    });
                }
            });

            // Loading a value from player settings
            var settings = ESave.GetPlayerSettings();

            if (settings.HasData(mySettingID))
            {
                settings.GetData<string>(mySettingID).OnComplete(result =>
                {
                    Debug.Log($"Loaded from player settings: {result}");
                });
            }

            // The commented method below will only work if multithread method is set to disabled
            //var saveState = ESave.Load(0).Result;

            //if (saveState != null && saveState.HasData(playerTransformID))
            //{
            //    var data = saveState.GetData<SavableTransform>(playerTransformID).Result;
            //    var characterController = playerTransform.GetComponent<CharacterController>();
            //    characterController.enabled = false;
            //    playerTransform.SetPositionAndRotation(data.Position, data.Rotation);
            //    characterController.enabled = true;
            //}

            //var settings = ESave.GetPlayerSettings();
            //Debug.Log(settings.GetData<string>(mySettingID).Result);
        }

        /// <summary>
        /// Deletes the save.
        /// </summary>
        public void DeleteSave()
        {
            // Delete the save state with the ID 0 if it exists
            ESave.DeleteSave(0);

            // Unloading the active save state is optional
            // Active save state explanation: the active save state is a copy of the last loaded save state. The
            // purpose of it is so that when the player is playing through the game, the active save state (the
            // copy) is the one being updated instead of the original until ESave.Save is called. This allows
            // the original to be loaded once again without any edits made to it if ESave.Save was not called.
            ESave.Unload();
        }
    }
}

Last updated