IEnumerator StartLoadScene(EF_JumpSceneAnim anim) { LoadManager mLoadManager = Get <LoadManager>(EF_Manager.Load); // 1. 加载动画 Prefab string animPath = ANIM_PREFAB + anim; Base_JumpSceneAnim loadingAnim = mLoadManager.LoadPrefab(animPath).GetComponent <Base_JumpSceneAnim>(); if (null == loadingAnim) { MyLog.Red("这个是假的动画吧,取不到动画组件 —— " + anim); yield break; } yield return(0); // 2. 异步加载场景,手动跳转 AsyncOperation aso = SceneManager.LoadSceneAsync(mSceneBean.ToString()); aso.allowSceneActivation = false; // 3.加载场景过程 float displayProgress = 0; // 这个才是用来显示的进度 float toProgress = 0; // 实际进度 while (aso.progress < 0.9f) { if (displayProgress < 1) { displayProgress += 0.01f; mSceneBean.Loading(displayProgress); } yield return(0); } yield return(0); toProgress = 1; while (displayProgress < toProgress) { if (toProgress - displayProgress >= 0.2f) { displayProgress += 0.2f; } else { displayProgress += 0.5f; } if (displayProgress <= 1) { mSceneBean.Loading(displayProgress); } yield return(0); } mSceneBean.Loading(1); yield return(0); // 4.加载完搞动画 loadingAnim.IsOut = true; loadingAnim.OnReady2Do(); StartCoroutine(loadingAnim.DoLastRenderer()); // 开始渲染 float time = 0; while (loadingAnim.OnProcessAnim(time)) // 开始动画 { time += Time.deltaTime; yield return(0); } yield return(Get <UIManager>(EF_Manager.UI).ChangScene(mCurrentScene)); // 告诉 UI 切换场景了 aso.allowSceneActivation = true; // 完成动画开始跳场景 loadingAnim.IsOut = false; // 进入新的场景 loadingAnim.OnReady2Do(); time = 0; mSceneBean.Enter(); // 进入这个场景 while (loadingAnim.OnProcessAnim(time)) { time += Time.deltaTime; yield return(0); } mSceneBean.Start(); MyEventCenter.SendEvent(E_GameEvent.RealJumpIntoScene, mCurrentScene); yield return(0); mLoadManager.DestroyPrefabAll(animPath, loadingAnim.gameObject); mLoadManager.CLearRes(); // 删除上一个场景的 Res 资源 IsAniming = false; }