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