using System.Linq; using Gameplay; using Gameplay.SubSystems; using UnityEngine.SceneManagement; public partial class CampManager { private const string CAMP_SCENE_PATH = "Assets/Scenes/CampScene.unity"; private enum EProcess { None = 0, LoadingScene, LoadingUI, RefreshCamp, Present, } private EProcess _currProcess = EProcess.None; private CampSceneManager _campSceneManager; public async void EnterCamp() { UIManager.Instance.HideAllUI(); _currProcess = EProcess.LoadingScene; var loadingExecutor = new LoadingExecutorWithUILoadingController(); loadingExecutor.getProgress = GetLoadingProcess; LoadingExecutorManager.Instance.ExecuteLoading(loadingExecutor); var sceneHandle = await GameSceneManager.Instance.LoadSceneForUIView(CAMP_SCENE_PATH, LoadSceneMode.Additive); if (sceneHandle == null) { DebugUtil.LogError($"无法进入营地场景,场景不存在,scene path:{CAMP_SCENE_PATH}"); _currProcess = EProcess.None; return; } _currProcess = EProcess.LoadingUI; //todo打开UI _currProcess = EProcess.RefreshCamp; _campSceneManager = CommonUtils.GetSceneRootComponent(sceneHandle.Scene); if (_campSceneManager == null) { DebugUtil.LogError($"无法进入营地场景,campSceneManager不存在,scene path:{CAMP_SCENE_PATH}"); _currProcess = EProcess.None; return; } await _campSceneManager.Refresh(); _currProcess = EProcess.Present; } public async void ExitCamp() { //todo关闭UI await GameSceneManager.Instance.UnLoadSceneAsync(CAMP_SCENE_PATH); _currProcess = EProcess.None; UIManager.Instance.ShowAllUI(); } private float GetLoadingProcess() { switch (_currProcess) { case EProcess.None: return 0; case EProcess.LoadingScene: //加载场景只占50% return GameSceneManager.Instance.GetSceneLoadingProgress(CAMP_SCENE_PATH) * 50f; case EProcess.LoadingUI: return 60f; case EProcess.RefreshCamp: //刷新场景要加载预制体和模型等 return 60 + _campSceneManager.GetRefreshProcess() * 40f; case EProcess.Present: return 100; default: return 0; } } }