当前位置:   article > 正文

Unity相机自由移动脚本

Unity相机自由移动脚本

实现WSAD移动方向,鼠标右键旋转角度,滚轮实现缩放

在此之前,我们先讲清楚几个比较容易混淆的点:

1:Transform.forward是Transform组件的一个Vector3类型的属性,代表游戏对象在世界坐标系中的朝向,即“前方向”,它的值是(0,0,1),它表示了一个对象的X轴方向,一般用于计算游戏对象前进的方向,比如用于移动、旋转和射线检测等场景。

2:Transform.Right的数学表达式是(1, 0, 0)。它表示了一个对象的X轴方向,或者说是它的右侧方向

值得注意的是,它们都是单位向量,一般只用于方向计算

3:Input.GetAxis("Horizontal")和Input.GetAxis("Vertical"),input.GetAxis("Mouse X")

它们是分别获取水平方向输入和竖直方向输入的函数,这个函数会返回一个范围在-1到1之间的浮点数,表示当前水平方向上的输入状态

比如Input.GetAxis("Mouse X") 返回鼠标在水平方向上的移动,以浮点数表示。当鼠标向右移动时,返回正值;当鼠标向左移动时,返回负值。如果鼠标不动,返回0

Input.GetAxis("Mouse ScrollWheel"),向前滚动是正数,向后滚动时负数

4:欧拉角和四元数

在unity中的rotation就是使用了欧拉角,欧拉角指的是以三个轴为基准,通过绕不同轴的旋转角度来表示一个物体的旋转状态,通常有XYZ、ZYX、ZXY等多种旋转顺序。但是,欧拉角会存在万向锁问题,即在某些特定情况下,两个轴的旋转会发生重合,导致旋转计算异常

四元数则是通过四元数的定义和运算来实现旋转,四元数实际上是一个四元组,包含了一个实部和三个虚部。它们的定义方式和欧拉角不同,可以避免万向锁问题,并且旋转顺序不会影响旋转结果。四元数还可以通过插值运算实现平滑旋转,适用于需要连续旋转的情况。

我把代码分成了三块

第一个模块是WSAD控制前后左右,这段比较简单,直接定义一个V3类型的移动方向,再使用Translate即可

第二个模块是使用QE控制上下视角,定义一个变量upDown,每次按键时候改变1,然后直接把位置赋值到相机位置即可

第三个模块是使用鼠标右键进行旋转,设置两个旋转向量rotateX,rotateY,Y方向旋转限值minAngle和maxAngle,然后把向量和速度加到相机的欧拉角即可

有一个难点,在刚开始调试的时候,第一次点击鼠标右键进行旋转时,屏幕一直跳动,最后经过GPT的帮助,最终解决了问题!爱死GPT

  1. using UnityEngine;
  2. public class CameraController : MonoBehaviour
  3. {
  4. //WSAD相机移动速度
  5. public float moveSpeed = 1.0f;
  6. //相机当前移动方向
  7. private Vector3 moveDirection;
  8. //QE相机的目标高度
  9. private float upDistance;
  10. public float upSpeed = 0.2f;
  11. //鼠标右键控制旋转
  12. private float rotateX,rotateY;
  13. public float sensitivity =0.5f;
  14. //控制鼠标在Y方向上的限值
  15. public float minAngle = -90f;
  16. public float maxAngle = 90f;
  17. //记录之前的欧拉角,避免跳屏
  18. private Vector3 currentRotation,lastPosition;
  19. //鼠标滚轮控制缩放
  20. public float zoomSpeed = 10f;
  21. private float zoomDistance = 0f;
  22. private void Start()
  23. {
  24. currentRotation = transform.eulerAngles;
  25. }
  26. void Update()
  27. {
  28. // 使用WSAD控制相机前后左右移动比较简单,直接获取当前的移动方向,然后使用Translate移动即可
  29. {
  30. moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
  31. transform.Translate(moveDirection * moveSpeed * Time.deltaTime);
  32. }
  33. //使用QE控制相机的上下,使用unDown参数进行单位变化
  34. {
  35. if (Input.GetKey(KeyCode.Q))
  36. {
  37. upDistance -= upSpeed * Time.deltaTime;
  38. transform.Translate(transform.up * upDistance, Space.World);
  39. }
  40. else if(Input.GetKeyUp(KeyCode.Q))
  41. {
  42. upDistance = 0;
  43. }
  44. if (Input.GetKey(KeyCode.E))
  45. {
  46. upDistance += upSpeed * Time.deltaTime;
  47. transform.Translate(transform.up * upDistance, Space.World);
  48. }
  49. else if(Input.GetKeyUp(KeyCode.E))
  50. {
  51. upDistance = 0;
  52. }
  53. }
  54. //使用鼠标右键来控制相机旋转
  55. //Mouse X,向右移动返回正值,Mouse Y,向上移动鼠标为正值
  56. {
  57. if (Input.GetMouseButtonDown(1))
  58. {
  59. // 记录当前的欧拉角
  60. //currentRotation = transform.eulerAngles;
  61. //记录鼠标位置
  62. lastPosition = Input.mousePosition;
  63. }
  64. if (Input.GetMouseButton(1))
  65. {
  66. //设置偏移量
  67. Vector3 offset = Input.mousePosition - lastPosition;
  68. rotateX += offset.x * sensitivity;
  69. rotateY -= offset.y * sensitivity;
  70. //给Y方向的旋转加上限值函数
  71. rotateY = Mathf.Clamp(rotateY, minAngle, maxAngle);
  72. //改变当前的欧拉角
  73. transform.eulerAngles = new Vector3(rotateY, rotateX, 0f);
  74. // 将保存的欧拉角重新赋值回去
  75. transform.eulerAngles += currentRotation;
  76. lastPosition = Input.mousePosition;
  77. }
  78. }
  79. //使用滚轮来控制物体的缩放
  80. {
  81. //获取滚轮的滚动幅度和方向
  82. zoomDistance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
  83. //使用限值函数来限定缩放的范围
  84. zoomDistance = Mathf.Clamp(zoomDistance, -10f, 10f);
  85. //最后定位
  86. transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
  87. }
  88. }
  89. }

直接将代码复制,挂到Camera即可运行!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号