FlyState.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace UnityCommon
  5. {
  6. public class FlyState : CameraState
  7. {
  8. private float speed = 50;
  9. private Vector3 initPosition;
  10. private Quaternion initRotation;
  11. public FlyState(Camera camera, Vector3 position, Quaternion rotation) : base(camera)
  12. {
  13. initPosition = position;
  14. initRotation = rotation;
  15. }
  16. public override void Enter()
  17. {
  18. base.Enter();
  19. SetCameraPosition(initPosition, initRotation);
  20. targetCameraPos = initPosition;
  21. targetRotation = initRotation;
  22. }
  23. Vector3 targetCameraPos;
  24. Quaternion targetRotation = default;
  25. public override void OnMove(Vector3 vecDir)
  26. {
  27. if (!m_isAllReady) return;
  28. if (vecDir == Vector3.zero) return;
  29. vecDir *= speedScaleFactor;
  30. var axis_h = vecDir.x;
  31. var axis_v = vecDir.y;
  32. var axis_updown = vecDir.z;
  33. targetCameraPos = m_camera.transform.position + m_camera.transform.TransformDirection(new Vector3(axis_h, axis_updown, axis_v) * speed * Time.deltaTime);
  34. //m_camera.transform.Translate(axis_h * speed * Time.deltaTime, axis_updown * speed * Time.deltaTime, axis_v * speed * Time.deltaTime);
  35. //initPosition = m_camera.transform.position;
  36. }
  37. public override void Update()
  38. {
  39. base.Update();
  40. if (!m_isAllReady) return;
  41. //控制相机运动
  42. if (Vector3.Distance(m_camera.transform.position, targetCameraPos) > 0.1f)
  43. {
  44. m_camera.transform.position = Vector3.Lerp(m_camera.transform.position, targetCameraPos, 0.3f);
  45. initPosition = m_camera.transform.position;
  46. }
  47. //控制相机旋转 缓动效果
  48. if (Quaternion.Angle(m_camera.transform.rotation, targetRotation) > 0.1f)
  49. {
  50. m_camera.transform.rotation = Quaternion.Lerp(m_camera.transform.rotation, targetRotation, 0.1f);
  51. initRotation = m_camera.transform.rotation;
  52. }
  53. }
  54. //private float rotateFactor = 1;
  55. float xLimit = 89;//上下旋转角度限制
  56. public override void OnRotate(Vector2 vec2Rotate)
  57. {
  58. if (!m_isAllReady) return;
  59. var rotateDx = vec2Rotate.x; //*= speedScaleFactor
  60. var rotateDy = vec2Rotate.y; //*= speedScaleFactor
  61. if (vec2Rotate != Vector2.zero)
  62. {
  63. Vector3 angles = m_camera.transform.rotation.eulerAngles;
  64. angles.y += rotateDx;
  65. angles.x = Mathf.Repeat(angles.x + 180f, 360f) - 180f;
  66. angles.x -= rotateDy;
  67. angles.x = ClampAngle(angles.x, -xLimit, xLimit);
  68. targetRotation.eulerAngles = new Vector3(angles.x, angles.y, 0);
  69. //initRotation = targetRotation;
  70. m_camera.transform.rotation = targetRotation;
  71. }
  72. }
  73. public override void OnZoom(float zoom)
  74. {
  75. if (!m_isAllReady) return;
  76. if (zoom != 0)
  77. {
  78. zoom *= speedScaleFactor;
  79. //m_camera.transform.Translate(0, 0, zoom);
  80. targetCameraPos = m_camera.transform.position + m_camera.transform.TransformDirection(Vector3.forward * zoom);
  81. //initPosition = m_camera.transform.position;
  82. }
  83. }
  84. public override void OnAddSpeed(float addSpeed)
  85. {
  86. base.OnAddSpeed(addSpeed);
  87. speed = (addSpeed == 1) ? 200 : 50;
  88. }
  89. // 控制角度范围
  90. private float ClampAngle(float angle, float min, float max)
  91. {
  92. if (angle < -360f) angle += 360f;
  93. else if (angle > 360f) angle -= 360f;
  94. return Mathf.Clamp(angle, min, max);
  95. }
  96. }
  97. }