[SOLVED] Save System with Serialize multiple objects

I’m trying to create a complex save system that, when you save, serializes every data of the game.

I saw this tutorial: Unity 5 Tutorial Save System - YouTube and it helps me so much for saving player position.

Now i want to do something else: i want save all doors state, so if a door is open and i save, when i load the game that door will be open. Anyway in the map there are more doors, and i’m trying to save all of them.

Obviously i don’t want create one var for every doors in the game, so i want call them with GameObject.FindGameObjectsWithTag (“name of tag”). But i can’t create only one var because this one will be the same for every door.

So my question is: how can i create multiple serialized strings and how can i call them, linking these with each respective door?

Probably best to store them in an array if each door has a number you’d only need a boolean array to say if it’s open or shut.

Save that array when you exit and load it when you startup and set the doors respectively.

I solve it, look the new script:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine.SceneManagement;

public class SaveSystem : MonoBehaviour {

	GameObject player;
	GameObject cam;
	GameObject start;
	GameObject[] doors;
	GameObject[] slideSDoors;

	Start_Scene startScript;

	private Scene scene;

	private int doorsCount;
	private int slideSDoorsCount;
	private int totalDoorsCount;

	void Start()
	{
		player = GameObject.Find ("PlayerController");
		cam = GameObject.Find ("Camera");
		start = GameObject.Find ("Start Scene");
		doors = GameObject.FindGameObjectsWithTag ("Door");
		slideSDoors = GameObject.FindGameObjectsWithTag ("SlideSecretDoor");

		startScript = start.GetComponent<Start_Scene> ();

		doorsCount = doors.Length;
		slideSDoorsCount = slideSDoors.Length;
		totalDoorsCount = doorsCount + slideSDoorsCount;
	}

	public void SaveData () 
	{
		BinaryFormatter bf = new BinaryFormatter ();
		FileStream file = File.Create (Application.persistentDataPath + "/Data.dat");
		PlayerData data = new PlayerData ();

		data.doorState = new string[totalDoorsCount];
		data.lockState = new string[totalDoorsCount];

		for (int i = 0; i <= totalDoorsCount; i++)
		{
			foreach (GameObject door in doors) 
			{
				Rotating_Normal_Door doorScript = door.GetComponent<Rotating_Normal_Door> ();

				if (doorScript.doorID == i) 
				{
					data.doorState [doorScript.doorID - 1] = doorScript.doorState;
					data.lockState [doorScript.doorID - 1] = doorScript.lockState;
				}
			} 
		}

		for (int i = 0; i <= totalDoorsCount; i++) 
		{
			foreach (GameObject slideSDoor in slideSDoors) 
			{
				Sliding_Secret_Door slideSecretScript = slideSDoor.GetComponent<Sliding_Secret_Door> ();

				if (slideSecretScript.doorID == i) 
				{
					data.doorState [slideSecretScript.doorID - 1] = slideSecretScript.doorState;
					data.lockState [slideSecretScript.doorID - 1] = slideSecretScript.lockState;
				}
			} 
		}

		scene = SceneManager.GetActiveScene ();
		data.sceneName = scene.name;

		data.posx = player.transform.position.x;
		data.posy = player.transform.position.y;
		data.posz = player.transform.position.z;

		data.rotx = cam.transform.localRotation.x;
		data.roty = cam.transform.localRotation.y;
		data.rotz = cam.transform.localRotation.z;
		data.rotw = cam.transform.localRotation.w;

		bf.Serialize (file, data);
		file.Close ();
	}

	public void LoadData()
	{
		if(File.Exists (Application.persistentDataPath + "/Data.dat"))
		{
			BinaryFormatter bf = new BinaryFormatter ();
			FileStream file = File.Open (Application.persistentDataPath + "/Data.dat", FileMode.Open);
			PlayerData data = (PlayerData)bf.Deserialize (file);

			file.Close ();

			PlayerPrefs.DeleteAll ();

			SceneManager.LoadScene (data.sceneName, LoadSceneMode.Single);

			Vector3 newPlayerPos = new Vector3 (data.posx, data.posy, data.posz);
			Quaternion newPlayerRot = new Quaternion (0, data.roty, 0, data.rotw);

			startScript.LoadDataState (newPlayerPos, newPlayerRot);

			for (int i = 0; i <= totalDoorsCount; i++)
			{
				foreach (GameObject door in doors) 
				{

					Rotating_Normal_Door doorScript = door.GetComponent<Rotating_Normal_Door> ();

					if (doorScript.doorID == i) 
					{
						doorScript.LoadData (data.doorState [doorScript.doorID - 1], data.lockState [doorScript.doorID - 1]);
					}
				} 
			}

			for (int i = 0; i <= totalDoorsCount; i++)
			{
				foreach (GameObject slideSDoor in slideSDoors) 
				{
					Sliding_Secret_Door slideSecretScript = slideSDoor.GetComponent<Sliding_Secret_Door> ();

					if (slideSecretScript.doorID == i) 
					{
						slideSecretScript.LoadData (data.doorState [slideSecretScript.doorID - 1], data.lockState [slideSecretScript.doorID - 1]);
					}
				} 
			}
		}
	}
}

[Serializable]
class PlayerData
{
	public string sceneName;

	public float posx;
	public float posy;
	public float posz;

	public float rotx;
	public float roty;
	public float rotz;
	public float rotw;

	public string[] doorState;
	public string[] lockState;
}

using the Arrays and adding different IDs for each door i solved my problem

thanks for support