/// <summary> /// 开始加载下一个场景 /// </summary> /// <param name="scene"></param> /// <param name="res"></param> public void StartLoadScene(GameResources.SceneName scene, List <LoadResourcesModel> res, CallBack loadcall) { MaxResourcesProgressValue = 100; //重置进度条显示 ProgressSlider.value = 0; //重置进度显示 ProgressText.text = "正在加载中... 0%"; //重置资源加载进度值 ResProgressValue = 0; //重置已经加载的资源 LoadResourcesNumber = 0; //重置场景加载进度值 SceneProgressValue = 0; //重置资源加载显示进度值 ResProgress = 0; //开始加载场景 IsStartLoading = true; ProgressGameObject.SetActive(true); switch (scene) { case GameResources.SceneName.BATTLE: case GameResources.SceneName.MAIN: MaxResourcesProgressValue = 0; break; default: ProgressGameObject.SetActive(true); break; } StartCoroutine(LoadScene(scene, res, loadcall)); }
/// <summary> /// 加载场景 /// </summary> /// <param name="scene"></param> /// <returns></returns> IEnumerator LoadScene(GameResources.SceneName scene, List <LoadResourcesModel> list, CallBack loadcall = null) { //展示用的进度 int displaypro = 0; //实际的进度 int topro = 0; //开始加载下一个场景 async = SceneManager.LoadSceneAsync(GameData.Instance.SceneName[scene]); //暂时不进去下一个场景 async.allowSceneActivation = false; //yield return async; //在加载进度不足90%时,进行进度条缓动动画 while (async.progress < 0.9f) { //如果我们的显示进度尚未达到实际进度时,每帧增加百分之一 topro = (int)(async.progress * 100f); while (displaypro < topro) { displaypro++; SceneProgressValue = (int)(displaypro * 0.5f); yield return(new WaitForFixedUpdate()); } } //加载最后一段进度 topro = 100; while (displaypro < topro) { displaypro++; SceneProgressValue = displaypro / 2; yield return(new WaitForFixedUpdate()); } //加载资源 LoadResources(list); displaypro = 0; //如果我们的显示进度尚未达到实际进度时,每帧增加百分之一 while (ResProgressValue <= 100 && displaypro < MaxResourcesProgressValue) { displaypro++; ResProgress = displaypro / 2; yield return(new WaitForFixedUpdate()); } //全部加载完毕后,进入下一个场景 async.allowSceneActivation = true; //等待场景真正加载完毕 while (!async.isDone) { yield return(new WaitForFixedUpdate()); } IsStartLoading = false; //全部加载完毕后,执行回调 if (loadcall != null) { loadcall(); } //将加载页面隐藏 ProgressGameObject.SetActive(false); }
/// <summary> /// 加载场景 /// </summary> /// <param name="tag"></param> public void LoadScene(GameResources.SceneName tag) { //如果当前场景名称和要加载的场景名称一致,则直接返回 if (GameData.Instance.GameLevelName == GameData.Instance.SceneName[tag]) { return; } //要加载的资源 List <LoadResourcesModel> rModel = new List <global::LoadResourcesModel>(); //加载完成后的回调 LoadManager.CallBack call = null; switch (tag) { case GameResources.SceneName.LOGIN: { LoadResourcesModel rM = new global::LoadResourcesModel(); rM.type = GameResources.ResourceType.PREFAB; rM.path = GameResources.UIResourcesPath + GameData.Instance.CanvasName[GameResources.CanvasTag.CANVASLOGIN]; rModel.Add(rM); call = delegate() { //场景是空白场景,UI或其他资源在场景加载后进行实例化生成,添加到本场景 GameObject go = GameApp.Instance.ResourcesManagerScript.LoadInstantiateGameObject(rM.path, null, Vector3.zero); //UI和代码同样也是分离的,方便代码热更新 go.AddComponent <UI_Login>(); }; } break; case GameResources.SceneName.LOGO: { LoadResourcesModel rM = new global::LoadResourcesModel(); rM.type = GameResources.ResourceType.PREFAB; rM.path = GameResources.UIResourcesPath + GameData.Instance.CanvasName[GameResources.CanvasTag.CANVASLOGO]; rModel.Add(rM); call = delegate() { //场景是空白场景,UI或其他资源在场景加载后进行实例化生成,添加到本场景 GameObject go = GameApp.Instance.ResourcesManagerScript.LoadInstantiateGameObject(rM.path, null, Vector3.zero); //UI和代码同样也是分离的,方便代码热更新 go.AddComponent <UI_logo>(); }; } break; case GameResources.SceneName.MAIN: { LoadResourcesModel rM = new LoadResourcesModel(); rM.type = GameResources.ResourceType.PREFAB; rM.path = GameResources.UIResourcesPath + GameData.Instance.CanvasName[GameResources.CanvasTag.CANVASMAIN]; rModel.Add(rM); call = delegate() { //场景是空白场景,UI或其他资源在场景加载后进行实例化生成,添加到本场景 GameObject go = GameApp.Instance.ResourcesManagerScript.LoadInstantiateGameObject(rM.path, null, Vector3.zero); //UI和代码同样也是分离的,方便代码热更新 go.AddComponent <UI_main>(); }; } break; case GameResources.SceneName.BATTLE: { LoadResourcesModel rM = new LoadResourcesModel(); rM.type = GameResources.ResourceType.PREFAB; rM.path = GameResources.UIResourcesPath + GameData.Instance.CanvasName[GameResources.CanvasTag.CANVASBATTLE]; rModel.Add(rM); LoadResourcesModel rM1 = new LoadResourcesModel(); rM1.type = GameResources.ResourceType.PREFAB; rM1.path = GameResources.UIResourcesPath + GameData.Instance.SystemUI[GameResources.SystemUIType.CARDOTHER_TP]; rModel.Add(rM1); LoadResourcesModel rM2 = new LoadResourcesModel(); rM2.type = GameResources.ResourceType.PREFAB; rM2.path = GameResources.UIResourcesPath + GameData.Instance.SystemUI[GameResources.SystemUIType.UIFIGHT_TP]; rModel.Add(rM2); call = delegate() { //场景是空白场景,UI或其他资源在场景加载后进行实例化生成,添加到本场景 GameObject go = GameApp.Instance.ResourcesManagerScript.LoadInstantiateGameObject(rM.path, null, Vector3.zero); //UI和代码同样也是分离的,方便代码热更新 go.AddComponent <GameOther>(); }; } break; } //开始加载场景 GameApp.Instance.LoadManagerScript.StartLoadScene(tag, rModel, call); }