Unity3D仿星露谷物语开发58之保存时钟信息到文件
1、目标
保存当前的时钟信息到文件中。
2、修改TimeManager对象
TimeManager对象添加组件:Generate GUID
3、修改SceneSave.cs脚本
添加1行代码:
4、修改TimeManager.cs脚本
添加:
using System;
修改TimeManager类:
添加属性:
private string _iSaveableUniqueID;public string ISaveableUniqueID { get { return _iSaveableUniqueID; } set { _iSaveableUniqueID = value; } }private GameObjectSave _gameObjectSave;public GameObjectSave GameObjectSave { get { return _gameObjectSave; } set { _gameObjectSave = value; } }
添加方法:
protected override void Awake(){base.Awake();ISaveableUniqueID = GetComponent<GenerateGUID>().GUID;GameObjectSave = new GameObjectSave();}private void OnEnable(){ISaveableRegister();EventHandler.BeforeSceneUnloadEvent += BeforeSceneUnloadFadeOut;EventHandler.AfterSceneLoadEvent += AfterSceneLoadFadeIn;}private void OnDisable(){ISaveableDeregister();EventHandler.BeforeSceneUnloadEvent -= BeforeSceneUnloadFadeOut;EventHandler.AfterSceneLoadEvent -= AfterSceneLoadFadeIn;}private void BeforeSceneUnloadFadeOut(){gameClockPaused = true;}private void AfterSceneLoadFadeIn(){gameClockPaused = false;}public void ISaveableRegister(){SaveLoadManager.Instance.iSaveableObjectList.Add(this);}public void ISaveableDeregister(){SaveLoadManager.Instance.iSaveableObjectList.Remove(this);}public GameObjectSave ISaveableSave(){// Delete existing scene if existsGameObjectSave.sceneData.Remove(Settings.PersistentScene);// Create new scene saveSceneSave sceneSave = new SceneSave();// Create new int dictionarysceneSave.intDictionary = new Dictionary<string, int>();// Create new string dictionarysceneSave.stringDictionary = new Dictionary<string, string>();// Add values to the int dictioanrysceneSave.intDictionary.Add("gameYear", gameYear);sceneSave.intDictionary.Add("gameDay", gameDay);sceneSave.intDictionary.Add("gameHour", gameHour);sceneSave.intDictionary.Add("gameMinute", gameMinute);sceneSave.intDictionary.Add("gameSecond", gameSecond);// Add values to the string dictionarysceneSave.stringDictionary.Add("gameDayOfWeek", gameDayOfWeek);sceneSave.stringDictionary.Add("gameSeason", gameSeason.ToString());// Add scene save to game object for persistent sceneGameObjectSave.sceneData.Add(Settings.PersistentScene, sceneSave);return GameObjectSave;}public void ISaveableLoad(GameSave gameSave){// Get saved gameobject from gameSave dataif(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave)){GameObjectSave = gameObjectSave;// Get savedscene data for gameObjectif(GameObjectSave.sceneData.TryGetValue(Settings.PersistentScene, out SceneSave sceneSave)){// if int and string dictionaries are foundif(sceneSave.intDictionary != null && sceneSave.stringDictionary != null){// populate saved int valuesif(sceneSave.intDictionary.TryGetValue("gameYear", out int savedGameYear)){gameYear = savedGameYear;}if(sceneSave.intDictionary.TryGetValue("gameDay", out int savedGameDay)){gameDay = savedGameDay;}if(sceneSave.intDictionary.TryGetValue("gameHour", out int savedGameHour)){gameHour = savedGameHour;}if(sceneSave.intDictionary.TryGetValue("gameMinute", out int savedGameMinute)){gameMinute = savedGameMinute;}if(sceneSave.intDictionary.TryGetValue("gameSecond", out int savedGameSecond)){gameSecond = savedGameSecond;}// populate string saved valuesif(sceneSave.stringDictionary.TryGetValue("gameDayOfWeek", out string savedGameDayOfWeek)){gameDayOfWeek = savedGameDayOfWeek;}if(sceneSave.stringDictionary.TryGetValue("gameSeason", out string savedGameSeason)){if(Enum.TryParse<Season>(savedGameSeason, out Season season)){gameSeason = season;}}// Zero gametickgameTick = 0f;// Trigger advance minute eventEventHandler.CallAdvanceGameMinuteEvent(gameYear, gameSeason, gameDay, gameDayOfWeek, gameHour, gameMinute, gameSecond);// Refresh game clock}}}}public void ISaveableStoreScene(string sceneName){// Nothing required here since Time Manager is running on the persistent scene}public void ISaveableRestoreScene(string sceneName){// Nothing required here since Time Manager is running on the persistent scene}
5、运行游戏
运行游戏并进行相应操作,过去了一段时间,然后save game。
重启游戏后load game,时间恢复到重启前的数据。