最近老金在准备发布微信小游戏的事,发现Unity工程转出来的微信小游戏有一个问题,每次重启小游戏时,游戏的进度就丢失了,查了一圈才发现,原来是在微信小游戏平台上,使用Application.persistentDataPath缓存路径来保存文件失败了。
原来代码是这样的
//读取存档 public static GameData LoadGame(int sceneId) { string path = $"{Application.persistentDataPath}/GameData_{sceneId}.dat"; //检测是否存在存档,若存在则读取存档 if (File.Exists(path)) { BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Open(path, FileMode.Open); Global_GameData data = (Global_GameData)bf.Deserialize(file); file.Close(); return data; } return null; } //创建或覆盖存档 public static void SaveGame(GameData data) { //设置储存路径并储存 string Save_Path = $"{Application.persistentDataPath}/GameData_{data.SceneId}.dat"; BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Create(Save_Path); bf.Serialize(file, data); file.Close(); }
除了Application.persistentDataPath缓存路径要改,还要用微信小游戏SDK的读写文件接口进行改造。修改之后的代码是这样的
public static GameData LoadGame(int sceneId) { WXFileSystemManager fs = WX.GetFileSystemManager(); string path = $"{WX.env.USER_DATA_PATH}/GameData_{sceneId}.dat"; //检测是否存在存档,若存在则读取存档 if (fs.AccessSync(path).Equals("access:ok")) { byte[] fileData = fs.ReadFileSync(path); MemoryStream memoryStream = new MemoryStream(fileData); BinaryFormatter bf = new BinaryFormatter(); Global_GameData data = (Global_GameData)bf.Deserialize(memoryStream); return data; } return null; } public static void SaveGameWechat(Global_GameData data) { string savePath = $"{WX.env.USER_DATA_PATH}/GameData_{data.SceneId}.dat"; MemoryStream memoryStream = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(memoryStream, data); byte[] saveData = memoryStream.ToArray(); WXFileSystemManager fs = WX.GetFileSystemManager(); fs.WriteFileSync(savePath, saveData); }
通过这种修改方式,Unity转出来的工程就能正常在微信小游戏里运行进来了。
- 本文固定链接: https://freemanapp.com/zh/?p=926
- 转载请注明: freeman 于 FreemanApp 发表