You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			166 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			166 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
| using UnityEngine;
 | |
| using UnityEngine.Rendering.PostProcessing;
 | |
| using Cinemachine;
 | |
| 
 | |
| namespace Game
 | |
| {
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 主相机及后处理在此管理
 | |
|     /// </summary>
 | |
|     public class CameraManager : ManagerBase<CameraManager>
 | |
|     {
 | |
|         public GameCamera MGameCamera;
 | |
|         private PostProcessVolume _mPostProcessVolume;
 | |
|         private Camera _mMainCamera;
 | |
|         private CinemachineVirtualCamera _mMainCameraVirtual;
 | |
|         private CinemachineTargetGroup _mMainCameraGroup;
 | |
|         private CinemachineImpulseSource _mMainCollisionImpulseSource;
 | |
|         private Transform[] _mTargets = new Transform[2];//TODO 可扩展性
 | |
|         private Transform[] _mTargetsAgent = new Transform[2];//TODO 可扩展性
 | |
| 
 | |
|         public CameraManager()
 | |
|         {
 | |
|         }
 | |
|         public override void OnCreate()
 | |
|         {
 | |
|             var cameraRoot = GameObject.Find("CameraRoot");
 | |
|             Object.DontDestroyOnLoad(cameraRoot);
 | |
| 
 | |
|             _mMainCamera = cameraRoot.transform.Find("Camera_Main").GetComponent<Camera>();
 | |
|             _mMainCameraVirtual = cameraRoot.transform.Find("Camera_Virtual").GetComponent<CinemachineVirtualCamera>();
 | |
|             _mMainCollisionImpulseSource = cameraRoot.transform.Find("Camera_Virtual").GetComponent<CinemachineImpulseSource>();
 | |
|             _mMainCameraGroup = cameraRoot.transform.Find("Camera_Group").GetComponent<CinemachineTargetGroup>();
 | |
|             _mMainCameraGroup.m_Targets = new CinemachineTargetGroup.Target[2];
 | |
| 
 | |
|             MGameCamera = _mMainCamera.GetComponent<GameCamera>();
 | |
|             MGameCamera.material.SetVector("_ScreenSize", new Vector4(Screen.width, Screen.height, 0, 0));
 | |
|             _mPostProcessVolume = _mMainCamera.GetComponent<PostProcessVolume>();
 | |
| 
 | |
|             //TODO 有两个以上锁定目标时优化
 | |
|             var newTargt0 = PrefabManager.Instance.CreateGo("CameraTarget");
 | |
|             var newTargt1 = PrefabManager.Instance.CreateGo("CameraTarget");
 | |
|             newTargt0.transform.parent = cameraRoot.transform;
 | |
|             newTargt1.transform.parent = cameraRoot.transform;
 | |
|             _mTargetsAgent[0] = newTargt0.transform;
 | |
|             _mTargetsAgent[1] = newTargt1.transform;
 | |
|             _mMainCameraGroup.m_Targets[0].target = _mTargetsAgent[0];
 | |
|             _mMainCameraGroup.m_Targets[0].weight = 1;
 | |
|             _mMainCameraGroup.m_Targets[0].radius = 2.5f;
 | |
|             _mMainCameraGroup.m_Targets[1].target = _mTargetsAgent[1];
 | |
|             _mMainCameraGroup.m_Targets[1].weight = 1;
 | |
|             _mMainCameraGroup.m_Targets[1].radius = 2.5f;
 | |
| 
 | |
|             //默认设置 TODO 好像没有用
 | |
|             // var brain = m_MainCamera.GetComponent<CinemachineBrain>();
 | |
|             // CinemachineImpulseManager.Instance.IgnoreTimeScale = true;
 | |
|             // brain.m_UpdateMethod = CinemachineBrain.UpdateMethod.LateUpdate;
 | |
|             // brain.m_IgnoreTimeScale = true;
 | |
| 
 | |
| 
 | |
|         }
 | |
|         public override void Update()
 | |
|         {
 | |
|             UpdateCameraTarget();//更新相机锁定目标
 | |
|         }
 | |
|         public override void FixedUpdate()
 | |
|         {
 | |
|             if (Util.IsLevelLoading())
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
|             // UpdataBackground();//更新差速滚轴
 | |
|         }
 | |
|         public override void OnDestroy() { }
 | |
|         public void SetMainTarget(Transform target)
 | |
|         {
 | |
|             _mTargets[0] = target;
 | |
|         }
 | |
|         public void SetSubTarget(Transform target)
 | |
|         {
 | |
|             _mTargets[1] = target;
 | |
|         }
 | |
|         public void Shake()
 | |
|         {
 | |
|             _mMainCollisionImpulseSource.GenerateImpulse();
 | |
|         }
 | |
|         public Vector3 GetScreenPos(Vector3 pos)
 | |
|         {
 | |
|             var ret = _mMainCamera.WorldToScreenPoint(pos);
 | |
|             ret = new Vector3(ret.x, Screen.height - ret.y, ret.z);
 | |
|             return ret;
 | |
|         }
 | |
|         public T GetPostProcessSetting<T>() where T : PostProcessEffectSettings
 | |
|         {
 | |
|             return _mPostProcessVolume.profile.GetSetting<T>();
 | |
|         }
 | |
|         public CinemachineVirtualCamera GetVirtualCamera()
 | |
|         {
 | |
|             return _mMainCameraVirtual;
 | |
|         }
 | |
| 
 | |
|         private void UpdateCameraTarget()
 | |
|         {
 | |
|             if (_mTargets[0] == null)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
|             if (_mTargets[1] == null)
 | |
|             {
 | |
|                 _mTargets[1] = _mTargets[0];
 | |
|             }
 | |
|             _mTargetsAgent[0].position = _mTargets[0].position;
 | |
|             _mTargetsAgent[1].position = _mTargets[1].position;
 | |
|             ClampToLevel(_mTargetsAgent[0]);
 | |
|             ClampToLevel(_mTargetsAgent[1]);
 | |
|         }
 | |
|         private void ClampToLevel(Transform transform)
 | |
|         {
 | |
|             var pos = transform.position;
 | |
|             var start = pos + Vector3.up;
 | |
|             var x = pos.x;
 | |
|             var z = pos.z;
 | |
|             RaycastHit hitInfo;
 | |
|             if (Physics.Raycast(start, Vector3.back, out hitInfo, GameConst.LevelCameraOffsetZ, UtilPhysics.LayerMaskWall))
 | |
|             {
 | |
|                 z = Mathf.Max(z, hitInfo.point.z + GameConst.LevelCameraOffsetZ);
 | |
|             }
 | |
|             if (Physics.Raycast(start, Vector3.left, out hitInfo, GameConst.LevelCameraOffsetX, UtilPhysics.LayerMaskWall))
 | |
|             {
 | |
|                 x = Mathf.Max(x, hitInfo.point.x + GameConst.LevelCameraOffsetX);
 | |
|             }
 | |
|             else if (Physics.Raycast(start, Vector3.right, out hitInfo, GameConst.LevelCameraOffsetX, UtilPhysics.LayerMaskWall))
 | |
|             {
 | |
|                 x = Mathf.Min(x, hitInfo.point.x - GameConst.LevelCameraOffsetX);
 | |
|             }
 | |
|             transform.position = new Vector3(x, 0, z);
 | |
|         }
 | |
|     }
 | |
|     public abstract partial class Util
 | |
|     {
 | |
|         public static void SetMainTarget(Transform target)
 | |
|         {
 | |
|             CameraManager.Instance.SetMainTarget(target);
 | |
|         }
 | |
|         public static void SetSubTarget(Transform target)
 | |
|         {
 | |
|             CameraManager.Instance.SetSubTarget(target);
 | |
|         }
 | |
|         public static void Shake()
 | |
|         {
 | |
|             CameraManager.Instance.Shake();
 | |
|         }
 | |
|         public static Vector3 GetScreenPos(Vector3 pos)
 | |
|         {
 | |
|             return CameraManager.Instance.GetScreenPos(pos);
 | |
|         }
 | |
|         public static T GetPostProcessSetting<T>() where T : PostProcessEffectSettings
 | |
|         {
 | |
|             return CameraManager.Instance.GetPostProcessSetting<T>();
 | |
|         }
 | |
|         public static CinemachineVirtualCamera GetVirtualCamera()
 | |
|         {
 | |
|             return CameraManager.Instance.GetVirtualCamera();
 | |
|         }
 | |
|     }
 | |
| } |