84 lines
2.8 KiB
C#
84 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|