CloseUpState.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace UnityCommon
  5. {
  6. public class CloseUpState : CameraState
  7. {
  8. //private float mouseDragSpeed2 = 1;//鼠标拖动的速度
  9. private Vector3 m_pFocus;
  10. private Vector3 m_pOrignal;
  11. public CloseUpState(Camera camera, Vector3 pFocus, Vector3 pOrignal) : base(camera)
  12. {
  13. m_pFocus = pFocus;
  14. m_pOrignal = pOrignal;
  15. }
  16. private Vector3 focus;
  17. private Vector3 offset;
  18. float nearClipPlaneOld;
  19. float farClipPlaneOld;
  20. public override void Enter()
  21. {
  22. base.Enter();
  23. m_camera.transform.SetParent(null);//保持父节点为空,解决相机漂移问题
  24. nearClipPlaneOld = m_camera.nearClipPlane;
  25. farClipPlaneOld = m_camera.farClipPlane;
  26. m_camera.nearClipPlane = 0.01f;
  27. m_camera.farClipPlane = 100;
  28. Quaternion r = Quaternion.LookRotation(m_pFocus - m_pOrignal);
  29. SetCameraPosition(m_pOrignal, r, () =>
  30. {
  31. focus = m_pFocus;
  32. offset = m_pOrignal - focus;
  33. });
  34. }
  35. public override void Exit()
  36. {
  37. base.Exit();
  38. m_camera.farClipPlane = farClipPlaneOld;
  39. m_camera.nearClipPlane = nearClipPlaneOld;
  40. }
  41. public override void OnMove(Vector3 vecDir)
  42. {
  43. if (!m_isAllReady) return;
  44. if (vecDir.y == 0) return;
  45. OnZoom(vecDir.y * 0.01f);
  46. }
  47. public override void OnRotate(Vector2 vector2)
  48. {
  49. if (!m_isAllReady) return;
  50. if (vector2 == Vector2.zero) return;
  51. m_camera.transform.RotateAround(focus, Vector3.up, vector2.x * 10);
  52. m_camera.transform.RotateAround(focus, m_camera.transform.right, -vector2.y * 10);
  53. offset = m_camera.transform.position - focus;
  54. //if (Input.GetAxis("Mouse Y") != 0 || Input.GetAxis("Mouse X") != 0)
  55. // offset = m_camera.transform.position - focus;
  56. }
  57. private float distance;
  58. private float scrollSpeed = 5;
  59. private float closeUpMaxDistance = 50;
  60. private float minDistance = 0.1f;
  61. public override void OnZoom(float zoom)
  62. {
  63. if (!m_isAllReady) return;
  64. if (zoom == 0) return;
  65. distance = offset.magnitude;
  66. //var scrollWheel = Input.GetAxis("Mouse ScrollWheel");
  67. var scrollWheel = zoom;
  68. if (scrollWheel != 0)
  69. {
  70. distance -= scrollWheel * scrollSpeed;
  71. distance = Mathf.Clamp(distance, minDistance, closeUpMaxDistance);
  72. offset = offset.normalized * distance;
  73. }
  74. m_camera.transform.position = focus + offset;
  75. Debug.Log(zoom);
  76. }
  77. float m_camHitDistance
  78. {
  79. get { return Vector3.Distance(m_pFocus, m_camera.transform.position); }
  80. }
  81. public override void OnTranlation(Vector2 vector2)
  82. {
  83. if (!m_isAllReady) return;
  84. if (vector2 == Vector2.zero) return;
  85. var mousePositionDelta = vector2;
  86. //mouseLastPosition = Input.mousePosition;
  87. if (mousePositionDelta.magnitude != 0)
  88. {
  89. //var moveDelta = new Vector3(-mousePositionDelta.x * Time.deltaTime * mouseDragSpeed2, -mousePositionDelta.y * Time.deltaTime * mouseDragSpeed2, 0);
  90. //m_camera.transform.Translate(moveDelta, Space.Self);
  91. //offset = m_camera.transform.position - focus;
  92. var m_mouseMoveBegin = m_camera.ScreenToWorldPoint(new Vector3(0, 0, m_camHitDistance));
  93. var offset_Current2Begin = m_camera.ScreenToWorldPoint(new Vector3(vector2.x, vector2.y, m_camHitDistance)) - m_mouseMoveBegin;
  94. //相机的移动方向相反
  95. m_camera.transform.position -= offset_Current2Begin;
  96. m_pFocus -= offset_Current2Begin;
  97. }
  98. }
  99. }
  100. }