using Thousandto.Core.Asset; using Thousandto.Core.Base; using Thousandto.Core.PostEffect; using System.Collections.Generic; using UnityEngine; namespace Thousandto.Plugins.Common.UniScene { //摄像机管理器 public class CameraManager { #region//常量 public const string CameraRootName = "[Cameras]"; public const string NormalCameraName = "NormalCamera"; #endregion #region//私有变量 //根节点 private Transform _camerasRoot = null; //摄像机列表 private List _sceneCamList = new List(); //摄像机控制器 private CameraControl _sceneCameraControl = null; //上一个摄像机 private Camera _oldCamera = null; //当前摄像机 private Camera _curCamera = null; //当前的切换脚本 private CameraBlendRender _blendScript = null; #endregion #region//属性 //根节点 public Transform CamerasRoot { get { return _camerasRoot; } } public Camera OldCamera { get { return _oldCamera; } } public Camera CurCamera { get { return _curCamera; } } public CameraControl SceneCameraControl { get { return _sceneCameraControl; } } public List SceneCamList { get { return _sceneCamList; } } #endregion #region//公有函数 //初始化 public void Initialize() { _sceneCamList.Clear(); var sceneRoot = GameObject.Find("SceneRoot"); _camerasRoot = sceneRoot.transform.Find(CameraRootName); if (_camerasRoot != null) { for (int i = 0; i < _camerasRoot.childCount; ++i) { var camera = _camerasRoot.GetChild(i).GetComponent(); if (camera != null) { camera.allowHDR = false; camera.allowMSAA = false; camera.useOcclusionCulling = false; camera.allowDynamicResolution = false; camera.usePhysicalProperties = false; UnityUtils.Reset(camera.transform); _sceneCamList.Add(camera); var audio = camera.GetComponent(); if(audio != null) { GameObject.DestroyImmediate(audio); } } } } //创建默认摄像机 { if (_camerasRoot == null) { var camerasGo = new GameObject(CameraRootName); _camerasRoot = camerasGo.transform; _camerasRoot.parent = sceneRoot.transform; } //创建摄像机 var cameraGo = new GameObject(NormalCameraName); cameraGo.transform.parent = _camerasRoot; UnityUtils.Reset(cameraGo.transform); var camera = UnityUtils.RequireComponent(cameraGo); _sceneCamList.Add(camera); camera.allowHDR = false; camera.allowMSAA = false; camera.useOcclusionCulling = false; camera.allowDynamicResolution = false; camera.usePhysicalProperties = false; } _sceneCameraControl = UnityUtils.RequireComponent(_camerasRoot.gameObject); _sceneCameraControl.FreeMode = false; _sceneCameraControl.FeatureHeight = 1.5f; //设置摄像机参数 for (int i = 0; i < _sceneCamList.Count; ++i) { _sceneCamList[i].tag = "MainCamera"; _sceneCamList[i].cullingMask = ~(LayerUtils.UI_Mask | LayerUtils.LayerToMask(LayerUtils.SceneChange1) | LayerUtils.LayerToMask(LayerUtils.SceneChange2)); _sceneCamList[i].clearFlags = CameraClearFlags.Skybox; _sceneCamList[i].renderingPath = RenderingPath.Forward; _sceneCamList[i].gameObject.SetActive(false); UnityUtils.Reset(_sceneCamList[i].transform); if (_sceneCamList[i].gameObject.activeSelf) { // _sceneCameraControl.SetCameraTrans(_sceneCamList[i].transform); } } if(!_camerasRoot.gameObject.activeSelf) { _camerasRoot.gameObject.SetActive(true); } } //反初始化 public void Uninitialize() { if(_oldCamera != null) { _oldCamera.targetTexture = null; } _oldCamera = null; if(_blendScript != null) { GameObject.DestroyImmediate(_blendScript); } _blendScript = null; } //改变摄像机 public bool ChangeCamera(string cameraName, bool blend = true, float blendTime = 1f) { var isFind = false; Camera camera = null; for (int i = 0; i < _sceneCamList.Count; ++i) { if(_sceneCamList[i].name == cameraName) { camera = _sceneCamList[i]; //_sceneCameraControl.SetCameraTrans(_sceneCamList[i].transform); isFind = true; break; } } if (!isFind) { return false; } if (camera == null) { return false; } if (_curCamera != camera) { if (_blendScript != null) { GameObject.Destroy(_blendScript); } _blendScript = null; if (blend) { _oldCamera = _curCamera; _curCamera = camera; if (_oldCamera != null) { _blendScript = UnityUtils.RequireComponent(_curCamera.gameObject); _blendScript.PlayBlend(_oldCamera, blendTime, () => { GameObject.Destroy(_blendScript); _blendScript = null; _oldCamera.gameObject.SetActive(false); }); } } else { _curCamera = camera; _oldCamera = null; } PostEffectManager.Instance.ReInitialize(_curCamera); _sceneCameraControl.CurCamera = _curCamera; /* * //需要时开启离屏特效,现在暂时不需要了 if (_camerasRoot != null) { Debug.LogError("Invoke:OnSceneCameraChanged::" + (_curCamera == null ? "NULL" : _curCamera.name)); _camerasRoot.gameObject.SendMessage("OnSceneCameraChanged", _curCamera, SendMessageOptions.DontRequireReceiver); } */ for (int i = 0; i < _sceneCamList.Count; ++i) { if (_oldCamera != null) { _sceneCamList[i].gameObject.SetActive(_sceneCamList[i].name == cameraName || _sceneCamList[i].name == _oldCamera.name); } else { _sceneCamList[i].gameObject.SetActive(_sceneCamList[i].name == cameraName); } } } return true; } public void LookTransform( Transform trans ) { CurCamera.transform.position = trans.position; CurCamera.transform.rotation = trans.rotation; CurCamera.transform.Translate( new Vector3( 0, 0, -5 ), Space.Self ); } #endregion } }