using System.Collections; using Thousandto.Cfg.UpdateData; using Thousandto.CoreSDK; using Thousandto.Launcher.Form; using Thousandto.Update.Enum; using Thousandto.Update.Flow; using Thousandto.Update.Manager; using Thousandto.UpdateForm.Center; using UnityEngine; using UnityEngine.Gonbest.MagicCube; using EventManager = UnityEngine.Gonbest.MagicCube.EventManager; using PreLoadEventDefine = UnityEngine.Gonbest.MagicCube.PreLoadEventDefine; namespace Thousandto.UpdateForm.Form { /// /// 更新界面 /// public class UIUpdateForm : MonoBehaviour { #region //UI控件 UILauncherMainForm _mainForm; #endregion #region //私有成员 private PlatformType _pType = PlatformType.Windows; #endregion #region //继承MonoBehaviour函数 void Awake() { FindAllComponents(); InitPath(); } void Start() { RegEvents(); CheckNetWork(StartUpdate); } void Update() { UpdateManager.Instance.Update(); if (UpdateManager.Instance.Running() && _mainForm != null && _mainForm.IsInitliazed) { if (UpdateManager.Instance.CurrentFlow == null) return; string url = ""; int total = 0; int progressValue = 0; bool useDownload = false; UpdateManager.Instance.GetDownloadInfo(out url, out total, out progressValue, out useDownload); _mainForm.Downloading.TotalSize = total; _mainForm.Downloading.DownSize = progressValue; _mainForm.UseLoadStyle = useDownload ? LoadStyleCode.Download : LoadStyleCode.Real; } } void OnDestroy() { UnRegEvents(); Resources.UnloadUnusedAssets(); UnityEngine.Debug.Log("OnDestroy : UIUpdateForm"); } #endregion #region //事件注册 private void RegEvents() { EventManager.SharedInstance.RegFixEventHandle(PreLoadEventDefine.EID_STEP_START, OnStepStart); } private void UnRegEvents() { EventManager.SharedInstance.UnRegFixEventHandle(PreLoadEventDefine.EID_STEP_START, OnStepStart); } private void OnStepStart(object dat, object sender) { _mainForm.FakeLoading.SetStep((int)dat); } #endregion #region //私有功能函数 //初始化路径信息 private void InitPath() { _pType = PlatformType.Windows; switch (LauncherUpdate.RumtimePlatform) { case MyRuntimePlatform.AndroidEditor: case MyRuntimePlatform.IOSEditor: case MyRuntimePlatform.StandaloneEditor: Thousandto.Update.Trans.TransAndroidResource.ForTest = true; break; case MyRuntimePlatform.Android: _pType = PlatformType.Android; break; case MyRuntimePlatform.IOS: _pType = PlatformType.IOS; break; case MyRuntimePlatform.Standalone: _pType = PlatformType.Windows; break; default: #if UNITY_EDITOR //正式接入的时候要去掉这个 Thousandto.Update.Trans.TransAndroidResource.ForTest = true; #elif UNITY_ANDROID _pType = PlatformType.Android; #elif UNITY_IPHONE _pType = PlatformType.IOS; #else _pType = PlatformType.Windows; #endif break; } //IOS设置Document下路径不做云备份 #if UNITY_IPHONE //ios设置nobackup string iosStreamingPath = PathUtils.GetReleaseResRootPath(); if (!System.IO.Directory.Exists(iosStreamingPath)) { System.IO.Directory.CreateDirectory(iosStreamingPath); } UnityEngine.iOS.Device.SetNoBackupFlag(iosStreamingPath); UnityEngine.Debug.Log("---SetNoBackupFlag---设置文件路径不备份到iCloud:" + iosStreamingPath); #endif } //退出游戏 private void ExitGame() { //没初始化成功,直接退出游戏 if (!FuncellSDK.Instance.IsSDKInitFinish()) { Application.Quit(); return; } if (!FuncellSDK.Instance.ExitGame()) { Application.Quit(); } } //判断网络 private void CheckNetWork(EventDelegate.Callback callback) { //判断网络状态 if (LauncherUpdate.IsNetworkEnable()) { //if (LauncherUpdate.Is4G()) //{ // UIMsgBoxForm.Open(UpdateCfgData.C_UIUpdateForm_text_167_0, UpdateCfgData.C_UIUpdateForm_text_167_1, UpdateCfgData.C_UIUpdateForm_text_167_2, callback, ExitGame); //} //else { callback(); } } else { _mainForm.ShowMessage(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_176_0), UpdateCfgData.C_UIUpdateForm_text_176_1, UpdateCfgData.C_UIUpdateForm_text_474_0, x => { if (x == 2) { callback(); } else { ExitGame(); } }); } } /// /// 查找UI上各个控件 /// private void FindAllComponents() { _mainForm = gameObject.GetComponent(); if (_mainForm == null) _mainForm = gameObject.AddComponent(); _mainForm.Initialize(); _mainForm.HideAll(); _mainForm.ShowLauncher(); _mainForm.FakeLoading.StepNames = UpdateStringUtils.GetEnterGameStepNames(); _mainForm.FakeLoading.SetMaxStep(6); _mainForm.FakeLoading.Start(true); _mainForm.Downloading.OnRunningHandler = UpdateManager.Instance.Running; } #region //更新流程的回调处理 /// /// 每个流程开始时调用 /// /// private void onFlowBeginCallback(object obj) { if (UpdateManager.Instance.CurrentFlow == null) { _mainForm.UseLoadStyle = LoadStyleCode.Fake; return; } else { string appVers = ""; string resVers = ""; UpdateManager.Instance.GetVersionInfo(out appVers, out resVers); _mainForm.VerPanel.SetData(appVers, resVers); string url = ""; int total = 0; int progressValue = 0; bool useDownload = false; UpdateManager.Instance.GetDownloadInfo(out url, out total, out progressValue, out useDownload); _mainForm.Downloading.DownSize = progressValue; _mainForm.Downloading.TotalSize = total; _mainForm.Downloading.StepName = UpdateStringUtils.GetFlowName(UpdateManager.Instance.GetCurFlowType()); } } /// /// 更新结束 /// /// true:成功;false:失败 /// 返回码 private void FinishCallback(bool result, int ret) { string msg = UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_451_0) + " result=" + result + " ret = " + ret; Debug.Log(msg); //再调一次收尾,最后显示的进度 string url = ""; int total = 0; int progressValue = 0; bool useDownload = false; if (UpdateManager.Instance.CurrentFlow != null) { UpdateManager.Instance.GetDownloadInfo(out url, out total, out progressValue, out useDownload); _mainForm.Downloading.DownSize = progressValue; _mainForm.Downloading.TotalSize = total; _mainForm.Downloading.StepName = UpdateStringUtils.GetFlowName(UpdateManager.Instance.GetCurFlowType()); _mainForm.Downloading.Refresh(); } if (result) { if (ret == CodeDefine.RET_SKIP_BY_DOWNLOAD_APP) { return; } _mainForm.UseLoadStyle = LoadStyleCode.Fake; //初始化进度 _mainForm.FakeLoading.Start(true); EventManager.SharedInstance.PushFixEvent(PreLoadEventDefine.EID_STEP_START, 0); ////////////不判断sdk是否初始化完了,状态并不稳定///////////// #if !UNITY_EDITOR if (FuncellSDK.Instance.IsSDKInitFinish()) #endif { StartCoroutine(AssemblyLoader.EnterGame()); } #if !UNITY_EDITOR else { //在这里等待sdk初始化完成 StartCoroutine(WaitSDKStatus(true)); } #endif } else { //更新失败的话弹出错误 msg = string.Format(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_469_0), UILauncherLangScript.ConvertLanText(UpdateStringUtils.GetErrorMsg(ret))); if (!LauncherUpdate.IsNetworkEnable()) { msg = UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_472_0); } //这里第二次检测网络有问题了,直接退出游戏 _mainForm.ShowMessage(msg, UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_474_1), null, x => { Application.Quit(); //CheckNetWork(UpdateManager.Instance.Restart); }); } } //等待sdk初始化,如果到这里都没有初始化成功,则判定失败,不能进游戏 IEnumerator WaitSDKStatus(bool needReInitSDK) { yield return null; float timer = 0; while (!CoreSDK.FuncellSDK.Instance.IsSDKInitFinish()) { yield return null; if (needReInitSDK) { CoreSDK.FuncellSDK.Instance.ReInitSDK(); needReInitSDK = false; UnityEngine.Debug.Log("Do Reinit SDK !!!"); } timer += Time.deltaTime; if (timer >= 30) { _mainForm.FakeLoading.Stop(); _mainForm.ShowMessage(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_Net_Error), UpdateCfgData.C_UIUpdateForm_text_474_1, UpdateCfgData.C_UIUpdateForm_Wait_More, x => { if (x == 2) { _mainForm.FakeLoading.Start(false); StartCoroutine(WaitSDKStatus(false)); } else { Application.Quit(); } }); yield break; } } yield return new WaitForSeconds(1); yield return AssemblyLoader.EnterGame(); } //转移成功后清理一下资源 private void OnTransResourceFinish(bool success) { Caching.ClearCache(); } /// /// 客户端下载完成 /// Android:直接安装 /// IOS:跳转到url /// PC:不处理 /// /// private void OnClientDownloadFinish(bool success) { return; //string msg = UpdateCfgData.C_UIUpdateForm_text_609_0 + " success=" + success; if (UpdateManager.Instance.GetPlatformType() == PlatformType.IOS) { string clientUrl = UpdateManager.Instance.GetClientUrl(); Debug.Log("ios平台,跳转到url: " + clientUrl); //Application.OpenURL(clientUrl); CoreSDK.FuncellSDK.Instance.InstallApp(clientUrl); } else if (UpdateManager.Instance.GetPlatformType() == PlatformType.Android) { //CoreSDK.FuncellSDK.Instance.InstallApp(UpdateManager.Instance.GetApkPath()); CoreSDK.FuncellSDK.Instance.InstallApp(UpdateManager.Instance.GetClientUrl()); } } private int OnDownClientFunc(string url, string storeDir) { Application.OpenURL(UpdateManager.Instance.GetClientUrl()); //CoreSDK.FuncellSDK.Instance.InstallApp(UpdateManager.Instance.GetClientUrl()); return CodeDefine.RET_SKIP_BY_DOWNLOAD_APP; } /// /// 下载前的提示,比如弹出下载提示框,如果不需要,直接Resume即可 /// /// private void OnDownloadNotice(int size) { string msg = null; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_646_0)); sb.Append("\n"); if (size < 1024 * 1024) { msg = string.Format(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_646_KB), size / 1024 + "KB"); //KB } else msg = string.Format(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_646_KB), (int)size / 1024 / 1024 + "MB"); //MB sb.Append(msg); sb.Append("\n"); //需要本地存储空间,+500MB sb.Append(string.Format(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_text_NeedSpace), (int)((size + 512 * 1024 * 1024) / 1024 / 1024))); sb.Append("\n"); sb.Append(UILauncherLangScript.ConvertLanText(UpdateCfgData.C_UIUpdateForm_SUGGEST_WIFI)); _mainForm.ShowMessage(sb.ToString(), UpdateCfgData.C_UIUpdateForm_text_648_1, UpdateCfgData.C_UIUpdateForm_text_648_0, x => { if (x == 2) { UpdateManager.Instance.CurrentFlow.Resume(true); } else { Debug.LogError("退出游戏"); Application.Quit(); } } ); } #endregion #endregion #region //公有功能函数 public void StartUpdate() { #if UNITY_WEBGL Debug.Log("Skip Update!!"); //如果当前是WebGL则直接跳过更新 FinishCallback(true,1); #else Debug.Log("StartUpdate++++"); if (UpdateManager.Instance.Running()) { Debug.Log("running!!! return"); return; } //IOS需要读取包内xml的地址 string inAppLocalXmlPath = PathUtils.GetAppConfigFilePath("LocalVersion.xml"); //释放目录的xml string localXmlPath = PathUtils.GetConfigFilePath("LocalVersion.xml"); //释放目录的根目录 string storeDir = PathUtils.GetReleaseResRootPath(); //进入测试流程用到的数据 string imeiOrMacOrIdfa = MachineUUID.Value; UnityEngine.Debug.Log("imeiOrMacOrIdfa : " + imeiOrMacOrIdfa); //打包的时候写在代码里面的版本 string inAppClientVersion = "1.0.0.0"; if (AppManager.Instance.LocalVersionData.ContainsKey("local_app_version")) { inAppClientVersion = AppManager.Instance.LocalVersionData["local_app_version"]; } //打包的时候写在代码里面的分段版本 string inAppBaseVersion = "1"; if (AppManager.Instance.LocalVersionData.ContainsKey("local_base_res_version")) { inAppBaseVersion = AppManager.Instance.LocalVersionData["local_base_res_version"]; } //apk或者ipa所在路径,安装路径。Unity中通过Application.streamingAssetsPath获取 string installedPath = AppManager.Instance.AppPath; Debug.Log(string.Format("localXmlPath={0} \ninAppLocalXmlPath={1} \nstoreDir={2}", localXmlPath, inAppLocalXmlPath, storeDir)); Debug.Log(string.Format("AppVer = {0} BaseResVer = {1}", inAppClientVersion, inAppBaseVersion)); string[] backupCdnArray = null; int cpuCoreCount = SystemInfo.processorCount; //因为下载对游戏运行的影响太多,所以把下载线程数调整为2个. cpuCoreCount = 2; //注册日志回调 UpdateManager.Instance.RegisterLog(Debug.Log, Debug.LogWarning, Debug.LogError); UpdateManager.Instance.Initialize(localXmlPath, inAppLocalXmlPath, installedPath, storeDir, _pType, true, cpuCoreCount); //设置进入测试流程的条件 UpdateManager.Instance.SetImeiOrMacOrIdfa(imeiOrMacOrIdfa); //设置资源转移的路径和版本信息 UpdateManager.Instance.SetTransData(inAppClientVersion, inAppBaseVersion, installedPath, OnTransResourceFinish); //设置备份的cdn,主要是台湾版本要用 UpdateManager.Instance.SetBackupCdn(backupCdnArray); //设置客户端下载完成的回调 UpdateManager.Instance.SetClientDownClientFunc(OnClientDownloadFinish, OnDownClientFunc); //设置下载提示的回调 UpdateManager.Instance.SetDownloadNoticeFunc(OnDownloadNotice); //设置每个流程的回调 UpdateManager.Instance.SetOnFlowBeginCallback(onFlowBeginCallback); //设置更新流程结束的回调函数 UpdateManager.Instance.SetFinishCallback(FinishCallback); UpdateManager.Instance.SetSceneReferenceResConfigPath("Assets/GameAssets/Resources/SceneConfig"); //开始更新流程 UpdateManager.Instance.StartUpdate(); Debug.Log("StartUpdate---"); #endif } #endregion } }