Advertisement

SaveGameManager.Instance.SaveableObjects.Add(this); does not add to the list

Started by March 04, 2017 01:00 PM
-1 comments, last by Phil53 7 years, 11 months ago

i got 3 script for my save and load object which are SaveableObject script, SpecificObject script and SaveGameManager script. The Specific Object is inherited from the saveableobject. The problem that i facing now is my Saveable object does not add to my saveable object list i dont know what is the problem for this occuring. When i attach my specificObject script into the gameObject.It does not add to my SavebleObject list. SaveGameManager.Instance.SaveableObjects.Add(this); does not add my Saveable object list into the game. Can someone tell me what i went wrong. Appreciate that.


using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;


enum ObjectType { mario, bird, rabbit }

public abstract class SaveableObject : MonoBehaviour
{
    
    protected string save;

    [SerializeField]
    private ObjectType objectType;

   public void Start()
    {
        
        SaveGameManager.Instance.SaveableObjects.Add(this);
        
       // PlayerPrefs.SetInt("Health", 30);
    }

    public virtual void Save(int id)
    {

        PlayerPrefs.SetString(SceneManager.GetActiveScene().ToString()+ "-" + id.ToString(),objectType +"_" + transform.position.ToString() + "_" + transform.localScale + "_" + transform.localRotation +save);
      //  int health = PlayerPrefs.GetInt("Health");
    }

    public virtual void Load(string[]values)
    {
        transform.localPosition = SaveGameManager.Instance.StringToVector(values[1]);
        transform.localScale = SaveGameManager.Instance.StringToVector(values[2]);
        transform.localRotation = SaveGameManager.Instance.StringToQuaternion(values[3]);
       // int health = PlayerPrefs.GetInt("Health");
    }

    public void DestroySaveable()
    {
        SaveGameManager.Instance.SaveableObjects.Remove(this);
        Destroy(gameObject);
    }

    
} 

First one is my SaveableObject Script

Second is my SaveGameManager Script

Third is my Specific Object Script


public class SaveGameManager : MonoBehaviour {

    private static SaveGameManager instance;

    public  List<SaveableObject> SaveableObjects { get; private set; } 

    public  static SaveGameManager Instance
    {
        get
        {   if(instance == null)
            {
                instance = GameObject.FindObjectOfType<SaveGameManager>();
            }
            return instance;
        }

    }

    void Awake ()
    {
        SaveableObjects = new List<SaveableObject>();
	}
	
    public void Save()
    {
        PlayerPrefs.SetFloat(SceneManager.GetActiveScene().ToString(), SaveableObjects.Count);
        for(int i = 0; i <SaveableObjects.Count; i++)
        {
            SaveableObjects[i].Save(i);
        }
    }
	
    public void Load()
    {
        foreach(SaveableObject obj  in SaveableObjects)
        {
            if(obj !=null)
            {
                Destroy(obj.gameObject);
            }
        }

        SaveableObjects.Clear();

        int objectCount = PlayerPrefs.GetInt(SceneManager.GetActiveScene().ToString());

        for(int i= 0; i< objectCount; i++)
        {
            string[] value = PlayerPrefs.GetString(SceneManager.GetActiveScene().ToString() +"-" + i.ToString()).Split('_');
            GameObject tmp = null;
            switch (value[0])
            {
                case "Mario":
                    tmp = Instantiate(Resources.Load("mario") as GameObject);
                    break;
                case "Bird":
                    tmp =  Instantiate(Resources.Load("bird") as GameObject);
                    break;
                case "Rabbit":
                    tmp = Instantiate(Resources.Load("rabbit") as GameObject);
                    break;
            }
            
                   if(tmp !=null)
            {
                tmp.GetComponent<SaveableObject>().Load(value);
            }
           


        }
    }

    public Vector3 StringToVector(string value)
    {

        value = value.Trim(new char[] {'(',')' });

        value = value.Replace("", "");

        string[] pos = value.Split(',');

        return new Vector3(float.Parse(pos[0]), float.Parse(pos[1]),float.Parse(pos[2]));
    }

    public Quaternion StringToQuaternion(string value)
    {
        value = value.Trim(new char[] { '(', ')' });

        value = value.Replace("", "");

        string[] pos = value.Split(',');

        return new Quaternion(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]),float.Parse(pos[3]));
    }
	
}


using UnityEngine;
using System.Collections;

public class SpecificObject : SaveableObject {

    //private float speed;
    [SerializeField]
    private int health;

    private void Update()
    {

    }



    public override void Save(int id)
    {
        save = health.ToString();
        base.Save(id);
    }

    public override void Load(string[] values)
    {
        health = int.Parse(values[4]);
        base.Load(values);
    }
}

This topic is closed to new replies.

Advertisement