using UnityEngine; public class OrbitCameraController : MonoBehaviour { [SerializeField] private Transform target; // The pivot point to orbit around [SerializeField] private float distance = 5f; // Initial zoom distance [SerializeField] private float zoomSpeed = 2f; // Scroll zoom sensitivity [SerializeField] private float minDistance = 2f; // Min zoom [SerializeField] private float maxDistance = 15f; // Max zoom [SerializeField] private float rotationSpeed = 5f; // Mouse rotation sensitivity [SerializeField] private float minPitch = -80f; [SerializeField] private float maxPitch = 80f; private float yaw = 0f; private float pitch = 20f; [SerializeField] private float transitionDuration = 1f; private float transitionProgress = 1f; // 1 = done private Vector3 transitionStartPos; private Quaternion transitionStartRot; void LateUpdate() { if (target == null) return; // Always allow drag input, even during transition if (Input.GetMouseButton(0)) { yaw += Input.GetAxis("Mouse X") * rotationSpeed; pitch -= Input.GetAxis("Mouse Y") * rotationSpeed; pitch = Mathf.Clamp(pitch, minPitch, maxPitch); } // Zoom float scroll = Input.GetAxis("Mouse ScrollWheel"); distance -= scroll * zoomSpeed; distance = Mathf.Clamp(distance, minDistance, maxDistance); Quaternion targetRotation = Quaternion.Euler(pitch, yaw, 0); Vector3 targetOffset = targetRotation * new Vector3(0, 0, -distance); Vector3 desiredPosition = target.position + targetOffset; Quaternion desiredRotation = Quaternion.LookRotation(target.position - desiredPosition); if (transitionProgress < 1f) { transitionProgress += Time.deltaTime / transitionDuration; float t = Mathf.SmoothStep(0f, 1f, transitionProgress); // Interpolate from start to desired position & rotation transform.position = Vector3.Lerp(transitionStartPos, desiredPosition, t); transform.rotation = Quaternion.Slerp(transitionStartRot, desiredRotation, t); } else { // Normal orbit behavior transform.position = desiredPosition; transform.rotation = desiredRotation; } } public void UpdateTarget(Transform target) { this.target = target; } public void SmoothSetTarget(Transform newTarget) { if (newTarget == null || newTarget == target) return; // Store current camera position and rotation as transition start transitionStartPos = transform.position; transitionStartRot = transform.rotation; // Set new target target = newTarget; // Begin transition transitionProgress = 0f; } }