RiftMayhem/Assets/Scripts/CharacterCreation/OrbitCameraController.cs

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;
}
}