using System; using System.IO; using System.Text; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine; using ResUpdate; using UnityEngine.Networking; namespace GameLogic { /// /// 热更新面板 /// public class UpdatePanel : MonoBehaviour { /// /// 提示文字 /// [SerializeField] Text tipsText; /// /// 进度条 /// [SerializeField] SliderCtrl slider; [SerializeField] UpdateMsgBox msgBox; AssetBundle bundle; void Awake() { msgBox.gameObject.SetActive(false); //StartCoroutine(GetGameConfig()); BeginUpdatePlatform(); } public IEnumerator LoadFromStream(Action act) { string filePath = Application.streamingAssetsPath + "/Res/PackConfig.txt"; #if UNITY_IOS filePath = "file://" + filePath; #endif XDebug.Log.l(filePath); UnityWebRequest uwr = UnityWebRequest.Get(filePath); yield return uwr.SendWebRequest(); if (uwr.isNetworkError || uwr.isHttpError) { XDebug.Log.l(uwr.error); if (act != null) { act(null); } } else { Hashtable table = MiniJSON.jsonDecode(uwr.downloadHandler.text) as Hashtable; string bgName = table["UpdatePanelBG"] as string; string texPath = Application.streamingAssetsPath + "/Res/" + bgName + ".png"; #if UNITY_IOS texPath = "file://" + texPath; #endif UnityWebRequest www = UnityWebRequestTexture.GetTexture(texPath); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { XDebug.Log.l(www.error); if (act != null) { act(null); } } else { XDebug.Log.l("load success"); Texture2D tex = ((DownloadHandlerTexture)www.downloadHandler).texture; Sprite sp = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0, 0)); if (act != null) { act(sp); } } } } private void OnEnable() { GameObject go = this.transform.Find("Canvas/LoadingScreen").gameObject; go.SetActive(false); GameObject go2 = this.transform.Find("Canvas/HighLayer").gameObject; go2.SetActive(false); Image img = this.transform.Find("Canvas/LoadingScreen/bg1").GetComponent(); img.color = new Color(1f, 1f, 1f, 0f); StartCoroutine(LoadFromStream((Sprite sp) => { if (sp != null) { img.sprite = sp; } img.color = new Color(1f, 1f, 1f, 1f); go.SetActive(true); go2.SetActive(true); })); } private void OnDestroy() { string updatePanelBg = ConfigManager.Instance.GetConfigInfo("Setting.UPDATE_PANEL_BG.value"); if (updatePanelBg != null) { if (bundle != null) bundle.Unload(true); bundle = null; } } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { if(AppConst.isSDK && App.SDKMgr.IsSupportExit()) { App.SDKMgr.ExitGame(); } else { msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CANEL), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM_CLOSE), (result) => { if (result == 1) Application.Quit(); }); } } } // void Start() // { //#if UNITY_EDITOR //#elif UNITY_ANDROID // Debug.LogError("UpdatePanel HideSplash Init SDKManager::::"); // using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // { // using (AndroidJavaObject jo = jc.GetStatic("currentActivity")) // { // jo.Call("HideSplash"); // } // } //#elif UNITY_IPHONE || UNITY_IOS //#endif // } IEnumerator GetGameConfig() { tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS); var jsonData = UpdateManager.Instance.PostServerInfo(); WWW www = new WWW(AppConst.Download_apk_Url, Encoding.UTF8.GetBytes(jsonData)); yield return www; if (string.IsNullOrEmpty(www.error)) { OnGetGameConfig(www.text); } else { Debug.LogError(www.url+" "+www.error); msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_FAILED), (result) => { StartCoroutine(GetGameConfig()); }); } www.Dispose(); } bool CheckAndConvert(Hashtable tab,string parameterName,object targetValue) { if(tab.Contains(parameterName)) { var parStr= tab[parameterName] as string; if(typeof(T) ==typeof(int)) { int intValue=0; if (int.TryParse(parStr, out intValue)) { targetValue= intValue; return true; } } else if(typeof(T) ==typeof(bool)) { if (parStr.ToLower() == "true" || parStr=="1") { targetValue = true; } } else if (typeof(T) == typeof(string)) { if (parStr!=null) { targetValue = parStr; return true; } } } return false; } void OnGetGameConfig(string config) { if (string.IsNullOrEmpty(config)) { return; } Util.LogError("gameConfig::"+config); var data = MiniJSON.jsonDecode(config) as Hashtable; if(data==null || data.Contains("error")) { msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_ERROR), (result) => { StartCoroutine(GetGameConfig()); }); return; } if (AppConst.isUpdate) { BeginUpdateGame(); } else { OnUpdateFinish(); } } /// /// 更新游戏 /// void BeginUpdateGame() { GameUpdateManager.Instance.BeginUpdate(OnGameUpdateStateChanged); } /// /// 更新平台 /// void BeginUpdatePlatform() { UpdateManager.Instance.UpdateResources(OnResourcesUpdateStateChanged); } /// /// 游戏状态改变 /// /// /// /// void OnGameUpdateStateChanged(bool isFinish, GameUpdateState state, object param) { //Debug.LogFormat("OnGameUpdateStateChanged=======>IsFinish:{0},State:{1}", isFinish, state.ToString()); switch (state) { case GameUpdateState.DownLoadGameConfigs: tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_VERSION_INFO); break; case GameUpdateState.DownLoadGameConfigsFailed: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_FAILED_CONFIRM_WIFI), (result) => { BeginUpdateGame(); }); break; case GameUpdateState.NeedUpdateApp: // msgBox.Show(); GameUpdateManager.Instance.UpdateApp(); break; case GameUpdateState.DownLoadAPKProgress: OnGameUpdateProgress(param as DownLoadProgress); break; case GameUpdateState.DownLoadAPKFailed: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNlOAD_FILE_FAILED_CONFIRM_WIFI), (result) => { GameUpdateManager.Instance.UpdateAPK(true); }); break; case GameUpdateState.Success: BeginUpdatePlatform(); break; } } /// /// 资源更新状态改变 /// /// /// /// void OnResourcesUpdateStateChanged(bool isFinish, ResourcesUpdateState state, object param) { //Debug.LogFormat("OnResourcesUpdateStateChanged=======>IsFinish:{0},State:{1}", isFinish, state.ToString()); switch (state) { case ResourcesUpdateState.GetGameConfigs: tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_SETTINGS); break; case ResourcesUpdateState.GetGameConfigsFailed: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_VERSION_FAILED_CONFIRM_WIFI), (result) => { BeginUpdatePlatform(); }); break; case ResourcesUpdateState.DownLoadVersionFiles: tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CHECK_RESOURCES_FILE); break; case ResourcesUpdateState.DownLoadVersionFilesFailed: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_SETTINGS_FAILED_CONFIRM_WIFI), (result) => { BeginUpdatePlatform(); }); break; case ResourcesUpdateState.DownLoadFromNoWifi: slider.SetValue(0f); float size = 1f * (long)(param as object[])[0] / 1024 / 1024; Action startDownAction = (param as object[])[1] as Action; string msg = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.NOT_WIFI_CONFIRM), size); msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), msg, (result) => { startDownAction(); }); break; case ResourcesUpdateState.DownLoadWithWifi: slider.SetValue(0f); float size2 = 1f * (long)(param as object[])[0] / 1024 / 1024; Action startDownAction2 = (param as object[])[1] as Action; string msg2 = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.WIFI_CONFIRM), size2); msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), msg2, (result) => { startDownAction2(); // 打点 - 开始更新 SDK.SdkCustomEvent.CustomEvent("Load-updates"); }); break; case ResourcesUpdateState.UpdateResourcesProgress: OnResUpdateProgress(param as ResUpdateProgress); break; case ResourcesUpdateState.UpdateResourcesFailed: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNlOAD_RESOURCES_FILE_FAILED_CONFIRM_WIFI), (result) => { BeginUpdatePlatform(); }); break; case ResourcesUpdateState.Success: string version = (string)param; VersionManager.Instance.SaveVersion(version); OnUpdateFinish(); // 打点 - 更新完成 SDK.SdkCustomEvent.CustomEvent("End-loading"); break; case ResourcesUpdateState.OldPackageNeedChange: msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_NEWEST_APP)); break; } } /// /// 游戏更新进度 /// /// void OnGameUpdateProgress(DownLoadProgress progress) { slider.UpdateValue(progress.Progress); tipsText.text = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_PROGRESS_RATE), progress.SizeMB.ToString("f2"), progress.TotalSizeMB.ToString("f2"),progress.LoadSpeed.ToString("f2")); } /// /// 资源更新进度 /// /// void OnResUpdateProgress(ResUpdateProgress progress) { slider.UpdateValue(progress.Progress); tipsText.text = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_PROGRESS), progress.SizeMB.ToString("f2"), progress.TotalSizeMB.ToString("f2"), (progress.SizeMB/progress.TotalSizeMB)*100); } /// /// 更新结束 /// void OnUpdateFinish() { tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.UPDATE_COMPLETE); slider.SetValue(1f); StartCoroutine(LoadGlobalRes()); } IEnumerator LoadGlobalRes() { tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RELOAD_RESOURCES); slider.SetValue(0f); GlobalResLoader loader = new GlobalResLoader(); loader.LoadGlobalRes(null); while (!loader.IsLoadFinish) { slider.UpdateValue(loader.Progress); yield return 1; } slider.SetValue(1f); yield return new WaitForSeconds(0.1f); yield return UpdateFinish(); } IEnumerator UpdateFinish() { yield return new WaitForSeconds(0.2f); App.Instance.StartUp(); yield return new WaitForSeconds(1f); DestroyImmediate(this.gameObject); UpdateManager.Instance.UnLoadUpdateAsset(); } } }