ZWRTtt}zh#zm{@t`>hH%|lgGPu}Z}Z>pC{
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
diff --git a/wb_unity_pro/Assets/Resources/base/embed/ui/Hotupdate_fui.bytes b/wb_unity_pro/Assets/Resources/base/embed/ui/Hotupdate_fui.bytes
index 4c7e4e8225b165ec7808c14635bc3e30108b94ee..b794deb4cf6b3afdd59de332b20b35cf34474afa 100644
GIT binary patch
delta 974
zcmZ`%TT4_?6#n+vXXeZtM=_{D)AH`1!kCVkrH*5ndC#tD>Wn6qWhp@qy=l=82p2^r
zBoWn14@D95&_fZ}gV-Mkf~e`Khl2ENPHXScm6r%*CPC@|QuYkG0yt(30S;g$t?A?G|XWwAPrX{0R*tBMJ2Ci5F*=R;9
z4(Y5}x07%Zs6Ztr7IDFK78MUDEO+LaJaZgFf@`YKpkbsauIB$Sfdmn3cVW=0qH1CdxK6>kJ%Q%XDb#;7&zv-uuM^#p(
zJci>mXpM>!^vaqRC#l#oDo^1w-SG5U1L#xtO+Spv1#d~?Aci&{ock{8`1oPyrpN)x
zaVGsSrf?AqQ`DO~HKJeHC@(Wvzgg`!5!FnL8FhDtI$veXjA>?^f3n#g2W9g_(1+v5Be4iD~-oTQ1i#h#-t$5HiTY
S+Zyj%MuY0bW?X3@4Uo_Ubq+DJ@=e<-ksU)+U;B^M4V-)hFxvY{^x4*2kiu
z^+iaP9!9K!|5+Z8#E30k)2MVY?YOJb6$
z&b+*c3T-+S>k>x8H`8~mhXx{9IfctK7uoyp%Db?znbRQ
CYpoIh
diff --git a/wb_unity_pro/Assets/Scripts/HotUpdate.cs b/wb_unity_pro/Assets/Scripts/HotUpdate.cs
index 23dff037..da0b7cb3 100644
--- a/wb_unity_pro/Assets/Scripts/HotUpdate.cs
+++ b/wb_unity_pro/Assets/Scripts/HotUpdate.cs
@@ -5,6 +5,7 @@ using System.IO;
using taurus.client;
using taurus.unity;
using UnityEngine;
+using UnityEngine.Networking;
public class Version
{
@@ -321,7 +322,96 @@ public class Hotupdate {
Progress = 1;
}
-
+ public void LoadAssetSize()
+ {
+ GameApplication.Instance.StartCoroutine(__LoadAssetSize());
+ }
+
+ IEnumerator __LoadAssetSize()
+ {
+ Size = 0;
+ bool _decompression = true;
+ string dir = ResourcesManager.PACK_PATH + _base_path;
+ if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
+ string rv = dir + "version.txt";
+ Version local_version1 = GetLocalVersion(_base_path);
+ if (local_version1 != null)
+ {
+ _local_version = local_version1;
+ _decompression = _local_version.ContainAll(_server_version);
+ }
+
+ //如果没有发现本地文件,解压APP包
+ if ((_with_pack & LOCAL_PACK) != 0 && _decompression)
+ {
+
+ var path = Application.streamingAssetsPath + string.Format("/{0}/{1}asset_pack{2}.bytes", ResourcesManager.OS_Dir, _base_path, _server_version.ToString());
+#if !UNITY_EDITOR && UNITY_ANDROID
+ var www = new WWW(path);
+ yield return www;
+ var data = www.bytes;
+ www.Dispose();
+ www = null;
+#else
+ var data = File.ReadAllBytes(path);
+#endif
+
+ var zip_path = ResourcesManager.PACK_PATH + "asset_pack.bytes";
+ File.WriteAllBytes(zip_path, data);
+ data = null;
+ System.GC.Collect();
+ var finsh = false;
+ var tem_state = 0;
+ VerCheck.Instance.StartCoroutine(__UnPack(_server_version, (state) =>
+ {
+ tem_state = state;
+ finsh = state == 0;
+ }, 0.3f));
+ while (!finsh)
+ {
+ if (tem_state > 10)
+ {
+ if (__ShowTip("解压资源包时出问题,请重新下载客户端!", () =>
+ {
+ __DeleteOldPack();
+ Application.Quit();
+ }))
+ {
+ __DeleteOldPack();
+ Application.Quit();
+ }
+ yield break;
+ }
+ yield return null;
+ }
+ local_version1 = _local_version;
+ _stage = 0.3f;
+ }
+
+ if ((_with_pack & SERVER_PACK) != 0)
+ {
+ var update_pack2 = local_version1 == null || local_version1.ContainAll(_server_version);
+
+ if (update_pack2)
+ {
+ var down = false;
+ var _ratio = 1 - _stage;
+ VerCheck.Instance.StartCoroutine(GetAssetSize((size) =>
+ {
+ Size = size;
+ down = true;
+ }, _server_version));
+ while (!down)
+ {
+ yield return null;
+ }
+ }
+ }
+
+ Done = true;
+ Progress = 1;
+ }
+
IEnumerator __UnPack(Version version,System.Action onback, float ratio)
{
TextTip = "正在解压资源包不消耗流量,请耐心等待";
@@ -424,6 +514,60 @@ public class Hotupdate {
}
}
+ IEnumerator GetAssetSize(System.Action downcall, Version version)
+ {
+ var pack_path = string.Format("{0}asset_pack{1}.bytes", _base_path, version.ToString());
+
+ string osPath = ResourcesManager.OS_Dir;
+#if UNITY_ANDROID && !UNITY_EDITOR
+ if (GameApplication.Instance.isAndroid64bit == false)
+ {
+ //if (isBuild32lua)
+ //{
+ // osPath=osPath+"32";
+ //}
+ osPath=osPath+"32";
+ }
+#endif
+
+ 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);
+ 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
+ {
+ string len = head.GetResponseHeader("Content-Length");
+ if (!string.IsNullOrEmpty(len) && long.TryParse(len, out long size))
+ {
+ if (downcall != null) downcall(size);
+ yield return null;
+ }
+ else
+ {
+ Debug.LogWarning($"无法获取文件大小: {url}");
+ yield return 0L;
+ }
+ }
+ else
+ {
+ Debug.LogError($"获取文件大小失败: {head.error}");
+ yield return 0L;
+ }
+ }
+ }
+
bool __ShowTip(string text,System.Action callback)
{
if (this._tip_callback != null)
@@ -456,4 +600,9 @@ public class Hotupdate {
{
get;set;
}
+
+ public float Size
+ {
+ get; set;
+ }
}
diff --git a/wb_unity_pro/Assets/Scripts/VerCheck.cs b/wb_unity_pro/Assets/Scripts/VerCheck.cs
index 266e32af..cbb74046 100644
--- a/wb_unity_pro/Assets/Scripts/VerCheck.cs
+++ b/wb_unity_pro/Assets/Scripts/VerCheck.cs
@@ -180,13 +180,13 @@ public class VerCheck : MonoBehaviour
while (request1!=null && request1.isDone==false)
{
//Debug.LogError("wwwwwwwwwwwwwwwwwww11111111111111111111111");
- if(processdownTimeOut)
+ if (Time.time-timeOut>downTimeOut)
{
ShowTip("资源配置下载失败,请检查您的网络设置!", () =>
@@ -282,6 +282,8 @@ public class VerCheck : MonoBehaviour
IEnumerator CheckAssetConfig(Version server_version)
{
GObject v_tex_info = _version_view.GetChild("tex_info");
+ GObject v_tex_info_check = _version_view.GetChild("tex_info_check");
+ Transition t_check = _version_view.GetTransition("check");
Version local_version = Hotupdate.GetLocalVersion(string.Empty);
ArrayList asset_config_list = null;
string asset_config_text = null;
@@ -337,27 +339,64 @@ public class VerCheck : MonoBehaviour
yield break;
}
//
- v_tex_info.text = "正在检查资源。。。";
+ 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;
+ }));
+ t_check.Play(-1, 0, () => { });
+ while (!size_check)
+ {
+ yield return null;
+ }
+ t_check.Stop();
+ v_tex_info_check.text = string.Empty;
+ Debug.Log($"总大小:{(total_size / 1024f / 1024f):F2} MB");
bool ver_check = false;
StartCoroutine(VersionUpdateCheck(asset_config_list, (progress, finish) =>
{
- _pd.value = progress * 100f;
- ver_check = finish;
- }, v_tex_info));
+ 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;
+ }));
+ t_check.Play(-1, 0, () => { });
+ while (!unZip_check)
+ {
+ yield return null;
+ }
+ t_check.Stop();
+ v_tex_info_check.text = string.Empty;
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
{
@@ -418,7 +457,7 @@ public class VerCheck : MonoBehaviour
}
GameApplication.AppVersion.FillData(server_version);
- v_tex_info.text = "正在加载资源请稍后。。";
+ //v_tex_info.text = "正在加载资源请稍后。。";
//ResourcesManager.Init();
yield return null;
_version_view.Dispose();
@@ -431,35 +470,20 @@ public class VerCheck : MonoBehaviour
///
///
///
+ ///
///
- IEnumerator VersionUpdateCheck(ArrayList asset_config_list, System.Action onback, FairyGUI.GObject tip)
+ IEnumerator VersionUpdateCheck(ArrayList asset_config_list, System.Action 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;
- //if (GameApplication.HideSdk)
- //{
- // if (!tem.ContainsKey("check")) continue;
- // if (!(bool)tem["check"]) continue;
- //}
-
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;
- #if UNITY_ANDROID && !UNITY_EDITOR
- //if (GameApplication.Instance.isAndroid64bit==false)
- //{
- // if (tem["name"].ToString()=="base_script")
- // {
- // version_update.isBuild32lua = true;
- // }
- //}
-#endif
-
-
version_update.SetTipCallback((text,callback)=>
{
@@ -468,15 +492,126 @@ public class VerCheck : MonoBehaviour
version_update.LoadAsset();
while (!version_update.Done)
{
- onback(version_update.Progress, false);
- tip.text = version_update.TextTip;
+ 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);
}
+ ///
+ /// 检查基本更新包大小
+ ///
+ ///
+ ///
+ ///
+ ///
+ IEnumerator VersionUpdateCheckSize(ArrayList asset_config_list, System.Action 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)
+ {
+ 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);
+ 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
+ {
+ 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);
+ }
+
+ IEnumerator VersionUpdateCheckSize2(ArrayList asset_config_list, System.Action 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);
+ }
+ ///
+ /// 解压下载的资源文件
+ ///
+ ///
+ ///
+ ///
+ IEnumerator VersionUpdateUnZip(ArrayList asset_config_list, System.Action 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
IEnumerator DownApp(string appurl,string version)
{
diff --git a/wb_unity_pro/Assets/Source/Generate/HotupdateWrap.cs b/wb_unity_pro/Assets/Source/Generate/HotupdateWrap.cs
index dca256c1..df0fa1af 100644
--- a/wb_unity_pro/Assets/Source/Generate/HotupdateWrap.cs
+++ b/wb_unity_pro/Assets/Source/Generate/HotupdateWrap.cs
@@ -9,6 +9,7 @@ public class HotupdateWrap
L.BeginClass(typeof(Hotupdate), typeof(System.Object));
L.RegFunction("GetLocalVersion", GetLocalVersion);
L.RegFunction("LoadAsset", LoadAsset);
+ L.RegFunction("LoadAssetSize", LoadAssetSize);
L.RegFunction("SetTipCallback", SetTipCallback);
L.RegFunction("New", _CreateHotupdate);
L.RegFunction("__tostring", ToLua.op_ToString);
@@ -18,6 +19,7 @@ public class HotupdateWrap
L.RegVar("HideDetail", get_HideDetail, set_HideDetail);
L.RegVar("Progress", get_Progress, set_Progress);
L.RegVar("Done", get_Done, set_Done);
+ L.RegVar("Size", get_Size, set_Size);
L.EndClass();
}
@@ -90,6 +92,22 @@ public class HotupdateWrap
}
}
+ [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
+ static int LoadAssetSize(IntPtr L)
+ {
+ try
+ {
+ ToLua.CheckArgsCount(L, 1);
+ Hotupdate obj = (Hotupdate)ToLua.CheckObject(L, 1);
+ obj.LoadAssetSize();
+ return 0;
+ }
+ catch (Exception e)
+ {
+ return LuaDLL.toluaL_exception(L, e);
+ }
+ }
+
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int SetTipCallback(IntPtr L)
{
@@ -221,6 +239,25 @@ public class HotupdateWrap
}
}
+ [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
+ static int get_Size(IntPtr L)
+ {
+ object o = null;
+
+ try
+ {
+ o = ToLua.ToObject(L, 1);
+ Hotupdate obj = (Hotupdate)o;
+ float ret = obj.Size;
+ LuaDLL.lua_pushnumber(L, ret);
+ return 1;
+ }
+ catch(Exception e)
+ {
+ return LuaDLL.toluaL_exception(L, e, o, "attempt to index Size on a nil value");
+ }
+ }
+
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int set_isBuild32lua(IntPtr L)
{
@@ -334,5 +371,24 @@ public class HotupdateWrap
return LuaDLL.toluaL_exception(L, e, o, "attempt to index Done on a nil value");
}
}
+
+ [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
+ static int set_Size(IntPtr L)
+ {
+ object o = null;
+
+ try
+ {
+ o = ToLua.ToObject(L, 1);
+ Hotupdate obj = (Hotupdate)o;
+ float arg0 = (float)LuaDLL.luaL_checknumber(L, 2);
+ obj.Size = arg0;
+ return 0;
+ }
+ catch(Exception e)
+ {
+ return LuaDLL.toluaL_exception(L, e, o, "attempt to index Size on a nil value");
+ }
+ }
}