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

1 line
9.0 KiB
C#
Raw Normal View History

2024-01-09 16:52:34 +08:00
using Gameplay; using System; using Gameplay.Skill; using UnityEngine; [ExecuteAlways] public class CameraController : MonoBehaviour { 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; public int CameraMinSize = 6; public int CameraMaxSize = 12; private const int CameraStartY = 25; private Vector3 cameraStartRotation = new Vector3(37.5f, -10f, 0f); private Vector3 cameraDefaultRotation = new Vector3(90, 0, 0); public const int CameraStartSize = 12; private const float NearClipPlane = 0.03f; private const float FarClipPlane = 60; private const bool IsOrthographic = true; private Camera mainCamera; private bool isIgnoreZoomLimit; public Map Map { get => map; set { map = value; } } private Map map; private void Awake() { mainCamera = GetComponent<Camera>(); mainCamera.transform.SetPositionAndRotation(new Vector3(0, CameraStartY, 0), Quaternion.Euler(cameraStartRotation)); mainCamera.orthographic = IsOrthographic; mainCamera.orthographicSize = CameraStartSize; mainCamera.nearClipPlane = NearClipPlane; mainCamera.farClipPlane = FarClipPlane; AdjustSelf(); } private void OnEnable() { if (Application.isPlaying) { InputManager.Instance.OnFingerMove += OnFingerMove2; InputManager.Instance.OnFingersMove += OnFingersMove; } } private void OnDisable() { if (Application.isPlaying) { InputManager.Instance.OnFingerMove -= OnFingerMove2; InputManager.Instance.OnFingersMove -= OnFingersMove; } } private void OnFingerMove2(Vector2 delta) { if (SkillManager.instance != null && SkillManager.instance.needSkillPaused) return; var touchDeltaPosition = -delta; var ratio = mainCamera.orthographicSize * unitPerPixel; var cameraMove = new Vector2(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 (SkillManager.instance != null && SkillManager.instance.needSkillPaused) return; if (delta < 0) { var endPosition = AdjustPosition(mainCamera.orthographicSize + 1, out var canZoom); if ((canZoom && mainCamera.orthographicSize < CameraMaxSize) || isIgnoreZoomLimit) { mainCamera.orthographicSize++; mainCamera.transform.position = endPosition; } } else { if (mainCamera.orthographicSize > CameraMinSize) { mainCamera.orthographicSize--; } } } Vector3 CalculateHitHorizontalPosition(Vector3 startPosition, Vector3 dir, float y) { if (dir.y == 0) return Vector3.zero; var p1 = startPosition; // 直线上一点 var v = dir; // 直线的方向向量 float x, z; // 已知直线上一点 p1(x1, y1, z1) 和 直线的方向向量 v(m, n, p) // 根据点向式 // (x - x1) / m = (y - y1) / n = (z - z1) / p // 有: // (x - p1.x) / v.x = (y - p1.y) / v.y = (z - p1.z) / v.z // 有: // x = p1.x + v.x * (y - p1.y) / v.y // z = p1.z + v.z * (y - p1.y) / v.y // 与平面 y = y 的交点坐标为 x = p1.x + v.x * (y - p1.y) / v.y; z = p1.z + v.z * (y -