Allright the whole save and load thing …
using System.Collections;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using UnityEngine;
public class SaveLayoutManager : MonoBehaviour
{
private static SaveLayoutManager slm;
public List<SaveableSectiesAlgemeen> SectionsSaveLijst { get; private set; }
public static SaveLayoutManager Save_Layout_Manager
{
get
{
if (slm == null)
{
slm = GameObject.FindObjectOfType<SaveLayoutManager>();
}
return slm;
}
}
void Awake()
{
SectionsSaveLijst = new List<SaveableSectiesAlgemeen>();
}
public void Save()
{
string huidigeSceneNaam = SceneManager.GetActiveScene().name;
int aantal_in_SaveLijst = SectionsSaveLijst.Count;
// aantal objecten in savefile opslaan onder huidige scene naam
PlayerPrefs.SetInt(huidigeSceneNaam, aantal_in_SaveLijst);
for( int i = 0; i < SectionsSaveLijst.Count; i++)
{
SectionsSaveLijst[i].Save(i); // roept de savefunctie aan welke bij het specifieke GamObject in SectiesSaveLijst hoort, zie Save() in SaveableSectiesAlgemeen
}
}
public void Load()
{
// Eerst alle bestaande Saveables verwijderen en SaveLijst leegmaken
foreach (SaveableSectiesAlgemeen obj in SectionsSaveLijst)
{
print("Gevonden voor Destroy: " + obj);
if (obj != null)
{
Destroy(obj.gameObject);
}
}
SectionsSaveLijst.Clear();
// Alle objecten inladen uit de savefile
int aantal_in_SaveLijst = PlayerPrefs.GetInt(SceneManager.GetActiveScene().name); // eerst totaal aantal ophalen opgeslagen onder huidige scene naam
for (int i = 0; i < aantal_in_SaveLijst; i++)
{
string huidigeSceneNaam = SceneManager.GetActiveScene().name;
string index = i.ToString();
string kenmerk_van_save = huidigeSceneNaam + "-" + index;
string savestring_compleet = PlayerPrefs.GetString(kenmerk_van_save); // haalt "scenenaam-i" uit save
string[] savestring_opgeknipt = savestring_compleet.Split('#');
GameObject objectType = null;
switch (savestring_opgeknipt[0]) // index [0] = objecttype (Enum)
{
case "Frame_0":
objectType = Instantiate(Resources.Load("Frame_0") as GameObject);
break;
case "Frame_1":
objectType = Instantiate(Resources.Load("Frame_1") as GameObject);
break;
case "Frame_2":
objectType = Instantiate(Resources.Load("Frame_2") as GameObject);
break;
case "Frame_3":
objectType = Instantiate(Resources.Load("Frame_3") as GameObject);
break;
case "Frame_4":
objectType = Instantiate(Resources.Load("Frame_4") as GameObject);
break;
case "Frame_5":
objectType = Instantiate(Resources.Load("Frame_5") as GameObject);
break;
case "Frame_6":
objectType = Instantiate(Resources.Load("Frame_6") as GameObject);
break;
case "Frame_7":
objectType = Instantiate(Resources.Load("Frame_7") as GameObject);
break;
case "Frame_8":
objectType = Instantiate(Resources.Load("Frame_8") as GameObject);
break;
}
if(objectType!= null)
{
objectType.GetComponent<SaveableSectiesAlgemeen>().Load(savestring_opgeknipt);
}
else print("Enum ObjectType staat niet in beschibare lijst met Enum om te laden.");
}
}
public Vector3 TekstNaarVectorOmzetten(string tekst)
{ // string is bijv. (3, 6, 12)
tekst = tekst.Trim(new char[] { '(', ')' }); // haakjes om de tekst weghalen
tekst = tekst.Replace(", ", "#"); // komma-spaties er tussenuit halen en vervangen door #
string[] tekst_gesplitst = tekst.Split('#'); // opsplitsen in array van waardes, splitsen op #
// floats maken van strings
float x = float.Parse(tekst_gesplitst[0]);
float y = float.Parse(tekst_gesplitst[1]);
float z = float.Parse(tekst_gesplitst[2]);
return new Vector3(x, y, z);
}
public Quaternion TekstNaarRotatie(string tekst)
{ // string is bijv. (90, 0, 0)
tekst = tekst.Trim(new char[] { '(', ')' }); // haakjes om de tekst weghalen
tekst = tekst.Replace(", ", "#"); // komma-spaties er tussenuit halen en vervangen door #
string[] tekst_gesplitst = tekst.Split('#'); // opsplitsen in array van waardes, splitsen op #
// floats maken van strings
float x = float.Parse(tekst_gesplitst[0]);
float y = float.Parse(tekst_gesplitst[1]);
float z = float.Parse(tekst_gesplitst[2]);
float w = float.Parse(tekst_gesplitst[3]);
return new Quaternion(x, y, z, w);
}
}
Abstract Class for the saveable objects:
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;
enum ObjectType { Frame_0, Frame_1, Frame_2, Frame_3, Frame_4, Frame_5, Frame_6, Frame_7, Frame_8} // selecteerbaar via inspector
public abstract class SaveableSectiesAlgemeen : MonoBehaviour // abstract, kan niet aan gameobject gekoppeld worden
{ // Deze class bevat alle algemene functrionaliteit voor objecten
protected string object_specifieke_eigenschappen;
[SerializeField]
private ObjectType objectType;
private void Awake() // in dit geval Awake.
{
// Indien objecten bij de start van het spel al aanwezig zijn moet dit in de 'Start' worden opgenomen!!!
// De lijst wordt al onder 'Awake' aangemaakt.
SaveLayoutManager.Save_Layout_Manager.SectionsSaveLijst.Add(this);
}
public virtual void Save(int indexnummer) // vitual, wordt later in specifieke scrip overruled
{
string huidigeSceneNaam = SceneManager.GetActiveScene().name;
string index = indexnummer.ToString();
string kenmerk_van_save = huidigeSceneNaam + "-" + index;
PlayerPrefs.SetString(kenmerk_van_save, objectType + "#" + transform.position.ToString() + "#" + transform.localRotation.ToString() + "#" + object_specifieke_eigenschappen); // # is deelteken!
}
public virtual void Load(string[] tekst_data_gesplitst) // vitual, wordt later in specifieke scrip overruled
{
transform.localPosition = SaveLayoutManager.Save_Layout_Manager.TekstNaarVectorOmzetten(tekst_data_gesplitst[1]);
transform.localRotation = SaveLayoutManager.Save_Layout_Manager.TekstNaarRotatie(tekst_data_gesplitst[2]);
}
public void DestroySaveable()
{
SaveLayoutManager.Save_Layout_Manager.SectionsSaveLijst.Remove(this);
Destroy(gameObject);
}
}
And for the saveable object specific:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SaveableSectieSpecifiek : SaveableSectiesAlgemeen // <<<< LET OP: dit script is gabaseerd op SaveableSectieAlgemeen srcipt!!
{ // Deze class bevat alle specifieke functionaliteit voor dit specifieke object
[SerializeField]
private float damage;
[SerializeField]
private float strength;
public override void Save(int index)
{
object_specifieke_eigenschappen = damage.ToString() + "#" + strength.ToString();
base.Save(index); // Haalt vervolgens de "base" Save functie uit SaveableSectiesAlgemeen script
}
public override void Load(string[] tekst_data_gesplitst)
{
damage = float.Parse(tekst_data_gesplitst[3]);
strength = float.Parse(tekst_data_gesplitst[4]);
base.Load(tekst_data_gesplitst); // Haalt vervolgens de "base" Load functie uit SaveableSectiesAlgemeen script
}
}