robot_client/fk101/wb_unity_pro/Assets/Scripts/VerCheck.cs

875 lines
41 KiB
C#

using UnityEngine;
using System.Collections;
using System.IO;
using FairyGUI;
using MiniJSON;
using UnityEngine.Networking;
using taurus.unity;
using System.Text;
using System;
/// <summary>
/// 版本检查与资源更新管理器
/// 负责游戏的版本验证、资源配置下载、资源包检查和更新等功能
/// </summary>
public class VerCheck : MonoBehaviour
{
/// <summary>
/// 版本检查UI界面组件
/// </summary>
GComponent _version_view;
/// <summary>
/// 单例实例,用于全局访问版本检查器
/// </summary>
public static VerCheck Instance { get; private set; }
/// <summary>
/// 安全连接对象,存储服务器IP和端口信息
/// </summary>
public securityConnection conn;
/// <summary>
/// 是否为GFF平台标识
/// </summary>
public bool isGFF = false;
/// <summary>
/// 是否为DXYGFF平台标识(默认true)
/// </summary>
public bool isDXYGFF = true;
/// <summary>
/// Unity Awake方法,初始化单例
/// </summary>
void Awake()
{
Instance = this;
}
/// <summary>
/// Unity Start方法,启动时执行版本检查流程
/// </summary>
void Start()
{
// 检测Android平台是否为64位
GameApplication.Instance.isAndroid64bit = IsAndroid64bit();
// 创建版本检查UI界面
CreateVersionView();
// 开始网络检查和资源配置下载
StartCoroutine(CheckNet());
}
/// <summary>
/// 重置游戏状态,清理资源并重新开始版本检查
/// 用于热更新或重新加载场景时使用
/// </summary>
internal void ResetGame()
{
CreateVersionView();
StartCoroutine(__WaitReset());
}
/// <summary>
/// 等待重置完成,清理旧的游戏资源和Lua客户端
/// </summary>
IEnumerator __WaitReset()
{
// 获取并销毁Lua客户端组件
var _luaClient = GameApplication.Instance.GetComponent<DSLuaClient>();
UnityEngine.Object.Destroy(_luaClient);
// 强制垃圾回收
System.GC.Collect();
// 清空字体管理器
FontManager.Clear();
// 移除所有UI包
UIPackage.RemoveAllPackages();
// 销毁所有资源管理器中的资源
ResourcesManager.DestroyAll();
// 重新创建版本检查UI
CreateVersionView();
yield return null;
// 重新开始网络检查流程
StartCoroutine(CheckNet());
}
/// <summary>
/// 创建版本检查UI界面
/// 加载Hotupdate UI包并显示版本检查视图
/// </summary>
void CreateVersionView()
{
// 读取基础嵌入资源配置
ResourcesManager.ReadAssetConfig("base/embed");
// 添加Hotupdate UI包
UIPackage.AddPackage("base/embed/ui/Hotupdate");
// 如果已存在旧的版本视图,先销毁
if (_version_view != null) _version_view.Dispose();
_version_view = null;
// 从URL创建版本检查UI对象
_version_view = UIPackage.CreateObjectFromURL("ui://Hotupdate/Version").asCom;
// 将版本视图添加到根节点最底层
GRoot.inst.AddChildAt(_version_view,0);
// 居中显示版本视图
_version_view.x = (GRoot.inst.width - _version_view.width) / 2;
// 输出持久化数据路径(用于调试)
Debug.LogError(Application.persistentDataPath);
}
/// <summary>
/// 检测当前Android设备是否为64位架构
/// </summary>
/// <returns>true表示64位,false表示32位或非Android平台</returns>
public bool IsAndroid64bit()
{
#if UNITY_ANDROID && !UNITY_EDITOR
// 在Android真机上,通过指针大小判断架构
if (IntPtr.Size == 8)
{
return true;
}
return false;
#else
// 非Android平台或编辑器模式下返回false
return false;
#endif
}
/// <summary>
/// 检查网络连接并下载资源配置
/// 这是版本检查的核心流程,包括:
/// 1. 初始化第三方SDK(GFF或DXYGFF)
/// 2. 下载init配置文件
/// 3. 检查版本是否需要更新
/// 4. 检查资源包是否需要更新
/// </summary>
IEnumerator CheckNet()
{
string json_data = string.Empty;
// 重置平台标识
isDXYGFF= false;
isGFF = false;
// 资源配置文件的下载地址
//string init_url = "http://8.138.94.89:9898/NewFK/config/init2_1.json";
string init_url = "http://8.138.242.190:29898/NewFK/config/init2_1.json";
// 根据平台标识进行不同的初始化处理
if (isGFF==false&&isDXYGFF==false)
{
// 非特殊平台,使用默认的init_url
}
else
{
if (isGFF)
{
// GFF平台初始化
// 使用AppVest SDK进行初始化,传入应用ID和密钥
int rc = AppVest.init("8ef91e7e799b5851a8ce810aae0c697c", "U5ayF4voVvRh1ElqBIVUCR9dSFskPGvCkfreFxdxzi39hoU0faqZWjFzC90Cta50egaQatCbPxm6XTlvi2+o++PrSozoZ+HUUY0y8tBloMWaOYQX59SAhjA/DyIDHJgGbE1I");
if (rc != 0)
{
// 初始化失败,显示提示并重试
ShowTip("GF init failed!", () =>
{
StartCoroutine(CheckNet());
});
}
// 获取服务器IP和端口
conn.ip = "";
conn.port = 0;
int rc1 = AppVest.getServerIPAndPort(ref conn, "", 5021);
if (rc1 != 0)
{
// 获取服务器信息失败,显示提示并重试
ShowTip("getServerIPAndPort failed!", () =>
{
StartCoroutine(CheckNet());
});
yield break;
}
}
else
{
// DXYGFF平台初始化
// 使用加密密钥进行初始化
string key = "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";
// 调用DxyVest SDK初始化,期望返回值为150表示成功
int rc = DxyVest.Start(key);
if (rc != 150)
{
// 初始化失败,记录错误并重试
Debug.LogError("wwwwwwwwwwwwwwwwwwwwwww init failed");
ShowTip("GF init failed!", () =>
{
StartCoroutine(CheckNet());
});
}
// DXYGFF平台使用固定的本地服务器地址
conn.ip = "127.0.0.1";
conn.port = 29898;
}
// 根据获取到的服务器IP和端口构建配置文件URL
init_url = "http://" + conn.ip + ":" + conn.port + "/NewFK/config/init2_1.json";
Debug.LogError("init_url : " + init_url);
}
// 下载超时时间(秒)
float downTimeOut = 5;
// 使用WWW类下载配置文件
using (WWW request1 = new WWW(init_url))
{
float timeOut = Time.time;
float process = request1.progress;
// 等待下载完成,同时监测超时
while (request1!=null && request1.isDone==false)
{
// 如果有进度更新,重置超时计时
if(process<request1.progress)
{
timeOut = Time.time;
process = request1.progress;
}
// 检查是否超时
if(Time.time-timeOut>downTimeOut)
{
ShowTip("资源配置下载失败,请检查您的网络设置!", () =>
{
StartCoroutine(CheckNet());
});
yield break;
}
yield return null;
}
yield return request1;
// 检查下载是否成功
if (string.IsNullOrEmpty(request1.error))
{
// 获取下载的JSON配置数据
json_data = request1.text;
// 缓存游戏配置信息
GameApplication.Instance.GameInfo = json_data;
// 解析JSON数据
Hashtable json = Json.Deserialize(json_data) as Hashtable;
// 设置资源包下载地址
Hotupdate.PackUrl = (string)json["pack_url"];
// 根据平台获取对应的配置数据
Hashtable _plat_data = null;
#if UNITY_IPHONE
_plat_data = json["iOS"] as Hashtable;
#endif
#if UNITY_ANDROID
_plat_data = json["Android"] as Hashtable;
#endif
#if UNITY_STANDALONE
_plat_data = json["Win"] as Hashtable;
#endif
// 检查当前版本是否需要隐藏SDK(测试版本)
var check = _plat_data[string.Format("check{0}", GameApplication.AppVersion.ToString())];
if (check != null && (bool)check)
{
GameApplication.HideSdk = true;
GameApplication.Instance.accountTest = false;
}
// 获取服务器版本号
Version server_version = new Version((string)_plat_data["version"]);
// 如果不隐藏SDK,则进行版本检查
if (!GameApplication.HideSdk)
{
// 比较本地版本和服务器版本,判断是否需要更新
if (GameApplication.AppVersion.max_version < server_version.max_version || (GameApplication.AppVersion.max_version == server_version.max_version && GameApplication.AppVersion.min_version < server_version.min_version))
{
// 提示用户需要更新
ShowTip("您版本需要更新!", () =>
{
#if UNITY_ANDROID
// Android平台:下载新安装包
StartCoroutine(DownApp((string)_plat_data["appurl"], server_version.ToString()));
#else
// 其他平台:删除旧资源包并打开下载链接
DeleteOldPack();
Application.OpenURL((string)_plat_data["appurl"]);
Application.Quit();
#endif
});
yield break;
}
}
// 设置语音上传和下载地址
Voice.VoiceUpload = json["voice_upload_url"] as string;
Voice.VoiceDownload = json["voice_download_url"] as string;
// 如果不是打包的APP(编辑器模式),直接启动游戏
if (!GameApplication.Instance.buildApp)
{
GameApplication.AppVersion.FillData(server_version);
_version_view.Dispose();
GameApplication.Instance.StartGame();
}
else
{
// 打包版本:检查资源包配置
StartCoroutine(CheckAssetConfig(server_version));
}
}
else
{
// 下载失败,提示用户并重试
ShowTip("资源配置下载失败,请检查您的网络设置!", () =>
{
StartCoroutine(CheckNet());
});
}
}
}
/// <summary>
/// 检查资源包配置
/// 对比本地资源版本和服务器版本,下载缺失或更新的资源
/// </summary>
/// <param name="server_version">服务器版本号</param>
IEnumerator CheckAssetConfig(Version server_version)
{
// 获取UI上的文本显示对象
GObject v_tex_info = _version_view.GetChild("tex_info");
// 获取本地资源版本
Version local_version = Hotupdate.GetLocalVersion(string.Empty);
ArrayList asset_config_list = null;
string asset_config_text = null;
// 如果本地版本为空或包含服务器版本的所有内容,需要下载资源配置
if (local_version == null || local_version.ContainAll(server_version))
{
// 构建资源配置文件的URL
string ac_url="";
if(isGFF==false)
ac_url = string.Format("{0}/config/asset_config{1}.json", Hotupdate.PackUrl, server_version.ToString());
else
ac_url = string.Format("http://{0}/NewFK/config/asset_config{1}.json", conn.ip + ":" + conn.port, server_version.ToString());
// 下载超时时间
float downTimeOut = 5;
using (var request = new WWW(ac_url))
{
float timeOut = Time.time;
float process = request.progress;
// 等待下载完成,监测超时
while (request != null && request.isDone == false)
{
if (process < request.progress)
{
timeOut = Time.time;
process = request.progress;
}
if (Time.time - timeOut > downTimeOut)
{
ShowTip("游戏配置下载异常,请检查您的网络设置!", () =>
{
StartCoroutine(CheckNet());
});
yield break;
}
yield return null;
}
yield return request;
// 检查下载是否成功
if (string.IsNullOrEmpty(request.error))
{
// 解析资源配置JSON
asset_config_text = request.text;
asset_config_list = Json.Deserialize(asset_config_text) as ArrayList;
// 检查解析是否成功
if (asset_config_list == null)
{
ShowTip("游戏配置下载异常,请检查您的网络设置!", () =>
{
StartCoroutine(CheckAssetConfig(server_version));
});
yield break;
}
// 更新UI提示文本
v_tex_info.text = "正在检查资源。。。";
// 获取进度条控件
GSlider _pd = _version_view.GetChild("pb_progress").asSlider;
_pd.value = 0.0;
// 开始检查所有资源的大小
bool size_check = false;
long total_size = 0;
StartCoroutine(VersionUpdateCheckSize2(asset_config_list, (all_size, finish) =>
{
total_size = all_size;
size_check = finish;
}));
// 等待大小检查完成
while (!size_check)
{
yield return null;
}
Debug.Log($"总大小:{(total_size / 1024f / 1024f):F2} MB");
// 开始检查资源版本并下载
bool ver_check = false;
StartCoroutine(VersionUpdateCheck(asset_config_list, (progress, finish) =>
{
if (ver_check)
{
_pd.value = 100f;
ver_check = finish;
}
else
{
// 更新下载进度显示
v_tex_info.text = $"正在下载资源({(progress / 1024f / 1024f):F2} MB/{(total_size / 1024f / 1024f):F2} MB)";
_pd.value = progress / total_size * 100f;
ver_check = finish;
}
}));
// 等待版本检查完成
while (!ver_check)
{
yield return null;
}
// 解压下载的资源文件
bool unZip_check = false;
v_tex_info.text = "正在解压文件(该过程不消耗流量)";
_pd.value = 100f;
StartCoroutine(VersionUpdateUnZip(asset_config_list, (finish) =>
{
unZip_check = finish;
}));
// 等待解压完成
while (!unZip_check)
{
yield return null;
}
// 保存资源配置文件和版本号文件
string arv = string.Format("{0}asset_config{1}.json", ResourcesManager.PACK_PATH, server_version.ToString());
File.WriteAllText(arv, asset_config_text, System.Text.Encoding.UTF8);
string rv = ResourcesManager.PACK_PATH + "version.txt";
File.WriteAllText(rv, server_version.ToString(), System.Text.Encoding.UTF8);
}
else
{
// 下载失败,提示用户并重试
ShowTip("游戏资源下载失败,请检查您的网络设置!", () =>
{
StartCoroutine(CheckAssetConfig(server_version));
});
yield break;
}
}
}else
{
// 本地已有资源配置,直接读取
string arv =ResourcesManager.PACK_PATH+"asset_config"+server_version.ToString()+".json";
try
{
// 读取本地配置文件
asset_config_text = File.ReadAllText(arv);
asset_config_list = Json.Deserialize(asset_config_text) as ArrayList;
// 加载所有基础资源配置
foreach (Hashtable tem in asset_config_list)
{
string b_path = "base/" + tem["name"];
ResourcesManager.ReadAssetConfig(b_path);
}
}
catch (Exception s)
{
// 读取失败,可能是资源损坏
Debug.LogError(s.ToString());
ShowTip("游戏资源损坏,请重新安装新包!", () =>
{
StartCoroutine(CheckAssetConfig(server_version));
});
yield break;
}
}
// 填充版本数据
GameApplication.AppVersion.FillData(server_version);
v_tex_info.text = "正在加载资源请稍后。。";
yield return null;
// 销毁版本检查UI
_version_view.Dispose();
// 启动游戏
GameApplication.Instance.StartGame();
}
/// <summary>
/// 检查基本更新包并下载需要的资源
/// 遍历资源配置列表,逐个检查并下载需要更新的资源包
/// </summary>
/// <param name="asset_config_list">资源配置列表</param>
/// <param name="onback">回调函数,参数为(已下载大小, 是否完成)</param>
/// <returns></returns>
IEnumerator VersionUpdateCheck(ArrayList asset_config_list, System.Action<float, bool> onback)
{
Version local_version = Version.DEFUALT;
float download_size = 0;
// 遍历所有资源配置项
for(int i=0;i< asset_config_list.Count; ++i)
{
var tem = asset_config_list[i] as Hashtable;
// 构建资源路径
string b_path = "base/" + tem["name"].ToString();
// 创建热更新对象,对比本地版本和服务器版本
Hotupdate version_update = new Hotupdate(b_path + "/", local_version, new Version((string)tem["ver"]));
version_update.AssetName = b_path;
version_update.HideDetail = true;
// 设置提示回调
version_update.SetTipCallback((text,callback)=>
{
ShowTip(text, callback);
});
// 开始加载资源
version_update.LoadAsset();
// 等待加载完成
while (!version_update.Done)
{
// 回调当前下载进度
onback(download_size + version_update.Progress* (float)tem["size"], false);
yield return null;
}
// 累加已下载大小
download_size += (float)tem["size"];
// 读取资源配置
ResourcesManager.ReadAssetConfig(b_path);
}
// 完成回调
onback(1, true);
}
/// <summary>
/// 检查基本更新包的总大小(旧版本,使用HEAD请求)
/// 通过HTTP HEAD请求获取每个需要更新的资源文件大小
/// </summary>
/// <param name="asset_config_list">资源配置列表</param>
/// <param name="onback">回调函数,参数为(总大小, 是否完成)</param>
/// <returns></returns>
IEnumerator VersionUpdateCheckSize(ArrayList asset_config_list, System.Action<long, bool> onback)
{
Version local_version_one = Version.DEFUALT;
long totalSize = 0;
for (int i = 0; i < asset_config_list.Count; ++i)
{
var tem_one = asset_config_list[i] as Hashtable;
string b_path_one = "base/" + tem_one["name"].ToString();
local_version_one = Hotupdate.GetLocalVersion(b_path_one);
// 判断是否需要更新
var update_pack2 = local_version_one == null || local_version_one.ContainAll(new Version((string)tem_one["ver"]));
string osPath = ResourcesManager.OS_Dir;
if (update_pack2)
{
// 构建资源包路径和URL
var pack_path = string.Format("{0}/asset_pack{1}.bytes", b_path_one, (string)tem_one["ver"]);
var url = "";
if (VerCheck.Instance.isGFF == false && VerCheck.Instance.isDXYGFF == false)
url = string.Format("{0}/{1}/{2}", Hotupdate.PackUrl, osPath, pack_path);
else
url = string.Format("{0}/{1}/{2}", "http://" + VerCheck.Instance.conn.ip + ":" + VerCheck.Instance.conn.port + "/NewFKN", osPath, pack_path);
url = string.Format("{0}/{1}/{2}", Hotupdate.PackUrl, osPath, pack_path);
if (Application.platform == RuntimePlatform.WindowsEditor)
Debug.Log("check_url:" + url);
// 使用HEAD请求获取文件大小
using (UnityWebRequest head = UnityWebRequest.Head(url))
{
yield return head.SendWebRequest();
#if UNITY_2020_2_OR_NEWER
if (head.result == UnityWebRequest.Result.Success)
#else
if (!head.isNetworkError && !head.isHttpError)
#endif
{
// 从响应头中获取Content-Length
string len = head.GetResponseHeader("Content-Length");
if (!string.IsNullOrEmpty(len) && long.TryParse(len, out long size))
{
totalSize += size;
tem_one["size"] = size;
yield return null;
}
else
{
Debug.LogWarning($"无法获取文件大小: {url}");
yield return 0L;
}
}
else
{
Debug.LogError($"获取文件大小失败: {head.error}");
yield return 0L;
}
}
}
}
onback(totalSize, true);
}
/// <summary>
/// 检查基本更新包的总大小(新版本,使用Hotupdate类)
/// 利用Hotupdate类的LoadAssetSize方法获取资源大小
/// </summary>
/// <param name="asset_config_list">资源配置列表</param>
/// <param name="onback">回调函数,参数为(总大小, 是否完成)</param>
/// <returns></returns>
IEnumerator VersionUpdateCheckSize2(ArrayList asset_config_list, System.Action<long, bool> onback)
{
Version local_version = Version.DEFUALT;
long totalSize = 0;
for (int i = 0; i < asset_config_list.Count; ++i)
{
var tem = asset_config_list[i] as Hashtable;
string b_path = "base/" + tem["name"].ToString();
// 创建热更新对象
Hotupdate version_update = new Hotupdate(b_path + "/", local_version, new Version((string)tem["ver"]));
version_update.AssetName = b_path;
version_update.HideDetail = true;
// 设置提示回调
version_update.SetTipCallback((text, callback) =>
{
ShowTip(text, callback);
});
// 加载资源大小信息
version_update.LoadAssetSize();
// 等待加载完成
while (!version_update.Done)
{
yield return null;
}
// 记录资源大小并累加
tem["size"] = version_update.Size;
totalSize += (long)version_update.Size;
ResourcesManager.ReadAssetConfig(b_path);
}
onback(totalSize, true);
}
/// <summary>
/// 解压下载的资源文件
/// 遍历资源配置列表,触发资源解压操作
/// </summary>
/// <param name="asset_config_list">资源配置列表</param>
/// <param name="onback">回调函数,参数为(是否完成)</param>
/// <returns></returns>
IEnumerator VersionUpdateUnZip(ArrayList asset_config_list, System.Action<bool> onback)
{
// 遍历所有资源,触发解压
for (int i = 0; i < asset_config_list.Count; ++i)
{
var tem = asset_config_list[i] as Hashtable;
string b_path = "base/" + tem["name"].ToString();
ResourcesManager.ReadAssetConfig(b_path);
yield return null;
}
onback(true);
}
#if UNITY_ANDROID
/// <summary>
/// Android平台下载新的APK安装包
/// 使用BestHTTP库进行流式下载,支持断点续传和大文件下载
/// </summary>
/// <param name="appurl">APK下载地址</param>
/// <param name="version">版本号</param>
/// <returns></returns>
IEnumerator DownApp(string appurl,string version)
{
// 获取UI元素
var v_tex_info = _version_view.GetChild("tex_info");
v_tex_info.text = "正在下载新的安装包(0KB/0KB)";
var _pd = _version_view.GetChild("pb_progress").asSlider;
// 创建HTTP请求
var request = new BestHTTP.HTTPRequest(new System.Uri(appurl));
request.EnableTimoutForStreaming = false;
request.UseStreaming = true; // 启用流式传输
request.IsKeepAlive = true;
request.Send();
// 构建本地保存路径
var filePath = Application.persistentDataPath + "/update" + version + ".apk";
// 如果文件已存在,先删除
if (File.Exists(filePath))
{
File.Delete(filePath);
}
FileStream stream = null;
// 设置下载进度回调
request.OnProgress = (originalRequest, downloaded, downloadLength) =>
{
// 更新UI显示
v_tex_info.text = string.Format("正在下载新的安装包({0}KB/{1}KB)", downloaded / 1024, downloadLength / 1024);
_pd.value = (downloaded / (float)downloadLength) * 100;
// 获取已下载的片段数据
var fragments = originalRequest.Response.GetStreamedFragments();
if (fragments != null)
{
// 创建文件流(首次调用时)
if (stream == null)
{
stream = File.Create(filePath);
}
// 写入数据片段到文件
foreach(byte[] buffer in fragments)
{
stream.Write(buffer, 0, buffer.Length);
}
}
};
// 等待下载完成
while (request.State < BestHTTP.HTTPRequestStates.Finished)
{
yield return null;
}
yield return new WaitForSeconds(1);
stream.Dispose();
request.OnProgress = null;
// 检查下载是否成功
if (request.State == BestHTTP.HTTPRequestStates.Finished && request.Response.IsSuccess)
{
// 删除旧资源包
DeleteOldPack();
// 调用Android平台接口安装APK
PlatformAndroid.Instance.UpdateApp(filePath);
}
else
{
// 下载失败,提示用户并重试
ShowTip("请检查您的网络设置!", () =>
{
StartCoroutine(DownApp(appurl, version));
});
}
}
#endif
/// <summary>
/// 显示提示信息对话框
/// 切换UI状态到提示页面,并设置确认按钮回调
/// </summary>
/// <param name="text">提示文本内容</param>
/// <param name="callback">点击确认按钮后的回调函数</param>
public void ShowTip(string text, System.Action callback)
{
// 切换到提示状态
var ctr_state = _version_view.GetController("state");
ctr_state.selectedIndex = 1;
// 设置提示文本
_version_view.GetChild("tex_tip").text = text;
// 设置确认按钮点击事件
_version_view.GetChild("btn_ok").onClick.Set(() =>
{
ctr_state.selectedIndex = 0;
if (callback != null) callback();
});
}
/// <summary>
/// 从StreamingAssets目录复制文件到持久化数据目录
/// 支持Android平台的特殊处理(APK内文件需要通过UnityWebRequest读取)
/// </summary>
/// <param name="relativePath">相对路径</param>
/// <param name="toFolder">目标文件夹,默认为persistentDataPath</param>
/// <param name="onDone">完成回调,参数为目标文件路径</param>
/// <returns></returns>
public IEnumerator CopyFromStreamingAssetsCoroutine(string relativePath, string toFolder = null, System.Action<string> onDone = null)
{
if (string.IsNullOrEmpty(toFolder)) toFolder = Application.persistentDataPath;
string sourcePath = Path.Combine(Application.streamingAssetsPath, relativePath);
string destPath = Path.Combine(toFolder, relativePath);
if (File.Exists(sourcePath))
{
yield return null;
}
// 创建目标目录
Directory.CreateDirectory(Path.GetDirectoryName(destPath));
#if UNITY_ANDROID && !UNITY_EDITOR
// Android平台: streamingAssets在APK内部,需要使用UnityWebRequest读取
using (UnityWebRequest uwr = UnityWebRequest.Get(sourcePath))
{
yield return uwr.SendWebRequest();
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.LogError("读取失败: " + sourcePath + " 错误: " + uwr.error);
onDone?.Invoke(null);
yield break;
}
byte[] data = uwr.downloadHandler.data;
File.WriteAllBytes(destPath, data);
Debug.Log("复制完成(Android): " + destPath);
onDone?.Invoke(destPath);
}
#else
// 非Android平台:直接从文件系统读取
if (!File.Exists(sourcePath))
{
Debug.LogError($"源文件不存在: {sourcePath}");
onDone?.Invoke(null);
yield break;
}
byte[] data = File.ReadAllBytes(sourcePath);
File.WriteAllBytes(destPath, data);
Debug.Log($"复制完成: {destPath}");
onDone?.Invoke(destPath);
yield break;
#endif
}
/// <summary>
/// 删除本地缓存的资源包
/// 清除version.txt和资源目录,用于强制更新或重置
/// </summary>
public static void DeleteOldPack()
{
string dir = ResourcesManager.RES_PATH;
string rv = dir + "version.txt";
if (File.Exists(rv)) File.Delete(rv);
if (Directory.Exists(dir)) Directory.Delete(dir, true);
}
}