- Home /
How to Load a specific SaveGame from a buttonclick
The question is as the title, I apologise for the "write this code for me" appearance of this question but I cannot figure out how to set this up. Here are the classes relevant to the functionality I want
[System.Serializable]
public class PlayerSaveData
{
public static PlayerSaveData current;
public int Money;
public int Experience;
}
public static class PlayerSaveManager
{
public static List<PlayerSaveData> SavedGames = new List<PlayerSaveData>();
public static void Save()
{
SavedGames.Add(PlayerSaveData.current);
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create (Application.persistentDataPath + "/savedGames.gd");
bf.Serialize(file, PlayerSaveManager.SavedGames);
file.Close();
}
public static void Load()
{
if(File.Exists(Application.persistentDataPath + "/savedGames.gd"))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "/savedGames.gd", FileMode.Open);
PlayerSaveManager.SavedGames = (List<PlayerSaveData>)bf.Deserialize(file);
file.Close();
}
}
}
I have an empty scene with a Panel with vertical layout group. I execute the following code on a gameobject with a script attached with an Awake() method as follows
public Button LoadSaveGameButton;
void Awake()
{
Instantiate (LoadSaveGameButton);
PlayerSaveManager.Load();
Debug.Log ("Player Saves count: " + PlayerSaveManager.SavedGames.Count);
var saveLoadDataPanel = GameObject.Find ("SaveLoadDataPanel");
foreach (var saveGame in PlayerSaveManager.SavedGames)
{
Button button = (Button)Instantiate (LoadSaveGameButton);
button.transform.SetParent(saveLoadDataPanel.transform);
MakeItSoThatIfTheButtonIsClickedItWillLoadTheSavedDataAssociatedWithThisButtonIntoPlayerSaveDataCurrent();
}
}
The buttons appear in the hierarchy as desired but they have no functionality when clicked obviously
What I need is for how to actually implement my ronseal method "make it so that if the button is clicked it will load the saved data associated with this button into player save data current"
MakekeItSoThatIfTheButtonIsClickedItWillLoadTheSavedDataAssociatedWithThisButtonIntoPlayerSaveDataCurrent()
{
//CodeGoesHere
}
Edit: For Completeness sake i've added a picture of my scene after the method has run and the buttons have been created
Answer by Oliver1135 · Jan 01, 2015 at 04:17 AM
I actually found the answer right after I posted this. I'm not sure how I feel about this.
My end (working) code is as follows
void Awake()
{
Instantiate (LoadSaveGameButton);
PlayerSaveManager.Load();
Debug.Log ("Player Saves count: " + PlayerSaveManager.SavedGames.Count);
var saveLoadDataPanel = GameObject.Find ("SaveLoadDataPanel");
foreach (var saveGame in PlayerSaveManager.SavedGames)
{
Button button = (Button)Instantiate (LoadSaveGameButton);
button.transform.SetParent(saveLoadDataPanel.transform);
button.GetComponent<Button>().onClick.AddListener(() => { ButtonClickLoadSaveGame(saveGame);});
}
}
void ButtonClickLoadSaveGame (PlayerSaveData saveGame)
{
PlayerSaveData.current = saveGame;
Debug.Log ("Loaded Game");
}