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.
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.
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.
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:
- Player reaches checkpoint OR presses save button.
- Collect all game data into saveData object.
- Convert to JSON string.
- Save JSON string with PlayerPrefs.
- Show "Game Saved" message.
Load Flow:
- Game starts OR player presses load button.
- Check if save exists.
- Get JSON string from PlayerPrefs.
- Convert back to saveData object.
- Apply values to player, inventory, etc.
- Show "Game Loaded" message.