using System; using UnityEngine; using Cysharp.Threading.Tasks; using UnityEngine.Networking; /// /// 启动工具类,提供版本比较等功能 /// public static class LaunchUtility { /// /// 版本更新类型 /// public enum UpdateType { None, // 无需更新 PatchUpdate, // 小版本更新,更新后可直接进入游戏 MinorUpdate, // 中版本更新,更新后需要重启 MajorUpdate // 大版本更新,需要重新下载 } /// /// 比较版本并返回更新类型 /// /// 本地版本字符串,格式为 x.y.z /// 远程版本字符串,格式为 x.y.z /// 版本更新类型 public static UpdateType CompareVersions(string localVersion, string remoteVersion) { if (string.IsNullOrEmpty(localVersion) || string.IsNullOrEmpty(remoteVersion)) { Debug.LogError("版本信息为空,无法比较"); return UpdateType.None; } try { // 解析本地版本 int[] localParts = ParseVersionString(localVersion); int localMajor = localParts[0]; int localMinor = localParts[1]; int localPatch = localParts[2]; // 解析远程版本 int[] remoteParts = ParseVersionString(remoteVersion); int remoteMajor = remoteParts[0]; int remoteMinor = remoteParts[1]; int remotePatch = remoteParts[2]; // 检查大版本 if (remoteMajor > localMajor) { return UpdateType.MajorUpdate; } // 检查中版本 if (remoteMajor == localMajor && remoteMinor > localMinor) { return UpdateType.MinorUpdate; } // 检查小版本 if (remoteMajor == localMajor && remoteMinor == localMinor && remotePatch > localPatch) { return UpdateType.PatchUpdate; } // 无需更新 return UpdateType.None; } catch (Exception e) { Debug.LogError($"比较版本失败: {e.Message}"); return UpdateType.None; } } /// /// 解析版本字符串为整数数组 /// /// 版本字符串,格式为 x.y.z /// 包含三个整数的数组,分别表示大版本、中版本和小版本 private static int[] ParseVersionString(string versionString) { int[] result = new int[3] { 0, 0, 0 }; string[] parts = versionString.Split('.'); // 解析大版本 if (parts.Length > 0 && int.TryParse(parts[0], out int major)) { result[0] = major; } // 解析中版本 if (parts.Length > 1 && int.TryParse(parts[1], out int minor)) { result[1] = minor; } // 解析小版本 if (parts.Length > 2 && int.TryParse(parts[2], out int patch)) { result[2] = patch; } return result; } /// /// 获取本地版本信息 /// 适用于安卓、iOS、WebGL和PC平台 /// /// 版本字符串,格式为 x.y.z public static async UniTask GetLocalVersionAsync() { try { // 首先尝试从Resources加载版本文件 TextAsset versionAsset = Resources.Load("version"); if (versionAsset != null) { string versionText = versionAsset.text.Trim(); Debug.Log($"从Resources加载版本信息: {versionText}"); return versionText; } // 如果Resources中没有版本文件,则使用应用程序版本 string appVersion = Application.version; Debug.Log($"使用应用程序版本: {appVersion}"); // 确保版本号格式正确 if (string.IsNullOrEmpty(appVersion)) { Debug.LogWarning("应用程序版本为空,使用默认版本 1.0.0"); appVersion = "1.0.0"; } return appVersion; } catch (Exception e) { Debug.LogError($"获取本地版本信息失败: {e.Message}"); return "1.0.0"; // 返回默认版本 } } /// /// 从URL获取远程版本信息 /// /// 远程版本文件URL /// 远程版本字符串 public static async UniTask GetRemoteVersionAsync(string url) { const int maxRetries = 3; // 最大重试次数 const float timeoutSeconds = 10f; // 超时时间(秒) for (int retry = 0; retry < maxRetries; retry++) { try { using (var cancellationTokenSource = new System.Threading.CancellationTokenSource()) { // 设置超时 cancellationTokenSource.CancelAfterSlim(TimeSpan.FromSeconds(timeoutSeconds)); // 使用UnityWebRequest获取远程版本 using (UnityWebRequest request = UnityWebRequest.Get(url)) { // 发送请求并等待结果,带超时 await request.SendWebRequest().WithCancellation(cancellationTokenSource.Token); if (request.result == UnityWebRequest.Result.Success) { string versionText = request.downloadHandler.text.Trim(); Debug.Log($"成功获取远程版本: {versionText},尝试次数: {retry + 1}"); return versionText; } else { Debug.LogWarning($"获取远程版本失败: {request.error},尝试次数: {retry + 1}/{maxRetries}"); } } } // 如果不是最后一次尝试,则等待一段时间后重试 if (retry < maxRetries - 1) { await UniTask.Delay(1000); // 等待1秒后重试 } } catch (OperationCanceledException) { Debug.LogError($"获取远程版本超时,尝试次数: {retry + 1}/{maxRetries}"); } catch (Exception e) { Debug.LogError($"获取远程版本异常: {e.Message},尝试次数: {retry + 1}/{maxRetries}"); } } // 所有重试都失败,显示提示窗口 ShowVersionFetchFailedDialog(); // 返回空字符串表示获取失败 return string.Empty; } /// /// 显示版本获取失败对话框 /// /// /// 这是一个预留接口,需要在实际项目中实现 /// private static void ShowVersionFetchFailedDialog() { // 这里是预留的接口,用于显示版本获取失败的对话框 // 在实际项目中,可以根据需要实现具体的UI显示逻辑 Debug.LogError("获取版本信息失败,请检查网络连接后重试"); // 示例:可以通过事件系统触发UI显示 // EventSystem.Trigger("ShowVersionFetchFailedDialog"); // 或者通过其他方式显示对话框 // UIManager.ShowDialog("获取版本信息失败", "请检查网络连接后重试", "确定"); } /// /// 检查版本更新 /// /// 远程版本文件URL /// 更新类型 public static async UniTask CheckVersionUpdateAsync(string versionUrl) { try { // 获取本地版本 string localVersion = await GetLocalVersionAsync(); Debug.Log($"本地版本: {localVersion}"); // 获取远程版本 string remoteVersion = await GetRemoteVersionAsync(versionUrl); Debug.Log($"远程版本: {remoteVersion}"); // 比较版本 UpdateType updateType = CompareVersions(localVersion, remoteVersion); return updateType; } catch (Exception e) { Debug.LogError($"检查版本更新失败: {e.Message}"); return UpdateType.None; } } }