using System.Linq; using Gameplay; using Gameplay.SubSystems; using PhxhSDK; using UnityEngine; 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 GameSceneHelper.Instance.LoadSceneForUIView(CAMP_SCENE_PATH, LoadSceneMode.Additive); if (sceneHandle == null) { DebugUtil.LogError($"无法进入营地场景,场景不存在,scene path:{CAMP_SCENE_PATH}"); _currProcess = EProcess.None; return; } _currProcess = EProcess.LoadingUI; await UIManager.Instance.OpenWindow(UINameConst.UI_Camp); _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() { await GameSceneHelper.Instance.UnLoadSceneForUIView(CAMP_SCENE_PATH); UIManager.Instance.CloseWindow(UINameConst.UI_Camp, UIWindowCloseType.HideAndDestroy); _currProcess = EProcess.None; UIManager.Instance.ShowAllUI(); } private float GetLoadingProcess() { float progress = 0; switch (_currProcess) { case EProcess.None: break; case EProcess.LoadingScene: //加载场景只占50% progress = GameSceneManager.Instance.GetSceneLoadingProgress(CAMP_SCENE_PATH) * 50f; break; case EProcess.LoadingUI: progress = 60f; break; case EProcess.RefreshCamp: //刷新场景要加载预制体和模型等 progress = 60 + _campSceneManager.GetRefreshProcess() * 40f; break; case EProcess.Present: progress = 100; break; default: break; } //DebugUtil.Log($"progress:{progress}"); return progress; } }