using UnityEngine;
public class CameraOrbitController : MonoBehaviour {
public float orbitSpeed = 10f; // 控制相机旋转速度的变量
public float distance = 10f; // 相机到目标的距离
public float minRotationY = -89f; // 相机的最小旋转角度
public float maxRotationY = 89f; // 相机的最大旋转角度
public Transform target; // 要围绕旋转的目标对象的Transform组件
public float waitTime = 5f; // 等待时间
public float autoOrbitSpeed = 5f; // 自转速度
public bool autoOrbitClockwise = true; // 自转方向
public bool canZoom = true; // 是否可以滚轮缩放
public float minZoom = 1; // 是否可以滚轮缩放
public float maxZoom = 100; // 是否可以滚轮缩放
private Vector3 cameraPosition; // 相机的位置向量
private float orbitX = 0f; // 相机在X轴上的旋转角度
private float orbitY = 0f; // 相机在Y轴上的旋转角度
private Vector3 lastMousePosition; // 上一次鼠标的位置
private bool isDragging = false; // 是否正在拖动鼠标
private float idleTime = 0f; // 相机空闲时的计时器
void Start () {
cameraPosition = new Vector3 (0f, 0f, -distance); // 初始化相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
}
void Update () {
if (Input.GetMouseButtonDown (0)) {
// 如果按下鼠标左键
lastMousePosition = Input.mousePosition; // 记录下鼠标的位置
isDragging = true; // 开始拖动鼠标
} else if (Input.GetMouseButtonUp (0)) {
// 如果松开鼠标左键
isDragging = false; // 停止拖动鼠标
}
if (isDragging) {
// 如果正在拖动鼠标
idleTime = 0f; // 重置相机空闲计时器
Vector3 delta = Input.mousePosition - lastMousePosition; // 计算鼠标的移动距离
lastMousePosition = Input.mousePosition; // 记录下当前鼠标的位置
orbitX += delta.x * orbitSpeed * Time.deltaTime; // 根据鼠标在X轴上的移动距离,调整相机在X轴上的旋转角度
orbitY -= delta.y * orbitSpeed * Time.deltaTime; // 根据鼠标在Y轴上的移动距离,调整相机在Y轴上的旋转角度
orbitY = Mathf.Clamp (orbitY, minRotationY, maxRotationY); // 将相机在Y轴上的旋转角度限制在最小角度和最大角度之间
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
} else {
// 如果没有在拖动鼠标
idleTime += Time.deltaTime; // 增加相机的空闲计时器
if (idleTime >= waitTime) {
// 如果相机空闲时间达到5秒
orbitX += (autoOrbitClockwise ? -1 : 1) * autoOrbitSpeed * Time.deltaTime; // 根据相机旋转速度,调整相机在X轴上的旋转角度
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
}
}
if (canZoom && Input.mouseScrollDelta != Vector2.zero) {
// 如果鼠标滚轮有滚动
float scroll = Input.mouseScrollDelta.y; // 获取鼠标滚动的值
distance -= scroll; // 根据鼠标滚动的值调整相机到目标的距离
distance = Mathf.Clamp (distance, minZoom, maxZoom); // 将相机到目标的距离限制在最小值和最大值之间
Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度和相机到目标的距离计算相机的位置向量
transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
transform.LookAt (target); // 将相机的朝向设置为目标的位置
}
}
}
网友评论