unity中的交互控制脚本
使用方法: 挂载到要控制的相机上
target 选定围绕中心物体
using UnityEngine;public class OrbitCameraController : MonoBehaviour
{public Transform target; // 目标物体的Transformpublic 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);}
}