close

講完備忘錄模式,接下來實作存讀檔

測試結果:

這篇實作融合了前幾篇模式和實作,除了備忘錄模式外有用到單例模式、觀察者模式、無限循環選單、還有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函式:項目設置方法(更新資訊也是調用此方法),初始編號並設置項目的外部資訊,

如果還沒存檔(沒有存檔路徑資訊),替按鈕監聽存檔方法,意思就是還沒存檔的按鈕按下後,會執行存檔方法

反之,如果還已經存檔(有存檔路徑資訊),替按鈕監聽讀檔方法,意思就是已存檔的按鈕按下後,會執行讀檔方法

最後替按鈕監聽此函式,為項目做更新

 

 

 

arrow
arrow

    Kouhei 發表在 痞客邦 留言(0) 人氣()