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 exists
GameObjectSave.sceneData.Remove(Settings.PersistentScene);
// Create new scene save
SceneSave sceneSave = new SceneSave();
// Create new int dictionary
sceneSave.intDictionary = new Dictionary<string, int>();
// Create new string dictionary
sceneSave.stringDictionary = new Dictionary<string, string>();
// Add values to the int dictioanry
sceneSave.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 dictionary
sceneSave.stringDictionary.Add("gameDayOfWeek", gameDayOfWeek);
sceneSave.stringDictionary.Add("gameSeason", gameSeason.ToString());
// Add scene save to game object for persistent scene
GameObjectSave.sceneData.Add(Settings.PersistentScene, sceneSave);
return GameObjectSave;
}
public void ISaveableLoad(GameSave gameSave)
{
// Get saved gameobject from gameSave data
if(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave))
{
GameObjectSave = gameObjectSave;
// Get savedscene data for gameObject
if(GameObjectSave.sceneData.TryGetValue(Settings.PersistentScene, out SceneSave sceneSave))
{
// if int and string dictionaries are found
if(sceneSave.intDictionary != null && sceneSave.stringDictionary != null)
{
// populate saved int values
if(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 values
if(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 gametick
gameTick = 0f;
// Trigger advance minute event
EventHandler.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,时间恢复到重启前的数据。