CloudSaveManager.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Fort23.Core;
  7. using Fort23.UTool;
  8. using UnityEngine;
  9. using TapSDK.Core;
  10. using TapSDK.CloudSave;
  11. using TapSDK.Login;
  12. using TapSDK.UI;
  13. public class CloudSaveManager : Singleton<CloudSaveManager>
  14. {
  15. private CloudSaveManager()
  16. {
  17. TapCloudSaveCallback callback = new TapCloudSaveCallback();
  18. TapTapCloudSave.RegisterCloudSaveCallback(callback);
  19. }
  20. // 检查是否存在存档,若存在则加载,否则创建新存档
  21. public async CTask LoadOrCreateArchiveAsync()
  22. {
  23. try
  24. {
  25. // 获取存档列表
  26. List<ArchiveData> archives = await TapTapCloudSave.GetArchiveList();
  27. await AccountFileInfo.Instance.LoadPlayerData();
  28. //如果没有本地文件看有存档没有
  29. if (!File.Exists(AccountFileInfo.Instance.persistentDataPath) ||
  30. AccountFileInfo.Instance.playerData.Uuid == String.Empty ||
  31. archives.Find(a => a.Uuid == AccountFileInfo.Instance.playerData.Uuid) == null)
  32. {
  33. //有存档就读取第一个存档
  34. if (archives != null && archives.Count > 0)
  35. {
  36. ArchiveData archive = archives[0];
  37. AccountFileInfo.Instance.playerData.Uuid = archive.Uuid;
  38. await LoadArchiveAsync();
  39. AccountFileInfo.Instance.LoadPlayerData();
  40. AccountFileInfo.Instance.playerData.Uuid = archive.Uuid;
  41. }
  42. else
  43. {
  44. await AccountFileInfo.Instance.ClearPlayerData();
  45. await CreateArchiveAsync();
  46. }
  47. }
  48. //有数据直接读取本地数据 然后更新一次存档避免上次游戏没有更新
  49. else
  50. {
  51. UpdateArchiveAsync();
  52. }
  53. }
  54. catch (TapException ex)
  55. {
  56. LogTool.Error($"Failed to check/load archive: {ex.Code} - {ex.Message}");
  57. }
  58. catch (Exception ex)
  59. {
  60. LogTool.Error($"Unexpected error checking/loading archive: {ex.Message}");
  61. }
  62. }
  63. /// <summary>
  64. /// 创建存档
  65. /// </summary>
  66. public async CTask<string> CreateArchiveAsync()
  67. {
  68. try
  69. {
  70. // 创建存档元信息
  71. ArchiveMetadata metadata = new ArchiveMetadata(
  72. archiveName: "playerData",
  73. archiveSummary: "玩家数据",
  74. archiveExtra: "额外信息",
  75. archivePlaytime: 0
  76. );
  77. // 创建存档
  78. ArchiveData createdArchive =
  79. await TapTapCloudSave.CreateArchive(metadata, AccountFileInfo.Instance.persistentDataPath, null);
  80. AccountFileInfo.Instance.lasetSaveTime = System.DateTime.Now.Ticks;
  81. AccountFileInfo.Instance.playerData.Uuid = createdArchive.Uuid;
  82. LogTool.Error($"存档创建成功,UUID: {createdArchive.Uuid}");
  83. return createdArchive.Uuid;
  84. }
  85. catch (TapException ex)
  86. {
  87. LogTool.Error($"创建存档失败: {ex.Code} - {ex.Message}");
  88. throw;
  89. }
  90. catch (Exception ex)
  91. {
  92. LogTool.Error($"创建存档失败: {ex.Message}");
  93. throw;
  94. }
  95. }
  96. // 更新存档
  97. public async CTask UpdateArchiveAsync()
  98. {
  99. if (AccountFileInfo.Instance.playerData.Uuid == "")
  100. return;
  101. try
  102. {
  103. // 更新存档元信息
  104. ArchiveMetadata metadata = new ArchiveMetadata(
  105. archiveName: "playerData",
  106. archiveSummary: "玩家数据",
  107. archiveExtra: "额外信息",
  108. archivePlaytime: 0
  109. );
  110. // 更新存档
  111. ArchiveData updatedArchive =
  112. await TapTapCloudSave.UpdateArchive(AccountFileInfo.Instance.playerData.Uuid, metadata,
  113. AccountFileInfo.Instance.persistentDataPath,
  114. null);
  115. LogTool.Log($"存档更新成功,UUID: {updatedArchive.Uuid}");
  116. }
  117. catch (TapException ex)
  118. {
  119. LogTool.Error($"更新存档失败: {ex.Code} - {ex.Message}");
  120. throw;
  121. }
  122. catch (Exception ex)
  123. {
  124. LogTool.Error($"更新存档失败: {ex.Message}");
  125. throw;
  126. }
  127. }
  128. // 查询存档
  129. public async CTask LoadArchiveAsync()
  130. {
  131. try
  132. {
  133. // 获取存档列表
  134. List<ArchiveData> archives = await TapTapCloudSave.GetArchiveList();
  135. ArchiveData archive = archives.Find(a => a.Uuid == AccountFileInfo.Instance.playerData.Uuid);
  136. if (archive == null)
  137. {
  138. LogTool.Error("没有查询到指定uuid存档");
  139. return;
  140. }
  141. // 下载存档文件
  142. byte[] data =
  143. await TapTapCloudSave.GetArchiveData(AccountFileInfo.Instance.playerData.Uuid,
  144. archive.FileId);
  145. string str1 = Encoding.UTF8.GetString(data);
  146. LogTool.Log(str1);
  147. File.WriteAllBytes(AccountFileInfo.Instance.persistentDataPath, data);
  148. LogTool.Error("读取存档成功");
  149. }
  150. catch (TapException ex)
  151. {
  152. LogTool.Error($"加载存档失败: {ex.Code} - {ex.Message}");
  153. throw;
  154. }
  155. catch (Exception ex)
  156. {
  157. LogTool.Error($"加载存档失败: {ex.Message}");
  158. throw;
  159. }
  160. }
  161. // 删除存档
  162. public async Task DeleteArchiveAsync(string archiveUuid)
  163. {
  164. try
  165. {
  166. await TapTapCloudSave.DeleteArchive(archiveUuid);
  167. LogTool.Log($"存档删除成功,UUID: {archiveUuid}");
  168. }
  169. catch (TapException ex)
  170. {
  171. LogTool.Error($"删除存档失败: {ex.Code} - {ex.Message}");
  172. throw;
  173. }
  174. catch (Exception ex)
  175. {
  176. LogTool.Error($"删除存档失败: {ex.Message}");
  177. throw;
  178. }
  179. }
  180. }