1. 程式人生 > >Unity遊戲存檔的四種方式

Unity遊戲存檔的四種方式

遊戲存檔

在Unity中游戲存檔有如下四種方式:

  • PlayerPrefs
  • c#序列化
  • XML序列化
  • Json

遊戲存檔是老大之前吩咐要做的,一開始我問可以用PlayerPrefs不呢,銳哥老大回答說不可以,用Unity自帶的會有很多的限制。那好吧,為了自由故,我就只好研究另外的三種了。於是就上網去查別人是怎麼做存檔的(我有個習慣,如果自己是第一次做,我就會先去看別人是怎樣做的),很容易就找到了一位大大的部落格,一試之下,果然是棒棒的。於是第二天我就喜滋滋地去交差了。在銳哥的一番審視下,對我寫的存檔提出了幾點意見和要求:

1.遊戲版本的升級

2.玩家有多個存檔

3.玩家破壞存檔的情況

4.註釋太多和把玩家類再包一層等編碼的細節的建議

既然有新需求了,那咱就再加把勁繼續幹活完成任務吧!於是經過一天和晚上到凌晨的折騰,終於把需求2實現了,需求3也容易,用try catch,只要解析不正確則認為存檔被破壞。第四個也改了。而需求1的好像用這個程式碼什麼也不做也實現了。非常完美!內心激動的跟主城說這些功能都實現啦!(如果事情就到這裡,也就沒有下文了。)而後銳哥說你用的是XML麼。我說是的。這時一旁的皮皮說,你咋不用Json呢,好用又輕量。既然程式碼還可以更好,那好吧,我就再研究研究~~畢竟程式設計師對於優化都是有情結的=。=而後我採用改了c#序列化方式,既不用XML,也不用Json,而且一序列化相當於也加密了,這麼多的優點!過了一個月後,直到今天,我才發現用C#序列化的缺點,然後果斷放棄了,最後用的是Json。

下面說一說每個的優點與缺點:

  • PlayerPrefs

優點:上手簡單,儲存方便,不用考慮內部實現,適合做小遊戲的資料存檔(網上一搜,發現很多網友都是用的這種方式。

缺點:只支援基本資料型別,無法儲存一個類,陣列,集合,字典等。不過肯定是可以用一個框架來實現自動賦值的,只是感覺更麻煩一點。

  • c#序列化

優點:除了靜態型別和抽象型別以及類必須標記為[Serializable]的(其實這個不是什麼問題了),其他的都可以被序列化:類,陣列,集合,字典,類及其子類等。而且序列化之後你也看不懂是什麼鬼(哈哈)~~。

缺點:
1.不會呼叫要序列化類的建構函式(當然可以通過實現ISerializable和IDeserializationCallback介面來實現在序列化和反序列化之前對資料的處理,所以這個不是我放棄它的重點)。
2.在升級版本後,新增一個欄位也只是採用系統預設值,而不是我在類中直接賦的值,這導致我需要自己去比較當前版本和之前的每一個版本的版本號,然後再挨個處理每個以前版本的升級,就意味著當前是第N次更新,我要做N-1次if判斷並手動賦值(這段話是結合自己的專案記錄的,當然也就我看得懂了^^)。
3.而讓我放棄它的最終原因是,在升級版本後,如果刪除了之前的一個欄位,則無法正確解析(反序列化),這種情況就最不能容忍了。我不敢冒這樣的風險,保證以後的版本不會刪除其中一個欄位。或許你會想到“你可以保留啊,然後不管它就是了”,不過鑑於我有個超追求完美的boss,只好放棄。畢竟這還不如XML。

  • XML序列化

優點: 1.序列化出來的資料直觀,可以序列化類和類中的物件。 2.升級版本後,如果新增了欄位,則自動採用你在類中賦給該變數的值。 3.升級版本後,如果刪除了之前的欄位,則自動忽略之前的欄位,而不會像c#序列化一樣報錯,

缺點: 1.不能序列化字典,二維陣列以上的資料 2.比Json更佔空間,且引入的dll也更大

  • Json(LitJson)

優點: 1.簡單輕量 2.可以滿足你要序列化的幾乎任何型別資料(除了float必須用double來存) 3.如果要升級版本,可以任意刪除之前的欄位而不會出現不能解析的情況;可以新增欄位且採用你在類中直接賦的值(不用像c#序列化那樣手動賦值了)。

缺點: 1.相對PlayerPrefs來說,引入了一個50kb左右的dll。 2.不能序列化float型別。3.不支援更改欄位名。如果更改了,就相當於是兩個操作,即刪除之前的並新增加一個(這一點很重要)。

以上是我今天辛勤耕耘的成果,白天耕種,夜晚收割。如果不寫下來,今天我肯定就白搞了。