/// <summary> /// 进入状态 /// </summary> /// <param name="param"></param> public override void OnEnter(Param param = null) { base.OnEnter(param); // 选择沙盒路径还是流式路径 bool sandbox = App.version.Equals(Util.GetString(Const.SANDBOX_VERSION)); AssetManager.instance.url = sandbox ? App.persistentDataPath : App.streamingAssetsPath; // 获取清单文件 AsyncAsset asset = AssetManager.instance.AssetBundleLoad(AssetManager.instance.url + Const.MANIFESTFILE); if (asset != null && string.IsNullOrEmpty(asset.error)) { App.manifest = JsonReader.Deserialize <ManifestConfig>(asset.mainAsset.ToString()); AssetManager.instance.setDependentAsset = App.manifest.GetDependencies; AssetManager.instance.UnloadAssets(asset, true); } // 语言配置 asset = AssetManager.instance.Load(Const.LANG_FILE, (bResult, obj) => { if (bResult && obj != null) { ConfigManager.instance.langConfig.Init(obj.ToString()); AssetManager.instance.UnloadAssets(asset, true); } }, async: false); // 加载Loading界面 UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Request"), UILoading.SLIDER, 0F, UILoading.TEXT_DETAILS, string.Empty })); // 检测网络是否开启 InternetReachability(); }
/// <summary> /// 进入状态 /// </summary> /// <param name="param"></param> public override void OnEnter(Param param = null) { base.OnEnter(param); AssetManager.instance.UnloadAssets(true); // 获取清单文件 AsyncAsset asset = AssetManager.instance.AssetBundleLoad(AssetManager.instance.url + Const.MANIFESTFILE); if (asset != null && string.IsNullOrEmpty(asset.error)) { App.manifest = JsonReader.Deserialize <ManifestConfig>(asset.mainAsset.ToString()); AssetManager.instance.setDependentAsset = App.manifest.GetDependencies; AssetManager.instance.UnloadAssets(asset, true); } // 加载Loading界面 UIManager.instance.Clear(); UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Loading"), UILoading.SLIDER, 0F, UILoading.TEXT_DETAILS, string.Empty }), immediate: true); // 延迟启动Lua避免卡顿 Schedule.instance.ScheduleOnce(0.03F, () => { Lua instance = Lua.instance; }); }
/// <summary> /// 更新状态 /// </summary> public override void Update() { base.Update(); if (m_assetDecompressing) { m_currentRealSize = 0; int count = Mathf.Min(Const.MAX_LOADER, m_async.Count); for (int i = count - 1; i >= 0; --i) { m_currentRealSize += (float)m_async[i].userData * m_async[i].progress; } m_currentRealSize += m_currentSize; if (Time.realtimeSinceStartup >= m_time + 1F) { m_speed = m_currentRealSize - m_lastRealSize; m_lastRealSize = m_currentRealSize; m_time = Time.realtimeSinceStartup; } UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Decompressing"), UILoading.SLIDER, m_currentSize / m_size })); if (m_currentSize == m_size) { m_assetDecompressing = false; PlayerPrefs.SetString(Const.SANDBOX_VERSION, App.version); StateMachine.instance.OnEnter(new AssetUpdate()); } } }
/// <summary> /// 更新状态 /// </summary> public override void Update() { base.Update(); // 远程更新清单文件加载 if (m_www != null && m_www.isDone) { if (string.IsNullOrEmpty(m_www.error)) { m_remoteUpdateManifestMD5 = Util.GetMD5(m_www.bytes); m_remoteUpdateManifest = JsonReader.Deserialize <ManifestConfig>(m_www.assetBundle.LoadAsset <TextAsset>(Path.GetFileNameWithoutExtension(m_www.url)).text); if (m_www.assetBundle != null) { m_www.assetBundle.Unload(false); } } else { m_remoteUpdateManifest = new ManifestConfig(); } StartAssetUpdate(); m_www.Dispose(); m_www = null; } // 更新中... if (m_assetUpdating) { m_currentRealSize = 0; int count = Mathf.Min(Const.MAX_LOADER, m_async.Count); for (int i = count - 1; i >= 0; --i) { m_currentRealSize += (float)m_async[i].userData * m_async[i].progress; } m_currentRealSize += m_currentSize; if (Time.realtimeSinceStartup >= m_time + 1F) { m_speed = m_currentRealSize - m_lastRealSize; m_lastRealSize = m_currentRealSize; m_time = Time.realtimeSinceStartup; } UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Updating"), UILoading.SLIDER, m_currentSize / m_size })); if (m_currentSize == m_size) { m_assetUpdating = false; AssetUpdateComplete(); } } }
/// <summary> /// 更新 /// </summary> public override void Update() { base.Update(); if (m_www != null && m_www.isDone) { bool forceUpdate = false; if (string.IsNullOrEmpty(m_www.error)) { Dictionary <string, object> remoteVersion = JsonReader.Deserialize <Dictionary <string, object> >(m_www.text); if (remoteVersion != null) { App.Update(remoteVersion, new List <string>() { Const.VERSION }); Debugger.logEnabled = App.log; Debugger.webLogEnabled = App.webLog; string[] local = App.version.Split('.'); string[] remote = remoteVersion.ContainsKey(Const.VERSION) ? remoteVersion[Const.VERSION].ToString().Split('.') : new string[0]; if (local.Length == remote.Length) { forceUpdate = !(int.Parse(local[0]) >= int.Parse(remote[0]) && int.Parse(local[1]) >= int.Parse(remote[1])); } } } m_www.Dispose(); m_www = null; if (forceUpdate) { // 需要更新版本 Action sure = () => { Application.OpenURL(App.newVersionDownloadUrl); }; Action close = () => { Application.Quit(); }; UIManager.instance.OpenUI(Const.UI_NORMAL_TIPS_BOX, Param.Create(new object[] { UINormalTipsBox.ACTION_SURE, sure, UINormalTipsBox.TEXT_CONTENT, ConfigManager.GetLang("Version_Low"), UINormalTipsBox.ACTION_CLOSE, close })); } else { // 检测沙盒资源解压 StateMachine.instance.OnEnter(new AssetDecompressing()); } } }
/// <summary> /// 更新状态 /// </summary> public override void Update() { base.Update(); switch (m_state) { case AssetState.Ready: { if (Lua.instance.init) { StartAssetLoad(); } } break; case AssetState.Loading: { m_currentRealSize = 0; int count = Mathf.Min(Const.MAX_LOADER, m_async.Count); for (int i = count - 1; i >= 0; --i) { m_currentRealSize += (float)m_async[i].userData * m_async[i].progress; } m_currentRealSize += m_currentSize; if (Time.realtimeSinceStartup >= m_time + 1F) { m_speed = m_currentRealSize - m_lastRealSize; m_lastRealSize = m_currentRealSize; m_time = Time.realtimeSinceStartup; } UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Loading"), UILoading.SLIDER, m_currentSize / m_size })); if (m_currentSize == m_size && Lua.instance.awake) { m_state = AssetState.Complete; AssetLoadComplete(); } } break; } }
/// <summary> /// 检测网络是否开启 /// </summary> private void InternetReachability() { // 检测网络是否开启 if (App.internetReachability) { // 检测版本更新 StateMachine.instance.OnEnter(new VersionUpdate()); } else { // 网络不可达,退出 Action sure = () => { Application.Quit(); }; Action close = () => { InternetReachability(); }; UIManager.instance.OpenUI(Const.UI_NORMAL_TIPS_BOX, Param.Create(new object[] { UINormalTipsBox.ACTION_SURE, sure, UINormalTipsBox.TEXT_CONTENT, ConfigManager.GetLang("Network_Invalid"), UINormalTipsBox.ACTION_CLOSE, close })); } }
/// <summary> /// 进入状态 /// </summary> /// <param name="param"></param> public override void OnEnter(Param param = null) { base.OnEnter(param); AssetManager.instance.url = App.persistentDataPath; // 加载Loading界面 AssetManager.instance.UnloadAssets(true); UIManager.instance.Clear(); UIManager.instance.OpenUI(Const.UI_LOADING, Param.Create(new object[] { UILoading.TEXT_TIPS, ConfigManager.GetLang("Asset_Request"), UILoading.SLIDER, 0F, UILoading.TEXT_DETAILS, string.Empty }), immediate: true); // 获取本地更新清单文件 AsyncAsset async = AssetManager.instance.AssetBundleLoad(AssetManager.instance.url + Const.UPDATE_FILE); if (async != null && string.IsNullOrEmpty(async.error)) { m_localUpdateManifest = JsonReader.Deserialize <ManifestConfig>(async.mainAsset.ToString()); m_localUpdateManifestMD5 = Util.GetMD5(async.bytes); AssetManager.instance.UnloadAssets(async, true); } // 获取远程更新清单文件 m_www = new WWW(Path.Combine(Path.Combine(App.cdn + App.platform, string.Format(Const.REMOTE_DIRECTORY, App.version)), Const.UPDATE_FILE)); }
/// <summary> /// 开始资源更新 /// </summary> private void StartAssetUpdate() { bool hasAssetUpdate = false; // 更新 m_async.Clear(); if (m_remoteUpdateManifest.data.Count > 0) { // 最后一个更新清单文件是否下载 hasAssetUpdate = !m_localUpdateManifestMD5.Equals(m_remoteUpdateManifestMD5); if (hasAssetUpdate) { Action sure = () => { // 更新清单文件 AsyncAsset async = AssetManager.instance.AssetBundleAsyncLoad(Path.Combine(Path.Combine(App.cdn + App.platform, string.Format(Const.REMOTE_DIRECTORY, App.version)), Const.MANIFESTFILE), (bResult, asset) => { if (bResult) { Util.WriteAllBytes(App.assetPath + Const.MANIFESTFILE, asset.bytes); m_currentSize += (float)asset.userData; m_async.Remove(asset); } else { Debugger.LogError(asset.error); } }, dependence: false); async.userData = 0.5F; m_size += (float)async.userData; m_async.Add(async); // 更新其它文件 foreach (var data in m_remoteUpdateManifest.data.Values) { if (m_localUpdateManifest.Contains(data.name)) { if (m_localUpdateManifest.Get(data.name).MD5.Equals(data.MD5)) { continue; } else if (data.MD5.Equals(Util.GetMD5(App.assetPath + data.name))) { continue; } } async = AssetManager.instance.AssetBundleAsyncLoad(Path.Combine(Path.Combine(App.cdn + App.platform, string.Format(Const.REMOTE_DIRECTORY, App.version)), data.name), (bResult, asset) => { if (bResult) { Util.WriteAllBytes(App.assetPath + data.name, asset.bytes); m_currentSize += (float)asset.userData; m_async.Remove(asset); } else { Debugger.LogError(asset.error); } }, dependence: false); async.userData = data.size / 1024F; m_size += (float)async.userData; m_async.Add(async); } // 更新更新文件 async = AssetManager.instance.AssetBundleAsyncLoad(Path.Combine(Path.Combine(App.cdn + App.platform, string.Format(Const.REMOTE_DIRECTORY, App.version)), Const.UPDATE_FILE), (bResult, asset) => { if (bResult) { Util.WriteAllBytes(App.assetPath + Const.UPDATE_FILE, asset.bytes); m_currentSize += (float)asset.userData; m_async.Remove(asset); } else { Debugger.LogError(asset.error); } }, dependence: false); async.userData = 0.1F; m_size += (float)async.userData; m_async.Add(async); // 记录是否资源更新中 m_assetUpdating = true; m_time = Time.realtimeSinceStartup; }; Action close = () => { Application.Quit(); }; UIManager.instance.OpenUI(Const.UI_NORMAL_TIPS_BOX, Param.Create(new object[] { UINormalTipsBox.ACTION_SURE, sure, UINormalTipsBox.TEXT_CONTENT, ConfigManager.GetLang("Network_Invalid"), UINormalTipsBox.ACTION_CLOSE, close })); } } // 如果没有资源更新,就直接认为更新完成 if (!hasAssetUpdate) { AssetUpdateComplete(); } }