講完備忘錄模式,接下來實作存讀檔
測試結果:
這篇實作融合了前幾篇模式和實作,除了備忘錄模式外有用到單例模式、觀察者模式、無限循環選單、還有Json加密存檔,可以順便練習
連結:
這個地方會承接無限循環選單來實作
先列出備忘錄模式的各個重要類別
Originator(紀錄擁有者): GameManager.cs
這裡的紀錄擁有者為GM物件,存檔資料由序列化在Inspector上來做輸入和讀取觀察,設定紀錄和取回Memento(紀錄保存者)的方法,這裡用單例確保紀錄擁有者和Caretaker(管理紀錄保持者)的單一性
Memento(紀錄保存者):PlayerData
必須由紀錄擁有者主動設定及取用
Caretaker(管理紀錄保持者):PlayerDataSaver.cs
管理Originator(紀錄擁有者)所給的Memento(紀錄保存者),利用Dictionary來保存各個紀錄的檔案其他資訊(存檔點、檔案位置、存檔時間..用class做資訊),且存檔當下的資訊會用PlayerPrefs存起來
參數:※以下參數為PlayerPrefs存下,內容有:存檔點名字、存檔時當下時間和存檔資料位置(路徑)
- PlayerPrefs存檔要有Key(標籤)和Value(內容),以下分Key和Value來做解釋
Value:testSavePointer(存檔的存檔點名字)
Key:SaveTimeVal(存檔當下時間的前頭名,例:"SaveTime001",SaveTime是前頭名,001為編號)
Key:SavePointerVal(存檔點的前頭名,例:"SavePointer001")
Key:DataPathVal(存檔資料路徑的前頭名,例:"PlayerData001")
dataPath(路徑的根路徑,例:"/PlayerData/PlayerData001",其實就是PlayerData資料夾地下的PlayerData001存檔資料,001為編號)
saveCount(存檔資料總數)
這裡用delegate和event做觀察者模式來為各存檔按鈕資料更新做訂閱,關於觀察者模式可參考觀察者模式
m_PlayerInfo來儲存各個存檔資料的外部資訊(存檔點名字、存檔時當下時間和存檔資料路徑)
DataInit函式:初始m_PlayerInfo,由PlayerPrefs.GetString取得
AddUpdateEventListioner函式:各存檔按鈕資料更新訂閱方法
RemoveUpdateEventListioner函式:各存檔按鈕資料更新退訂閱方法
UpdateNotify函式:通知各存檔按鈕資料更新方法
AddPlayerData函式:存檔方法,傳入資料編號和紀錄保存者,呼叫SaveDataInfo,取得存檔外部資訊,並記錄
SaveDataInfo函式:對紀錄保存者坐內部加密存檔(GameDataManager.Save(string,PlayerData)是沿用Json加密存檔),並取得外部資訊
GetPlayerData函式:讀檔方法(GameDataManager.Load(string,Type)是沿用Json加密存檔),取得紀錄保存者
GetSaveInfo函式:取得存檔檔案外部資訊
ClearRecode函式:清空所有存檔資料(內部外部),然後通知按鈕資訊更新
按鈕設置:此為無限循環選單的延伸
參數:
Colors:已存檔與未存檔的顏色區別
index:此按鈕編號(也是存檔資料的編號)
indexInit:編號使否初始
m_SaveDataPath:存檔路徑
btnComponent,ImgComponent,textComponet:項目的各個Component
Awake做按鈕外部資訊更新的註冊(觀察者模式),初始項目的各個Component
SetItem函式:項目設置方法(更新資訊也是調用此方法),初始編號並設置項目的外部資訊,
如果還沒存檔(沒有存檔路徑資訊),替按鈕監聽存檔方法,意思就是還沒存檔的按鈕按下後,會執行存檔方法
反之,如果還已經存檔(有存檔路徑資訊),替按鈕監聽讀檔方法,意思就是已存檔的按鈕按下後,會執行讀檔方法
最後替按鈕監聽此函式,為項目做更新