在Unity中,如果我們要儲存資料,通常會使用以下幾種方法:
1.Unity官方提供的PlayerPrefs
2.Unity官方提供的ScriptableObject
3.使用Json,XML,CSV等檔案儲存
4.使用資料庫儲存
而在Webgl手機小遊戲中,通常會以PlayerPrefs進行儲存,因為PlayerPrefs是一個極其輕量級的儲存方式
可以用於儲存一些小遊戲的資料(只能儲存int,float,string三種型別)
它主要的方法有以下這些:
1 // 儲存玩家的分數 2 PlayerPrefs.SetInt("PlayerScore", 100); 3 // 獲取玩家的分數,預設值為0 4 int playerScore = PlayerPrefs.GetInt("PlayerScore", 0); 5 // 儲存音量設定 6 PlayerPrefs.SetFloat("Volume", 0.5f); 7 // 獲取音量,預設值為1.0 8 float volume = PlayerPrefs.GetFloat("Volume", 1.0f); 9 // 儲存玩家的名字 10 PlayerPrefs.SetString("PlayerName", "qingyuan"); 11 // 獲取玩家名字,預設值為"Unknown" 12 string playerName = PlayerPrefs.GetString("PlayerName", "Unknown"); 13 // 刪除儲存的玩家分數 14 PlayerPrefs.DeleteKey("PlayerScore"); 15 // 刪除所有儲存的資料 16 PlayerPrefs.DeleteAll(); 17 // 檢查是否存在“PlayerScore” 18 if (PlayerPrefs.HasKey("PlayerScore")) 19 { 20 // 存在玩家分數 21 int score = PlayerPrefs.GetInt("PlayerScore"); 22 } 23 // 手動儲存資料 24 PlayerPrefs.Save();
其中有一些需要注意的地方,這三組get,set方法,它們的key均為string型別,而值的型別則與方法名對應。
關於手動儲存資料這個函式,通常,PlayerPrefs 在呼叫 Set 方法時會自動儲存資料,但在某些情況下(如遊戲退出前),你可以呼叫 PlayerPrefs.Save() 來確保資料儲存。
這種儲存方法的優點是輕量級,存取方便,缺點在於它的資料及其容易被修改,比如在Winodws系統下,它會將資料儲存在登錄檔中,你可以輕而易舉的檢視或者修改它。
值得注意的是,如果小遊戲是類似微信小程式的那種,則不能使用以下的方式進行儲存,因為下面的這種方式涉及檔案讀寫。
1 private void SaveLevelData() 2 { 3 //apk的儲存方法 4 FileStream fileStream = File.Create(UserGameDataFilePath); 5 Debug.Log("當前使用者資料儲存路徑:" + UserGameDataFilePath); 6 new BinaryFormatter().Serialize(fileStream, MultiplayerHandler.instance.UserGameData); 7 Debug.Log("UserGameData:" + MultiplayerHandler.instance.UserGameData); 8 fileStream.Close(); 9 }
下面我以一個實際專案的說說類似Webgl小遊戲如何存取資料:
首先,我有一個LevelData類:
1 public class LevelData 2 { 3 public string levelName; 4 5 public bool isCompleted; 6 7 public int score; 8 9 public float completionTime; 10 }
由於關卡很多,所以我還宣告瞭一個List<LevelData> UserGameData佇列:
public List<LevelData> UserGameData;
可以看出,我的LevelData類中有好幾個要儲存的變數,如果單純用上述的PlayerPrefs進行get,set,那程式碼量就顯得很多,而且讀取也不好進行讀取
所以我的想法是:先將整個List序列化為Json,然後使用PlayerPrefs.SetString()儲存(畢竟int,float能存的,String都可以),讀取的時候再使用PlayerPrefs.GetString()的讀取,然後反序列化為List物件。
以下是實現的程式碼:
1 public static void SaveUserData(string key, object data) 2 { 3 //將資料轉換為json,並以UserData這個鍵名儲存 4 var json = JsonConvert.SerializeObject(data, Formatting.Indented); 5 Gtools.SetString_SaveChange(key, json); 6 } 7 8 9 public static void LoadFromPlayerPrefs() 10 { 11 var json = Gtools.GetString_SaveChange("UserData"); 12 List<LevelData> dataList = JsonConvert.DeserializeObject<List<LevelData>>(json); 13 if (dataList != null && dataList.Count > 0) 14 { 15 MultiplayerHandler.instance.UserGameData = dataList; 16 } 17 }
最後就只需要在需要存取的地方,呼叫這兩個靜態函式就可以了