How to save multiple scenes' data

I want to create small project (it’s basically project to test and learn how serialization and saving work). Project will have scenes for three battle arenas (they won’t be identical), shop, main hub, etc. and things like character progression through upgrade system and customization.
And I want to save that data as one file.
Battle arenas will save which enemies were killed and additional stuff like collected collectibles. Shop will store actuall items available to buy.
Can you explain this like to person who don’t program on daily basic and ain’t familiar with advanced C# concepts.

Assuming this is single player and you just want to save on the device you can use PlayerPrefs.
This will save data locally to the device, you can set data, then read it back later. Here is an example of a few things you could do.

Of course you have to put them in the right places. I might start with a script in your first scene that sets all the keys to the default values:

FIRST SCENE INITIALIZATION MONOBEHAVIOR
void Awake()
    {
        if (!PlayerPrefs.HasKey("DefaultsSet")){
            PlayerPrefs.SetString("DefaultsSet","True");

            //Player Specific Values
            PlayerPrefs.SetString("Player:Name","Jerry");
            PlayerPrefs.SetInt("Player:Coins",0);
            PlayerPrefs.SetInt("Player:ProgressLevel",0);
            PlayerPrefs.SetInt("Player:EquippedGunId",0);
            PlayerPrefs.SetInt("Player:EquippedHelmetId",0);

            //Shop Values (
            PlayerPrefs.SetString("Shop:Purchased:Gun0","True");
            PlayerPrefs.SetString("Shop:Purchased:Gun1","False");
            PlayerPrefs.SetString("Shop:Purchased:Gun2","False");

            PlayerPrefs.SetString("Shop:Purchased:Helmet0","True");
            PlayerPrefs.SetString("Shop:Purchased:Helmet1","False");
            PlayerPrefs.SetString("Shop:Purchased:Helmet2","False");

        }
    }

Then in your shop, you can show Gun2 the store like this:

SHOP INITIALIZATION MONOBEHAVIOR
int gunCosts = [0,30,100];
int helmetCosts = [0,30,100];

void Start()
    {
        if (PlayerPrefs.GetString("Shop:Purchased:Gun1") == "True"){
            //This gun is unlocked and equip-able, so you can change its sprite to the 'unlocked sprite'
            //You also can add a click-listener to go to the function EquipGun(1)
            //Which would do PlayerPrefs.SetInt("Player:EquippedGunId",1);
        } else if (PlayerPrefs.GetInt("Player:Coins") > gunCosts[1]) { 
           //This gun is not unlocked, but can be because you have over gun[1] coins
           //Here you could add change the sprite to make the button look 'unlock-able' or 'purchasable'
            //You also can add a click-listener to go to the function PurchaseGun(1)
        } else {
          //This gun is not unlocked and you do not even have enough money to do so
         // Here you can change the sprite of the button to be like a 'locked' button, and have
         // A Click listener that just tells the user they don't have the cash to buy it
        }
    }

void PurchaseItem(int gunId) {
       //Remove coins from player
       PlayerPrefs.SetInt("Player:Coins", PlayerPrefs.GetInt("Player:Coins") - gunCosts[gunId] );
       //Unlock gun
      PlayerPrefs.SetString("Shop:Purchased:Gun"+gunId.ToString(),"True");
       //Equip gun
       PlayerPrefs.SetInt("Player:EquippedGunId",gunId);
 }

That was my sloppy 10 min attempt. Hope there are no typos and that points you in the right direction!

I don’t know how to store data inside one class. One of my ideas is to create “SceneData” classes that holds important data and make “SaveData” class that hold SceneData like

   [System.Serializable]
    public class SaveData {
    	public ArenaSceneData[] arenaSceneDatas;
    	public ShopSceneData ShopSceneData;
    	public ProgressionData progressionData;
    	public CustomizationData customizationData;
    }
    
    [System.Serializable]
    public class ArenaSceneData {
    	public GameObject killedEnemies;
    	public Collectibles collectedCollectibles;
    }
    
    [System.Serializable]
    public class ShopSceneData {
    	public Item[] aviableItems;
    }
    
    [System.Serializable]
    public class ProgressionData {
    	public int level;
    	public int exp;
    	public SkillTree acctualSkillTree;
    }
    
    [System.Serializable]
    public class CustomizationData {
    	public string playerName;
    	public Color playerColor;
    }

But this aproach isn’t quite good because every Arena will need to have index, and if project will get bigger this would be a mess