使用方法: 挂载到要控制的相机上
target 选定围绕中心物体
csharp
using UnityEngine;
public class OrbitCameraController : MonoBehaviour
{
public Transform target; // 目标物体的Transform
public float distance = 10.0f; // 初始相机到目标的距离
public float xSpeed = 250.0f;
public float ySpeed = 100.0f;
[Range(1.0f, 100.0f)]
public float minDistance = 2.0f; // 最小距离
[Range(1.0f, 100.0f)]
public float maxDistance = 40.0f; // 最大距离
[Range(-90, 90)] // 控制俯仰角范围 [-90, 90]
public float minYAngle = -60f; // 最小俯仰角(向下看)
[Range(-90, 90)]
public float maxYAngle = 60f; // 最大俯仰角(向上看)
// 阻尼设置
public bool useDamping = true;
public float dampingTime = 0.15f;
private float x = 0.0f;
private float y = 0.0f;
private float targetX = 0.0f;
private float targetY = 0.0f;
private float targetDistance;
private Vector3 velocity = Vector3.zero;
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = ClampAngle(angles.x, -360, 360);
targetX = x;
targetY = y;
targetDistance = distance;
//Cursor.lockState = CursorLockMode.Locked;
}
void LateUpdate()
{
if (!target) return;
// 处理鼠标拖动视角
HandleMouseRotation();
// 处理鼠标滚轮缩放
HandleScrollWheelZoom();
// 处理触控缩放
HandleTouchInput();
// 应用阻尼效果
if (useDamping)
{
x = Mathf.SmoothDamp(x, targetX, ref velocity.x, dampingTime);
y = Mathf.SmoothDamp(y, targetY, ref velocity.y, dampingTime);
distance = Mathf.SmoothDamp(distance, targetDistance, ref velocity.z, dampingTime);
}
else
{
x = targetX;
y = targetY;
distance = targetDistance;
}
// 计算相机位置与旋转
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 position = rotation * new Vector3(0, 0, -distance) + target.position;
transform.rotation = rotation;
transform.position = position;
}
void HandleMouseRotation()
{
if (Input.GetMouseButton(0)) // 鼠标左键拖动旋转
{
targetX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime * 0.5f;
targetY -= Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime * 0.5f;
targetY = Mathf.Clamp(targetY, minYAngle, maxYAngle); // 限制上下角度
}
}
void HandleScrollWheelZoom()
{
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0)
{
targetDistance -= scroll * 2f; // 滚轮灵敏度
targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);
UnityEngine.Debug.Log("相机距离: " + targetDistance);
}
}
void HandleTouchInput()
{
if (Input.touchCount == 2)
{
Touch touchZero = Input.GetTouch(0);
Touch touchOne = Input.GetTouch(1);
Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;
float prevMagnitude = (touchZeroPrevPos - touchOnePrevPos).magnitude;
float currentMagnitude = (touchZero.position - touchOne.position).magnitude;
float difference = currentMagnitude - prevMagnitude;
float scaleFactor = difference * 0.01f;
targetDistance -= scaleFactor;
targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);
}
}
static float ClampAngle(float angle, float min, float max)
{
if (angle < -360F)
angle += 360F;
if (angle > 360F)
angle -= 360F;
return Mathf.Clamp(angle, min, max);
}
}