UGUI—鼠标控制摄像机环绕物体运动

作者:追风剑情 发布于:2024-3-14 13:13 分类:Unity3d

1.Hierarchy

33333.png

2.Main Camera Inspector

4444.png

3.控制脚本

  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. /// <summary>
  4. /// 鼠标控制摄像机环绕某点运动
  5. /// </summary>
  6. public class CameraAroundController : MonoBehaviour
  7. {
  8. //环绕点
  9. [SerializeField]
  10. private Transform aroundTransform;
  11. //摄像机
  12. [SerializeField]
  13. private Transform cameraTransform;
  14. //旋转速度
  15. [SerializeField]
  16. private float m_Speed = 5.0f;
  17. //鼠标滚轮灵敏度
  18. [SerializeField]
  19. private float m_ScrollWheelSensitivity = 40f;
  20. //是否开启鼠标滚轮
  21. [SerializeField]
  22. private bool m_ScrollWheelEnabled = true;
  23. private Vector3 lastPosition;
  24.  
  25. public Transform AroundTransform
  26. {
  27. get { return aroundTransform; }
  28. set { aroundTransform = value; }
  29. }
  30.  
  31. public Transform CameraTransform
  32. {
  33. get { return cameraTransform; }
  34. set { cameraTransform = value; }
  35. }
  36.  
  37. void Update()
  38. {
  39. if (aroundTransform == null || cameraTransform == null)
  40. return;
  41. MouseRotation();
  42. MouseScrollWheel();
  43. }
  44.  
  45. // 鼠标控制旋转
  46. private void MouseRotation()
  47. {
  48. if (Input.GetMouseButtonDown(0))
  49. {
  50. lastPosition = Input.mousePosition;
  51. return;
  52. }
  53.  
  54. if (!Input.GetMouseButton(0))
  55. return;
  56.  
  57. if (UGUITool.IsPointerOverUI())
  58. return;
  59.  
  60. Vector3 mousePosition = Input.mousePosition;
  61. Vector3 offset = mousePosition - lastPosition;
  62. lastPosition = mousePosition;
  63.  
  64. //绕X轴旋转角度
  65. float angleX = -offset.y * Time.deltaTime * m_Speed;
  66. //绕Y轴旋转角度
  67. float angleY = offset.x * Time.deltaTime * m_Speed;
  68. //绕X轴旋转四元数
  69. Quaternion quaternionX = Quaternion.AngleAxis(angleX, cameraTransform.right);
  70. //绕Y轴旋转四元数
  71. Quaternion quaternionY = Quaternion.AngleAxis(angleY, Vector3.up);
  72. //综合旋转四元数
  73. Quaternion quaternion = quaternionX * quaternionY;
  74.  
  75. //旋转向量到新的位置
  76. Vector3 point = aroundTransform.position;
  77. Vector3 vector = cameraTransform.position;
  78. Vector3 vector2 = vector - point;
  79. vector2 = quaternion * vector2;
  80. Vector3 new_vector = point + vector2;
  81.  
  82. //旋转前的方向向量
  83. Vector3 before_forward = point - vector;
  84. //旋转后的方向向量
  85. Vector3 after_forward = point - new_vector;
  86.  
  87. //限制摄像机最小俯视视角为0度
  88. float angle = Vector3.Angle(after_forward, Vector3.up);
  89. if (angle < 90)//小于90度将变成仰视角度
  90. return;
  91.  
  92. //将before_forward投影到z平面上
  93. Vector3 zforward = before_forward;
  94. zforward.y = 0f;
  95. //限制摄像机最大俯视视角为90度
  96. angle = Vector3.Angle(zforward, after_forward);
  97. if (angle > 90)
  98. return;
  99.  
  100. cameraTransform.position = new_vector;
  101. cameraTransform.LookAt(point);
  102. }
  103.  
  104. // 鼠标滚轮
  105. private void MouseScrollWheel()
  106. {
  107. if (!m_ScrollWheelEnabled)
  108. return;
  109. float scrollWheel = Input.GetAxis("Mouse ScrollWheel");
  110. if (scrollWheel == 0f) return;
  111. Vector3 direction = cameraTransform.position - aroundTransform.position;
  112. direction.Normalize();
  113. cameraTransform.position -= direction * scrollWheel * m_ScrollWheelSensitivity;
  114. }
  115. }


运行效果
11111112.gif

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号