miduo_client/Assets/Scripts/GameInit/UpdatePanel.cs

497 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 热更新面板
/// </summary>
public class UpdatePanel : MonoBehaviour
{
/// <summary>
/// 提示文字
/// </summary>
[SerializeField]
Text tipsText;
/// <summary>
/// 进度条
/// </summary>
[SerializeField]
SliderCtrl slider;
[SerializeField]
UpdateMsgBox msgBox;
AssetBundle bundle;
void Awake()
{
msgBox.gameObject.SetActive(false);
//StartCoroutine(GetGameConfig());
//BeginUpdatePlatform();
}
public IEnumerator LoadFromStream(Action<Sprite> 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<Image>();
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);
// 用户隐私协议
TryGetUserAgree(() =>
{
BeginUpdatePlatform();
});
}));
}
private void TryGetUserAgree(Action a)
{
// 判断是否需要显示用户隐私界面
Boolean needUserAgree = ConfigManager.Instance.IsSettingActive("APP_START_USER_AGREE");
if (!needUserAgree)
{
if (a != null)
{
a();
}
return;
}
// 判断是否已经同意
bool isAgree = PlayerPrefs.GetInt("APP_IsAgreeUser", 0) == 1;
if (isAgree)
{
if (a != null)
{
a();
}
return;
}
// 没同意则弹窗提示
string proto = "在您使用我们(猕猴桃)的服务前,请您务必审慎阅读、" +
"充分理解<color=#00A7FF>猕猴桃用户协议</color>和<color=#00A7FF>猕猴桃隐私政策</color>的各条款。" +
"<color=#FFFAD4><b>同时,您应特别注意前述协议中免除或者限制我们责任的条款、对您权利进行限制的、约定争议解决方式和司法管辖的条款。" +
"</b></color>如您已经详细阅读并同意<color=#00A7FF>猕猴桃用户协议</color>和<color=#00A7FF>猕猴桃隐私政策</color>" +
"请点击“同意”开始使用我们的服务。";
msgBox.ShowProto("不同意", "同意", proto, (r1) =>
{
if (r1 == 1)
{
string grant = "为确保您的游戏体验,我们将在您使用我们的服务过程中申请以下权限,届时您可以选择同意或者拒绝开启相关权限,若是拒绝则会影响部分功能:" +
"\n\n" +
"<b> 储存权限 </b>" +
"我们访问您的储存权限是为了向您提供游戏截图保存功能" +
"\n\n" +
"<b> 电话权限 </b>" +
"我们访问您的电话权限是为了分析游戏的运行状态,优化游戏体验";
msgBox.ShowGrant("确定", grant,(result) =>
{
PlayerPrefs.SetInt("APP_IsAgreeUser", 1);
if (a != null)
{
a();
}
});
}
else
{
msgBox.Show("退出游戏", "查看协议", "需要同意本隐私权政策才能继续游戏,若仍不同意本隐私权政策,很遗憾我们将无法为您提供服务。", (r2) =>
{
if (r2 == 1)
{
TryGetUserAgree(a);
}
else
{
Application.Quit();
}
});
}
});
}
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<AndroidJavaObject>("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<T>(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();
}
}
/// <summary>
/// 更新游戏
/// </summary>
void BeginUpdateGame()
{
GameUpdateManager.Instance.BeginUpdate(OnGameUpdateStateChanged);
}
/// <summary>
/// 更新平台
/// </summary>
void BeginUpdatePlatform()
{
UpdateManager.Instance.UpdateResources(OnResourcesUpdateStateChanged);
}
/// <summary>
/// 游戏状态改变
/// </summary>
/// <param name="isFinish"></param>
/// <param name="state"></param>
/// <param name="param"></param>
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;
}
}
/// <summary>
/// 资源更新状态改变
/// </summary>
/// <param name="isFinish"></param>
/// <param name="state"></param>
/// <param name="param"></param>
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;
}
}
/// <summary>
/// 游戏更新进度
/// </summary>
/// <param name="progress"></param>
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"));
}
/// <summary>
/// 资源更新进度
/// </summary>
/// <param name="progress"></param>
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);
}
/// <summary>
/// 更新结束
/// </summary>
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();
}
}
}