using System.Collections; using System.Collections.Generic; using UnityEngine; namespace UnityCommon { public class CloseUpState : CameraState { //private float mouseDragSpeed2 = 1;//鼠标拖动的速度 private Vector3 m_pFocus; private Vector3 m_pOrignal; public CloseUpState(Camera camera, Vector3 pFocus, Vector3 pOrignal) : base(camera) { m_pFocus = pFocus; m_pOrignal = pOrignal; } private Vector3 focus; private Vector3 offset; float nearClipPlaneOld; float farClipPlaneOld; public override void Enter() { base.Enter(); m_camera.transform.SetParent(null);//保持父节点为空,解决相机漂移问题 nearClipPlaneOld = m_camera.nearClipPlane; farClipPlaneOld = m_camera.farClipPlane; m_camera.nearClipPlane = 0.01f; m_camera.farClipPlane = 100; Quaternion r = Quaternion.LookRotation(m_pFocus - m_pOrignal); SetCameraPosition(m_pOrignal, r, () => { focus = m_pFocus; offset = m_pOrignal - focus; }); } public override void Exit() { base.Exit(); m_camera.farClipPlane = farClipPlaneOld; m_camera.nearClipPlane = nearClipPlaneOld; } public override void OnMove(Vector3 vecDir) { if (!m_isAllReady) return; if (vecDir.y == 0) return; OnZoom(vecDir.y * 0.01f); } public override void OnRotate(Vector2 vector2) { if (!m_isAllReady) return; if (vector2 == Vector2.zero) return; m_camera.transform.RotateAround(focus, Vector3.up, vector2.x * 10); m_camera.transform.RotateAround(focus, m_camera.transform.right, -vector2.y * 10); offset = m_camera.transform.position - focus; //if (Input.GetAxis("Mouse Y") != 0 || Input.GetAxis("Mouse X") != 0) // offset = m_camera.transform.position - focus; } private float distance; private float scrollSpeed = 5; private float closeUpMaxDistance = 50; private float minDistance = 0.1f; public override void OnZoom(float zoom) { if (!m_isAllReady) return; if (zoom == 0) return; distance = offset.magnitude; //var scrollWheel = Input.GetAxis("Mouse ScrollWheel"); var scrollWheel = zoom; if (scrollWheel != 0) { distance -= scrollWheel * scrollSpeed; distance = Mathf.Clamp(distance, minDistance, closeUpMaxDistance); offset = offset.normalized * distance; } m_camera.transform.position = focus + offset; Debug.Log(zoom); } float m_camHitDistance { get { return Vector3.Distance(m_pFocus, m_camera.transform.position); } } public override void OnTranlation(Vector2 vector2) { if (!m_isAllReady) return; if (vector2 == Vector2.zero) return; var mousePositionDelta = vector2; //mouseLastPosition = Input.mousePosition; if (mousePositionDelta.magnitude != 0) { //var moveDelta = new Vector3(-mousePositionDelta.x * Time.deltaTime * mouseDragSpeed2, -mousePositionDelta.y * Time.deltaTime * mouseDragSpeed2, 0); //m_camera.transform.Translate(moveDelta, Space.Self); //offset = m_camera.transform.position - focus; var m_mouseMoveBegin = m_camera.ScreenToWorldPoint(new Vector3(0, 0, m_camHitDistance)); var offset_Current2Begin = m_camera.ScreenToWorldPoint(new Vector3(vector2.x, vector2.y, m_camHitDistance)) - m_mouseMoveBegin; //相机的移动方向相反 m_camera.transform.position -= offset_Current2Begin; m_pFocus -= offset_Current2Begin; } } } }