Saving and Loading Game Data In Unity

Last Updated : 4 May, 2026

Saving and loading game data in Unity allows developers to store player progress, scores, and game states so they can be restored later. This ensures a seamless gameplay experience by preserving important data between sessions. Game data includes everything that defines the player's current progress:

  • Player position, health, score.
  • Inventory items and ammo.
  • Level number and quest progress.
  • Enemy states and collectibles collected.

Creating a Save Data Class

First, create one class that holds everything you want to save.

C#
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class GameSaveData
{
    // Player stats
    public int health;
    public int score;
    public int ammo;
    // Player position
    public float posX, posY, posZ;
    // Inventory
    public List<string> inventoryItems;
    // Level progress
    public int currentLevel;
    public bool[] completedLevels;
}

All variables you add here will be saved. Add [System.Serializable] above the class.

Complete Save Manager Script

This script handles saving and loading everything.

C#
using UnityEngine;
using System.Collections.Generic;
public class SaveManager : MonoBehaviour
{
    public GameSaveData saveData;
    public GameObject player;
    public Inventory playerInventory;
    void Update()
    {
        // Press S to save, L to load
        if (Input.GetKeyDown(KeyCode.S))
        {
            SaveGame();
        }
        
        if (Input.GetKeyDown(KeyCode.L))
        {
            LoadGame();
        }
    }
    public void SaveGame()
    {
        // Collect current game data
        saveData.health = player.GetComponent<Health>().currentHealth;
        saveData.score = player.GetComponent<Score>().currentScore;
        saveData.ammo = player.GetComponent<Ammo>().currentAmmo;
        // Save position
        saveData.posX = player.transform.position.x;
        saveData.posY = player.transform.position.y;
        saveData.posZ = player.transform.position.z;
        // Save inventory
        saveData.inventoryItems = playerInventory.GetItemList();
        // Convert to JSON
        string json = JsonUtility.ToJson(saveData);
        // Save to PlayerPrefs
        PlayerPrefs.SetString("GameSave", json);
        PlayerPrefs.Save();
        
        Debug.Log("Game Saved!");
    }
    public void LoadGame()
    {
        // Check if save exists
        if (PlayerPrefs.HasKey("GameSave"))
        {
            // Get JSON and convert back
            string json = PlayerPrefs.GetString("GameSave");
            saveData = JsonUtility.FromJson<GameSaveData>(json);
            // Apply to game
            player.GetComponent<Health>().currentHealth = saveData.health;
            player.GetComponent<Score>().currentScore = saveData.score;
            player.GetComponent<Ammo>().currentAmmo = saveData.ammo;
            // Apply position
            player.transform.position = new Vector3(saveData.posX, saveData.posY, saveData.posZ);
            // Apply inventory
            playerInventory.LoadItemList(saveData.inventoryItems);
            Debug.Log("Game Loaded!");
        }
        else
        {
            Debug.Log("No save file found");
        }
    }
}

Delete Save File (New Game)

Add a reset option to clear saved data.

C#
public void NewGame()
{
    // Delete saved data
    PlayerPrefs.DeleteKey("GameSave");
    // Reset all game values to default
    player.GetComponent<Health>().currentHealth = 100;
    player.GetComponent<Score>().currentScore = 0;
    player.transform.position = startPosition;
    playerInventory.ClearInventory();
    Debug.Log("New Game Started - Save deleted");
}

Complete Save System Flow

Save Flow:

  1. Player reaches checkpoint OR presses save button.
  2. Collect all game data into saveData object.
  3. Convert to JSON string.
  4. Save JSON string with PlayerPrefs.
  5. Show "Game Saved" message.

Load Flow:

  1. Game starts OR player presses load button.
  2. Check if save exists.
  3. Get JSON string from PlayerPrefs.
  4. Convert back to saveData object.
  5. Apply values to player, inventory, etc.
  6. Show "Game Loaded" message.
Comment
Article Tags:

Explore