写出Unity相机控制脚本,右键长按拖动时,围绕刚按下位置射线检测地面点位旋转
时间: 2023-07-18 17:07:29 浏览: 99
以下是一个简单的Unity相机控制脚本,可以实现右键长按拖动时,围绕刚按下位置射线检测地面点位旋转:
```csharp
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float rotateSpeed = 5.0f; // 相机旋转速度
private Vector3 mouseOrigin; // 鼠标按下位置
private bool isRotating; // 是否正在旋转
void Update()
{
if (Input.GetMouseButtonDown(1))
{
// 鼠标右键按下,记录按下位置
mouseOrigin = Input.mousePosition;
isRotating = true;
}
if (!Input.GetMouseButton(1))
{
// 鼠标右键松开,停止旋转
isRotating = false;
}
if (isRotating)
{
// 计算鼠标移动距离
Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
// 将距离转换为相机旋转角度
Vector3 rotate = new Vector3(-pos.y * rotateSpeed, pos.x * rotateSpeed, 0);
// 围绕按下位置旋转
transform.RotateAround(GetHitPoint(), Vector3.up, rotate.x);
transform.RotateAround(GetHitPoint(), Vector3.right, rotate.y);
}
}
// 射线检测地面点位
private Vector3 GetHitPoint()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
return hit.point;
}
return transform.position;
}
}
```
在该脚本中,我们首先定义了一个 `rotateSpeed` 变量来控制相机旋转速度。然后在 `Update()` 函数中,我们通过检测鼠标右键的按下和松开来判断是否需要旋转相机。在旋转相机时,我们首先计算出鼠标移动距离,将其转换为相机旋转角度,然后围绕按下位置旋转相机。
为了实现围绕按下位置旋转,我们需要用到一个 `GetHitPoint()` 函数来射线检测地面点位。该函数会发射一条从相机到鼠标位置的射线,然后返回该射线与地面的交点。在旋转相机时,我们就可以将相机围绕该交点进行旋转。如果没有检测到地面点位,则默认将旋转围绕相机自身旋转中心。
阅读全文