| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 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;
- }
- }
- }
- }
|