Unity Webgl小遊戲存取資料的解決方案

Jet清远發表於2024-09-14

在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 }

最後就只需要在需要存取的地方,呼叫這兩個靜態函式就可以了

相關文章