AssetGame_VersionManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.IO;
  6. /// <summary>
  7. /// 版本管理
  8. /// 其实说白了,就是下载所有需要更新资源滴...
  9. /// 暂时读取的txt
  10. ///
  11. /// </summary>
  12. public class AssetGame_VersionManager : AssetGame_Base<AssetGame_VersionManager>
  13. {
  14. bool NeedRestart = false;
  15. public enum EUpdateState
  16. {
  17. /// <summary>
  18. /// 时刻准备着
  19. /// </summary>
  20. None,
  21. /// <summary>
  22. /// 读取沙盒版本
  23. /// </summary>
  24. LoadPersisVersionFile,
  25. /// <summary>
  26. /// 读取内存版本
  27. /// </summary>
  28. LoadStreamVersionFile,
  29. /// <summary>
  30. /// 加载[解压]本地资源
  31. /// </summary>
  32. LoadLocalRes,
  33. /// <summary>
  34. /// 加载服务器资源
  35. /// </summary>
  36. LoadServerVersionFile,
  37. /// <summary>
  38. /// 服务器有需要下载的资源
  39. /// </summary>
  40. NeedDownload,
  41. /// <summary>
  42. /// 下载并更新本地资源
  43. /// </summary>
  44. LoadServerRes,
  45. /// <summary>
  46. ///搞定~
  47. /// </summary>
  48. Over,
  49. /// <summary>
  50. /// 重新启动
  51. /// </summary>
  52. Restart
  53. }
  54. EUpdateState _state = EUpdateState.None;
  55. #region Properties
  56. /// <summary>
  57. /// 本地资源列表
  58. /// </summary>
  59. private Dictionary<string, string> LocalResVersion;
  60. /// <summary>
  61. /// 服务器资源列表
  62. /// </summary>
  63. public Dictionary<string, string> ServerResVersion;
  64. /// <summary>
  65. /// 服务器资源大小的列表
  66. /// </summary>
  67. public Dictionary<string, string> ServerResSizeVersion;
  68. /// <summary>
  69. /// 本地只读资源列表
  70. /// </summary>
  71. private Dictionary<string, string> ReadResVersion;
  72. /// <summary>
  73. ///需要下载的资源
  74. /// </summary>
  75. private List<string> NeedDownFiles;
  76. /// <summary>
  77. /// 是否需要更新本地版本文件
  78. /// </summary>
  79. private bool NeedUpdateLocalVersionFile = false;
  80. /// <summary>
  81. /// 服务器文件流内容
  82. /// </summary>
  83. private string VersionFileContent = "";
  84. /// <summary>
  85. /// 服务器发回的最新版本号
  86. /// </summary>
  87. private string ServerVersion = "";
  88. #endregion
  89. #region 供外部调用
  90. /// <summary>
  91. /// 当前版本资源更新进度
  92. /// </summary>
  93. public EUpdateState getState
  94. {
  95. get { return _state; }
  96. }
  97. /// <summary>
  98. /// 当前版本更新的状态
  99. /// </summary>
  100. public EUpdateState setState
  101. {
  102. set
  103. {
  104. LogHelper.Log("当前执行状态【" + value + "】");
  105. _state = value;
  106. }
  107. }
  108. public void SetAwake()
  109. {
  110. //初始化
  111. LocalResVersion = new Dictionary<string, string>();
  112. ServerResVersion = new Dictionary<string, string>();
  113. ServerResSizeVersion = new Dictionary<string, string>();
  114. ReadResVersion = new Dictionary<string, string>();
  115. NeedDownFiles = new List<string>();
  116. }
  117. public void SetRun(string newVersion)
  118. {
  119. GetPersisVersion();
  120. ServerVersion = newVersion;
  121. }
  122. #endregion
  123. /// <summary>
  124. /// 读沙盒版本
  125. /// </summary>
  126. void GetPersisVersion()
  127. {
  128. LogHelper.Log("```11````");
  129. setState = EUpdateState.LoadPersisVersionFile;
  130. /**
  131. * 首先读取沙盒中文件,如果没有,则表示第一次安装运行
  132. * Android之所以不支持C# IO流 方式读取StreamingAssets下的文件,是因为Android手机中
  133. * StreamingAssets下的文件都包含在压缩的.jar文件中(这基本上与标准的zip压缩文件的格
  134. * 式相同)。这意味着,如果你不使用Unity中的WWW类去检索文件,那么你需要使用额外的软
  135. * 件去查看.jar的存档并获取该文件。
  136. */
  137. AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(AssetConfig_GlobalSetting.strLocalSaveUrl + AssetConfig_GlobalSetting.strVersionFileName,
  138. delegate(WWW localVersion)
  139. {
  140. if (localVersion.text.Length != 0)
  141. {
  142. /**
  143. *
  144. */
  145. LogHelper.Log("沙盒中已经存在版本对比文件,将内容读取到列表");
  146. AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(localVersion.text, LocalResVersion, "LocalVersion");
  147. SetServerVersion();
  148. }
  149. else
  150. {
  151. LogHelper.Log("沙盒没有版本文件");
  152. GetLocalVersion();
  153. }
  154. }
  155. ));
  156. }
  157. /// <summary>
  158. /// 读取本地版本信息
  159. /// </summary>
  160. void GetLocalVersion()
  161. {
  162. setState = EUpdateState.LoadStreamVersionFile;
  163. LogHelper.Log("读取本地版本信息:" + AssetConfig_GlobalSetting.strLocalReadUrl + AssetConfig_GlobalSetting.strVersionFileName);
  164. AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(AssetConfig_GlobalSetting.strLocalReadUrl + AssetConfig_GlobalSetting.strVersionFileName,
  165. delegate (WWW orgVersion)
  166. {
  167. if (orgVersion.text.Length > 0)
  168. {
  169. LogHelper.Log("复制本地的version到沙盒中:" + orgVersion.text);
  170. AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(orgVersion.text, ReadResVersion, "orgVersion");
  171. LogHelper.Log("重写文件:" + AssetConfig_GlobalSetting.strVersionFileName);
  172. AssetSystem_AndroidFileHelper.Instance.ReWriteFileByString(AssetConfig_GlobalSetting.strVersionFileName, orgVersion.text);
  173. AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(orgVersion.text, LocalResVersion, "LocalVersion");
  174. LogHelper.Log("复制完毕!");
  175. setState = EUpdateState.LoadLocalRes;
  176. SetServerVersion();
  177. }
  178. else
  179. {
  180. SetServerVersion();
  181. LogHelper.Log("出大事了!!!!!!!!!没有读取到本地版本文件!");
  182. }
  183. }));
  184. }
  185. /// <summary>
  186. /// 更新服务器端的版本信息
  187. /// </summary>
  188. public void SetServerVersion()
  189. {
  190. setState = EUpdateState.LoadServerVersionFile;
  191. string cdnpath = AssetConfig_GlobalSetting.strServerUrl + ServerVersion + "/";
  192. string cdnfile = GlobalConfig.ClientVersion + "---" + ServerVersion + ".txt";
  193. LogHelper.Log(cdnpath + "" + cdnfile);
  194. AssetGame_ResourceUpdate.Ins.SetProgress(0);
  195. AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(cdnpath + cdnfile, delegate (WWW serverVersion)
  196. {
  197. LogHelper.Log("加载网络CDN资源:" + cdnpath + cdnfile);
  198. if (serverVersion.error != null)
  199. {
  200. LogHelper.Log(serverVersion.error);
  201. return;
  202. // LogHelper.Log("当前网络不可用,请检查后重试 服务器正在维护中,请稍后重试");
  203. }
  204. //保存服务端version
  205. AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(serverVersion.text, ServerResVersion, "ServerVersion");
  206. AssetGame_ResourceUpdate.Ins.ToParseVersionFileSizeXml(serverVersion.text, ServerResSizeVersion, "ServerResSizeVersion");
  207. VersionFileContent = serverVersion.text;
  208. ////计算出需要重新加载的资源
  209. GetCompareVersion();
  210. }));
  211. }
  212. /// <summary>
  213. /// 去下载服务器版本
  214. /// </summary>
  215. void GetServerRes()
  216. {
  217. //本次有更新,同时更新本地的version.txt
  218. NeedUpdateLocalVersionFile = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount > 0;
  219. if (!NeedUpdateLocalVersionFile)
  220. {
  221. if (NeedRestart)
  222. {
  223. LogHelper.Log("已是最新版本!重启游戏!");
  224. AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
  225. PlayerPrefs.Save();
  226. GlobalConfig.ClientVersion = ServerVersion;
  227. setState = EUpdateState.Restart;
  228. }
  229. else
  230. {
  231. LogHelper.Log("已是最新版本!无需更新!!!!~~~~~~~~~~~~~~~");
  232. PlayerPrefs.SetString("Version", ServerVersion);
  233. PlayerPrefs.Save();
  234. GlobalConfig.ClientVersion = ServerVersion;
  235. setState = EUpdateState.Over;
  236. }
  237. }
  238. else
  239. {
  240. GlobalConfig.ClientVersion = ServerVersion;
  241. setState = EUpdateState.NeedDownload;
  242. AssetGame_ResourceUpdate.Ins.SetMaxBundleNum = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount;
  243. AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
  244. return;
  245. }
  246. }
  247. /// <summary>
  248. /// 开始下载更新.
  249. /// </summary>
  250. public void StartDownload()
  251. {
  252. setState = EUpdateState.LoadServerRes;
  253. //加载需要更新的资源
  254. AssetGame_ResourceUpdate.Ins.SetMaxBundleNum = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount;
  255. AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
  256. }
  257. /// <summary>
  258. /// 对比服务器和本地版本
  259. /// </summary>
  260. void GetCompareVersion()
  261. {
  262. int num = 0;
  263. foreach (var version in ServerResVersion)
  264. {
  265. string fileName = version.Key;
  266. string serverMd5 = version.Value;
  267. //新增的资源
  268. if (!LocalResVersion.ContainsKey(fileName))
  269. {
  270. if (fileName.Equals("Assembly-CSharp.dll"))
  271. {
  272. NeedRestart = true;
  273. }
  274. LogHelper.Log("新增资源" + fileName);
  275. string serverResSize;
  276. ServerResSizeVersion.TryGetValue(fileName, out serverResSize);
  277. num += int.Parse(serverResSize);
  278. // LogHelper.Log("数据量大小:" + num);
  279. AssetGame_ResourceUpdate.Ins.SetMaxBundleSize = num;
  280. AssetGame_ResourceUpdate.Ins.AddLoadRes(fileName);
  281. }
  282. else
  283. {
  284. //需要替换的资源
  285. string localMd5;
  286. LocalResVersion.TryGetValue(fileName, out localMd5);
  287. if (serverMd5!=localMd5)
  288. {
  289. if (fileName.Equals("Assembly-CSharp.dll"))
  290. {
  291. NeedRestart = true;
  292. }
  293. LogHelper.Log("localMd5=" + localMd5 + "/serverMd5=" + serverMd5);
  294. LogHelper.Log("需要下载更新的资源=" + fileName);
  295. string serverResSize;
  296. ServerResSizeVersion.TryGetValue(fileName, out serverResSize);
  297. num +=int .Parse ( serverResSize);
  298. // LogHelper.Log ("数据量大小:" + num);
  299. AssetGame_ResourceUpdate.Ins.SetMaxBundleSize = num;
  300. // LogHelper.Log("数据量大小1111:" +AssetGame_ResourceUpdate.Ins.GetMaxBundleSize );
  301. AssetGame_ResourceUpdate.Ins.AddLoadRes(fileName);
  302. }
  303. }
  304. }
  305. GetServerRes();
  306. }
  307. /// <summary>
  308. /// 更新本地的version配置
  309. /// </summary>
  310. public void SetUpdateLocalVersionFile()
  311. {
  312. //AssetSystem_AndroidFileHelper.Ins.ReWriteFileByString(
  313. // AssetConfig_GlobalSetting.strVersionFileName,
  314. // VersionFileContent);
  315. if (NeedRestart)
  316. {
  317. LogHelper.Log("已更新到最新版本!重启游戏!");
  318. setState = EUpdateState.Restart;
  319. }
  320. else
  321. {
  322. PlayerPrefs.SetString("Version", ServerVersion);
  323. PlayerPrefs.Save();
  324. LogHelper.Log("更新完毕");
  325. setState = EUpdateState.Over;
  326. }
  327. // //加载显示对象
  328. //StartCoroutine(Show());
  329. }
  330. /// <summary>
  331. /// 显示资源
  332. /// </summary>
  333. /// <returns></returns>
  334. //private IEnumerator Show()
  335. //{
  336. // LogHelper.Log(AssetConfig_GlobalSetting.LOCAL_RES_URL + "Assets.Prefab.UI.TestAWindow.assetbundle");
  337. // WWW asset = new WWW(AssetConfig_GlobalSetting.LOCAL_RES_URL + "Assets.Prefab.UI.TestAWindow.assetbundle");
  338. // yield return asset;
  339. // AssetBundle bundle = asset.assetBundle;
  340. // Object obj1 = bundle.LoadAsset("Assets.Prefab.UI.TestAWindow");
  341. // yield return Instantiate(obj1);
  342. // bundle.Unload(false);
  343. // yield return null;
  344. //}
  345. }