using PhxhSDK.Res; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace PhxhSDK { public class CameraManager : Singlenton, IInitable { /// /// 主相机 /// private Camera _mainCamera; /// /// 主相机切换回调 /// public event Action AfterSwitchMainCamera; /// /// 主相机栈 /// private Stack _usedMainCameraStack = new(); /// /// 默认的主相机RenderTexture /// private RenderTexture _defaultRenderTarget; #region 属性 public RenderTexture DefaultRenderTarget { get => _defaultRenderTarget; set { if (_defaultRenderTarget != value) { _defaultRenderTarget = value; _mainCamera.targetTexture = _defaultRenderTarget; } } } /// /// 主相机 /// public Camera MainCamera => _mainCamera; /// /// UI相机 /// public Camera UICamera { get { return UIRoot.Instance.UICamera; } } /// /// UI Top相机 /// public Camera UITopCamera { get { return UIRoot.Instance.UITopCamera; } } /// /// 技能相机 /// public Camera SkillCamera { get; private set; } #endregion public void Init() { _mainCamera = Camera.main; if (null == _mainCamera) CreateCamera("Main Camera", "MainCamera"); if (null != _mainCamera) UnityEngine.Object.DontDestroyOnLoad(MainCamera.gameObject); SkillCamera = GameObject.Find("SkillCamera").GetComponent(); SkillCamera.gameObject.SetActive(false); } public void Release() { _usedMainCameraStack.Clear(); } /// /// 创建相机 /// /// /// /// public Camera CreateCamera(string name, string tag = null) { GameObject go = new(name); Camera camera = go.AddComponent(); if (null != tag) camera.tag = tag; return camera; } public void DestroyCamera(Camera camera) { if (null != camera) UnityEngine.Object.Destroy(camera.gameObject); } /// /// 获取场景中的相机 /// /// /// /// public bool TryGetSceneCamera(SceneHandle sceneHandle, out Camera camera) { camera = null; if (null == sceneHandle) return false; if (null != sceneHandle.SceneCameraRoot) { camera = sceneHandle.SceneCameraRoot.Camera; if (null != camera) return true; } GameObject[] rootGameObjects = sceneHandle.Scene.GetRootGameObjects(); if (null == rootGameObjects || 0 >= rootGameObjects.Length) return false; GameObject gameObject = rootGameObjects.FirstOrDefault(root => root.GetComponent() != null); if (null == gameObject) return false; camera = gameObject.GetComponent(); return null != camera; } /// /// 关闭所有相机(忽略UI相机) /// public void CloseAllCameraIgnoreUI() { SetMainCameraActive(false); UITopCamera.gameObject.SetActive(false); SkillCamera.gameObject.SetActive(false); } /// /// 全部相机重新渲染 /// public void ReRenderAll() { foreach (Camera c in Camera.allCameras) { bool oldEnabled = c.enabled; c.enabled = true; c.Render(); c.enabled = oldEnabled; } } /// /// 设置主相机的激活状态 /// /// public void SetMainCameraActive(bool isActive) { _mainCamera?.gameObject.SetActive(isActive); } /// /// 设置UITop相机的激活状态 /// /// public void SetUITopCameraOpen(bool isOpen = false) { UITopCamera.gameObject.SetActive(isOpen); } /// /// 检查主相机是否激活 /// /// public bool CheckMainCameraIsActive() { if (!_mainCamera) return false; return _mainCamera.gameObject.activeSelf; } /// /// 切换主相机 /// /// public void SwitchMainCamera(Camera camera) { if (null == camera || camera == _mainCamera) return; _usedMainCameraStack.Push(_mainCamera); _SwitchCameraPurely(camera); } /// /// 还原主相机 /// public void RevertMainCamera() { // DebugUtil.LogError("还原相机"); if (_usedMainCameraStack.Count == 0) { DebugUtil.LogError($"_usedMainCameraStack count is 0"); return; } Camera _lastMainCamera = GetOutMostCameraInStack(); if (_lastMainCamera == null) { DebugUtil.LogError($"相机栈中找不到旧的使用过的主相机"); return; } _SwitchCameraPurely(_lastMainCamera); } private void _SwitchCameraPurely(Camera camera) { if (null == camera || _mainCamera == camera) return; Camera currCamera = _mainCamera; if (null != currCamera) DeActiveMainCamera(currCamera); _mainCamera = camera; ActiveMainCamera(_mainCamera); AfterSwitchMainCamera?.Invoke(_mainCamera); } private Camera GetOutMostCameraInStack() { Camera result = null; int popCount = 1; foreach (Camera camera in _usedMainCameraStack) { //可能会出现之前使用过的相机已经销毁的情况 if (camera == null) popCount++; else { result = camera; break; } } popCount = popCount > _usedMainCameraStack.Count ? _usedMainCameraStack.Count : popCount; for (int i = 0; i < popCount; i++) { _usedMainCameraStack.Pop(); } return result; } /// /// 激活主相机 /// /// private void ActiveMainCamera(Camera cam) { cam.gameObject.SetActive(true); cam.targetTexture = DefaultRenderTarget; } /// /// 禁用主相机 /// /// private void DeActiveMainCamera(Camera cam) { cam.gameObject.SetActive(false); } } }