NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Camera/CameraController.cs

2 lines
12 KiB
C#
Raw Normal View History

2025-02-26 13:14:48 +08:00
using System; using DG.Tweening; using Framework; using Gameplay.Performance; using UnityEngine; using Sirenix.OdinInspector; using Gameplay.Guide; using UnityEngine.EventSystems; [ExecuteAlways] public class CameraController : MonoBehaviour { private const float CameraStartY = 25; private const float CameraStartSize = 12; private const float CameraStartFOV = 30; private const float NearClipPlane = 0.03f; private const float FarClipPlane = 150; private readonly Vector3 cameraStartRotationO = new Vector3(37.5f, -10f, 0f); private readonly Vector3 cameraStartRotationP = new Vector3(45, -10, 0); //之前的缩放是6次滚轮从最小放到最大故每一次缩放的值为1/6f private const float ZoomStep = 1 / 12f; public float leftMargin = 1.5f; public float rightMargin = 1.5f; public float topMargin = 0.9f; public float bottomMargin = 0.9f; public float moveSpeedX = 0.19f; public float moveSpeedY = 0.3f; public float unitPerPixel = 0.01f; [ShowIf("isFightCamera")] public float CameraMinSize = 6; [ShowIf("isFightCamera")] public float CameraMaxSize = 12; [HideIf("isFightCamera")] public BoxCollider boxBounds; [HideIf("isFightCamera")] public float CameraMinFOV = 15; [HideIf("isFightCamera")] public float CameraMaxFOV = 30; [LabelText("是否战斗相机")] public bool isFightCamera = true; [LabelText("是否军团战相机")] public bool isLegionFightCamera = false; private Camera mainCamera; private bool isIgnoreZoomLimit; public Bounds CameraBounds { get; set; } private bool isOrthographic => mainCamera.orthographic; //Camera拖动控制 public static bool FingerMoveEnable = true; //size,将透视和正交相机的fov和orthographic size整合为统一数值 private float Size { get { if (isOrthographic) return mainCamera.orthographicSize; else { var fov = mainCamera.fieldOfView; //这里乘(CameraMaxSize - CameraMinSize)/(CameraMaxFOV - CameraMinFOV)是将fov的区间变得和orthographic size区间一致 return fov * (CameraMaxSize - CameraMinSize) / (CameraMaxFOV - CameraMinFOV); } } } //缩放百分比0表示放到最小1表示放到最大 private float ZoomScale { get { if (isOrthographic) return (CameraMaxSize - mainCamera.orthographicSize) / (CameraMaxSize - CameraMinSize); else return (CameraMaxFOV - mainCamera.fieldOfView) / (CameraMaxFOV - CameraMinFOV); } set { var t = Mathf.Clamp(value, 0, 1); if (Math.Abs(ZoomScale - t) < float.Epsilon) return; if (isOrthographic) mainCamera.orthographicSize = Mathf.Lerp(CameraMaxSize, CameraMinSize, t); else mainCamera.fieldOfView = Mathf.Lerp(CameraMaxFOV, CameraMinFOV, t); } } private void Awake() { mainCamera = GetComponent<Camera>(); if (isLegionFightCamera)
{ CameraMaxFOV = 100f; } if (isFightCamera) { var useOrthographic = PerformanceManager.instance != null && PerformanceManager.instance.data.fightUseOrthographic; var rotEuler = useOrthographic ? cameraStartRotationO : cameraStartRotationP; if (useOrthographic) { // TODO: 这里的值是固定的,需要根据实际情况调整 //bottomMargin = 0.9f; mainCamera.orthographic = true; mainCamera.orthographicSize = CameraStartSize; // 修改固定旋转值 //mainCamera.transform.SetPositionAndRotation(new Vector3(0, CameraStartY, 0), Quaternion.Euler(rotEuler)); //mainCamera.transform.position = new Vector3(0, CameraStartY, 0); } else { // TODO: 这里的值是固定的,需要根据实际情况调整 //bottomMargin = 0.7f; mainCamera.orthographic = false; mainCamera.fieldOfView = 30; // 修改固定旋转值 // mainCamera.transform.SetPositionAndRotation(new Vector3(0, 27, 0), Quaternion.Euler(rotEuler)); //mainCamera.transform.position = new Vector3(0, 27, 0); } } mainCamera.nearClipPlane = NearClipPlane; mainCamera.farClipPlane = FarClipPlane; CameraBounds = boxBounds != null ? boxBounds.bounds : CameraBounds; AdjustSelf(); } private void OnEnable() { if (Application.isPlaying) { //InputManager.Instance.OnFingerMove += OnFingerMove2; EventManager.Instance.Register<PointerEventData>(EventManager.EventName.Level_OnDrag, _OnDragMove); InputManager.Instance.OnFingersMove += OnFingersMove; } } private void OnDisable() { if (Application.isPlaying) { if (InputManager.Instance == null) return; //InputManager.Instance.OnFingerMove -= OnFingerMove2; EventManager.Instance.Unregister<PointerEventData>(EventManager.EventName.Level_OnDrag, _OnDragMove); InputManager.Instance.OnFingersMove -= OnFingersMove; } } private void _OnDragMove(PointerEventData pointerData) { if (!FingerMoveEnable) return; var startPos = pointerData.pressPosition; var delta = pointerData.delta; var oldRay = mainCamera.ScreenPointToRay(startPos); var newRay = mainCamera.ScreenPointToRay( startPos + delta); var layerMask = 1 << LayerMask.NameToLayer("Ground"); if (Physics.Raycast(oldRay, out var oldHit, 1000, layerMask) && Physics.Raycast(newRay, out var newHit, 1000, layerMask)) { var offset = oldHit.point - newHit.point; transform.Translate(offset, Space.World); // DebugUtil.LogG("delta: " + delta + " offset: " + offset); } else { Vector2 touchDeltaPosition = -delta; float ratio = Size * unitPerPixel; Vector2 cameraMove = new(touchDeltaPosition.x * moveSpeedX * ratio, touchDeltaPosition.y * moveSpeedY * ratio); var cameraTransform = transform; var moveY = cameraTransform.up; moveY.y = 0; moveY = moveY.normalized * cameraMove.y; var moveX = cameraTransform.right; moveX.y = 0; moveX = moveX.normalized * cameraMove.x; transform.Translate(moveX + moveY, Space.World); } AdjustSelf(); } private void OnFingersMove(float delta) { if (!FingerMoveEnable) { return; } if (GuideManager.Instance.IsGuiding) // 引导中禁止缩放 return; //delta小于0是缩小 var zoomDelta = delta < 0 ? -ZoomStep : ZoomStep; //修改缩放值 ZoomScale +