unity摄像机滚轮平滑推进放大缩小平移旋转 回答
时间: 2025-06-30 11:07:04 浏览: 12
### Unity中实现摄像机滚轮平滑缩放、平移和旋转的功能
在Unity中,可以通过脚本实现摄像机的平滑缩放、平移和旋转功能。以下是一个完整的解决方案[^1]。
#### 滚轮平滑缩放
通过监听`Input.GetAxis("Mouse ScrollWheel")`获取鼠标滚轮的滚动值,并使用插值函数(如`Mathf.Lerp`或`Vector3.Lerp`)实现平滑效果。
```csharp
public class CameraController : MonoBehaviour
{
public float zoomSpeed = 5f; // 缩放速度
public float minFieldOfView = 20f; // 最小视野
public float maxFieldOfView = 80f; // 最大视野
void Update()
{
// 鼠标滚轮缩放
float scroll = Input.GetAxis("Mouse ScrollWheel");
Camera.main.fieldOfView = Mathf.Clamp(Camera.main.fieldOfView - scroll * zoomSpeed, minFieldOfView, maxFieldOfView);
}
}
```
此代码实现了基于滚轮的平滑缩放功能,同时限制了视野范围以避免过度放大或缩小[^2]。
#### 平移功能
通过检测鼠标中键拖动来实现摄像机的平移。以下是实现代码:
```csharp
public class CameraPan : MonoBehaviour
{
public float panSpeed = 0.05f; // 平移速度
private Vector2 MouseOffsetSincePreviousFrame;
private Vector2 currentScreenPos;
private Vector2 previousScreenPos;
void Update()
{
if (Input.GetMouseButtonDown(2))
{
previousScreenPos = Input.mousePosition;
}
if (Input.GetMouseButton(2))
{
currentScreenPos = Input.mousePosition;
MouseOffsetSincePreviousFrame = currentScreenPos - previousScreenPos;
transform.position += (MouseOffsetSincePreviousFrame.x * -transform.right + MouseOffsetSincePreviousFrame.y * -transform.up) * panSpeed;
previousScreenPos = currentScreenPos;
}
}
}
```
此代码实现了鼠标中键拖动时的平移功能,确保摄像机能够平稳移动[^2]。
#### 旋转功能
通过检测鼠标右键拖动来实现摄像机的旋转。以下是实现代码:
```csharp
public class CameraRotate : MonoBehaviour
{
public float rotateSpeed = 2f; // 旋转速度
void Update()
{
if (Input.GetMouseButton(1))
{
float mouseX = Input.GetAxis("Mouse X") * rotateSpeed;
float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed;
transform.RotateAround(transform.position, Vector3.up, mouseX);
transform.RotateAround(transform.position, transform.right, -mouseY);
}
}
}
```
此代码实现了鼠标右键拖动时的旋转功能,同时保持摄像机与目标物体的相对距离不变[^1]。
#### 综合实现
将上述功能整合到一个脚本中,可以实现完整的摄像机控制功能:
```csharp
public class CameraControl : MonoBehaviour
{
public float zoomSpeed = 5f; // 缩放速度
public float rotateSpeed = 2f; // 旋转速度
public float panSpeed = 0.05f; // 平移速度
public float minFieldOfView = 20f; // 最小视野
public float maxFieldOfView = 80f; // 最大视野
private Vector2 MouseOffsetSincePreviousFrame;
private Vector2 currentScreenPos;
private Vector2 previousScreenPos;
void Update()
{
// 滚轮缩放
float scroll = Input.GetAxis("Mouse ScrollWheel");
Camera.main.fieldOfView = Mathf.Clamp(Camera.main.fieldOfView - scroll * zoomSpeed, minFieldOfView, maxFieldOfView);
// 中键平移
if (Input.GetMouseButtonDown(2))
{
previousScreenPos = Input.mousePosition;
}
if (Input.GetMouseButton(2))
{
currentScreenPos = Input.mousePosition;
MouseOffsetSincePreviousFrame = currentScreenPos - previousScreenPos;
transform.position += (MouseOffsetSincePreviousFrame.x * -transform.right + MouseOffsetSincePreviousFrame.y * -transform.up) * panSpeed;
previousScreenPos = currentScreenPos;
}
// 右键旋转
if (Input.GetMouseButton(1))
{
float mouseX = Input.GetAxis("Mouse X") * rotateSpeed;
float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed;
transform.RotateAround(transform.position, Vector3.up, mouseX);
transform.RotateAround(transform.position, transform.right, -mouseY);
}
}
}
```
此代码综合了滚轮缩放、平移和旋转功能,提供了完整的摄像机控制体验[^1]。
---
阅读全文
相关推荐


















