|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
public class CameraController : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
[Header("Follow Target")]
|
|
|
|
|
public Transform followTarget; // The player (root GameObject)
|
|
|
|
|
|
|
|
|
|
[Header("Zoom Settings")]
|
|
|
|
|
public Transform zoomTarget; // Target to zoom into (e.g. computer screen)
|
|
|
|
|
public float followSmoothness = 5f;
|
|
|
|
|
public float zoomSpeed = 2f;
|
|
|
|
|
|
|
|
|
|
private Vector3 initialOffset;
|
|
|
|
|
private bool isZooming = false;
|
|
|
|
|
|
|
|
|
|
void Start()
|
|
|
|
|
{
|
|
|
|
|
if (followTarget == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError("❌ followTarget not assigned!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Calculate offset from current camera position
|
|
|
|
|
initialOffset = transform.position - followTarget.position;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LateUpdate()
|
|
|
|
|
{
|
|
|
|
|
if (isZooming && zoomTarget != null)
|
|
|
|
|
{
|
|
|
|
|
// Smooth zoom toward target (e.g., computer screen)
|
|
|
|
|
transform.position = Vector3.Lerp(transform.position, zoomTarget.position, zoomSpeed * Time.deltaTime);
|
|
|
|
|
transform.rotation = Quaternion.Slerp(transform.rotation,
|
|
|
|
|
Quaternion.LookRotation(zoomTarget.position - transform.position),
|
|
|
|
|
zoomSpeed * Time.deltaTime);
|
|
|
|
|
}
|
|
|
|
|
else if (followTarget != null)
|
|
|
|
|
{
|
|
|
|
|
// Follow player with initial offset
|
|
|
|
|
Vector3 targetPosition = followTarget.position + initialOffset;
|
|
|
|
|
transform.position = Vector3.Lerp(transform.position, targetPosition, followSmoothness * Time.deltaTime);
|
|
|
|
|
transform.LookAt(followTarget);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void StartZoom()
|
|
|
|
|
{
|
|
|
|
|
isZooming = true;
|
|
|
|
|
}
|
|
|
|
|
}
|