using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using Gameplay; using Gameplay.SubSystems; using PhxhSDK; using UnityEngine; using UnityEngine.SceneManagement; /// /// 游戏场景的通用业务逻辑 /// public class GameSceneHelper : Singlenton { public enum EnumScene { GameStart, // 登录场景 GameMain, // 主场景 GameLevel // 关卡(战场)场景 } public const string SCENE_PREFIX = "Assets/Scenes/"; public const string START_SCENE_NAME = "StartScene"; public const string LEVEL_SCENE_NAME = "LevelScene"; public const string MAIN_SCENE_NAME = "MainScene"; public const string SCENE_SUFFIX = ".unity"; private Dictionary _uiViewSceneDic = new(); public async UniTask ChangeScene(EnumScene enumScene) { string sceneName = SCENE_PREFIX; switch (enumScene) { case EnumScene.GameStart: sceneName += START_SCENE_NAME; break; case EnumScene.GameMain: sceneName += MAIN_SCENE_NAME; break; case EnumScene.GameLevel: sceneName += LEVEL_SCENE_NAME; break; default: DebugUtil.LogError("{0}.ChangeScene, {1} has no scene name matched", GetType(), enumScene); sceneName += START_SCENE_NAME; break; } sceneName += SCENE_SUFFIX; await GameSceneManager.Instance.LoadSceneAsync(sceneName); return LoadingResult.Success; } /// /// 打开UI预览场景,当某个UI需要单独渲染场景时使用(如PVP布阵,营地等) /// 此时场景中的相机会只渲染UI场景内的物件 /// /// /// /// 打开场景后是否自动切换主相机 /// public async UniTask LoadSceneForUIView(string scenePath, LoadSceneMode mode = LoadSceneMode.Single, bool switchMainCamera = true) { var sceneHandle = await GameSceneManager.Instance.LoadSceneAsync(scenePath, mode); if (sceneHandle == null) { return null; } var scene = sceneHandle.Scene; var groundLayer = LayerMask.NameToLayer("Ground"); var UIViewLayer = LayerMask.NameToLayer("UIView"); var UIViewMask = LayerMask.GetMask("UIView", "Ground"); //调整所有物品的层级 var roots = scene.GetRootGameObjects(); foreach (var root in roots) { //将所有gameObject设置为UIView层 root.SetLayerEx(UIViewLayer, groundLayer); } //设置相机的culling mask foreach (var root in roots) { var cam = root.GetComponent(); if (!cam) continue; cam.cullingMask = UIViewMask; } //设置光源culling mask var lights = Object.FindObjectsOfType(); foreach (var light in lights) { if (light.gameObject.scene != scene) continue; light.cullingMask = UIViewMask; } //切换全局GI SceneManager.SetActiveScene(scene); if (switchMainCamera) { var sceneMainCamera = sceneHandle.SceneMainCamera; CameraManager.Instance.SwitchMainCamera(sceneMainCamera); } _uiViewSceneDic.Add(scenePath, switchMainCamera); return sceneHandle; } public async UniTask UnLoadSceneForUIView(string scenePath) { if (!_uiViewSceneDic.TryGetValue(scenePath, out var switchMainCamera)) { DebugUtil.LogError($"没有加载过场景!scenePath:{scenePath}"); return; } await GameSceneManager.Instance.UnLoadSceneAsync(scenePath); if (switchMainCamera) { CameraManager.Instance.RevertMainCamera(); } _uiViewSceneDic.Remove(scenePath); } }