using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine; using System; public class Cinemachine_2dCon : MonoBehaviour { public float cameraMaxSize; public float cameraMinSize; public float zoomSpeed; public CinemachineVirtualCamera v_cam; public Camera m_cam; private Transform m_selfTrans; private bool m_fingerDown = false; //事件,用于开启或关闭摄像逻辑 public static Action SetCameraContorl; private bool IsCan = true; /// /// 单指滑动的手指位置 /// private Vector3 m_oneFingerDragStartPos; /// /// 双指缩放的上一帧的双指距离 /// private float m_twoFingerLastDistance = -1; private void Awake() { m_selfTrans = transform; } private void Update() { if (!IsCan) { return; } #if UNITY_EDITOR || UNITY_STANDALONE //// 桌面端:鼠标按下时 //if (Input.GetMouseButtonDown(0)) //{ // m_fingerDown = true; // m_oneFingerDragStartPos = GetWorldPos(Input.mousePosition); // 获取鼠标按下的起始位置 //} //// 桌面端:鼠标松开时 //if (Input.GetMouseButtonUp(0)) //{ // m_fingerDown = false; // m_twoFingerLastDistance = -1; //} // 处理鼠标拖动 //if (m_fingerDown) //{ // HandleFingerDragMove(Input.mousePosition); //} // 处理鼠标滚轮缩放 //var distance = Input.GetAxis("Mouse ScrollWheel"); //HandleMouseScrollWheel(distance * 10); #else // 移动端:双指缩放 if (Input.touchCount == 2) { HandleTwoFingerScale(); m_fingerDown = false; // 避免双指缩放时误触单指拖动 } // 移动端:单指滑动 else if (Input.touchCount == 1) { Touch touch = Input.touches[0]; // 手指刚触碰屏幕时 if (touch.phase == TouchPhase.Began) { m_fingerDown = true; m_oneFingerDragStartPos = GetWorldPos(touch.position); // 获取手指按下的起始位置 } // 手指在屏幕上滑动时 else if (touch.phase == TouchPhase.Moved) { HandleFingerDragMove(touch.position); // 处理手指拖动 } m_twoFingerLastDistance = -1; // 复位双指缩放距离 } else { m_fingerDown = false; m_twoFingerLastDistance = -1; } #endif } /// /// 单指滑动 /// private void HandleFingerDragMove(Vector2 fingerPos) { ////滑动差 //Vector3 cha = m_oneFingerDragStartPos - GetWorldPos(fingerPos); //Vector3 newP = m_cam.transform.position; //newP.x = newP.x + cha.x; //newP.y = newP.y + cha.y; //m_selfTrans.position = newP; } /// /// 双指缩放 /// private void HandleTwoFingerScale() { float distance = Vector2.Distance(Input.touches[0].position, Input.touches[1].position); if (m_twoFingerLastDistance == -1) { m_twoFingerLastDistance = distance; return; // 避免首次执行时发生误缩放 } // 计算缩放比例 float scale = 0.1f * (distance - m_twoFingerLastDistance); ScaleCamere(scale); m_twoFingerLastDistance = distance; } /// /// 鼠标滚轮缩放 /// /// //private void HandleMouseScrollWheel(float distance) //{ // if (0 == distance) return; // ScaleCamere(distance); //} /// /// 缩放摄像机的视口 /// /// private void ScaleCamere(float scale) { v_cam.m_Lens.OrthographicSize -= scale * zoomSpeed; if (v_cam.m_Lens.OrthographicSize < cameraMinSize) { v_cam.m_Lens.OrthographicSize = cameraMinSize; } if (v_cam.m_Lens.OrthographicSize > cameraMaxSize) { v_cam.m_Lens.OrthographicSize = cameraMaxSize; } } /// /// 屏幕坐标换算成3D坐标 /// /// 屏幕坐标 /// Vector3 GetWorldPos(Vector2 screenPos) { return m_cam.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, Mathf.Abs(m_cam.transform.position.z))); } //避免内存泄露 private void OnEnable() { SetCameraContorl += ToggleCameraControl; } private void OnDisable() { SetCameraContorl -= ToggleCameraControl; } /// /// /// /// 禁用或启用 private void ToggleCameraControl(bool TorF) { IsCan = TorF; } }