using Unity.Cinemachine;
using UnityEngine;
namespace NightclubArcadia.Cinematics
{
///
/// Proxy transform the follow camera tracks. Combines player follow,
/// POI bias, manual pan offset, and distance bias.
///
public sealed class CameraRigAnchor : MonoBehaviour
{
[SerializeField] Transform followTarget;
[SerializeField] CinemachinePositionComposer composer;
[SerializeField] float followSmoothTime = 0.12f;
[SerializeField] float distanceSmoothTime = 0.8f;
float defaultCameraDistance = 10f;
float distanceVelocity;
Vector3 followVelocity;
public Vector3 PoiBias { get; set; }
public Vector3 ManualPanOffset { get; set; }
public float DistanceBias { get; set; }
public Transform FollowTarget => followTarget;
void Start()
{
if (composer == null)
{
composer = FindFirstObjectByType();
}
if (composer != null)
{
defaultCameraDistance = composer.CameraDistance;
}
}
void LateUpdate()
{
if (followTarget == null)
{
return;
}
var targetPosition = followTarget.position + PoiBias + ManualPanOffset;
transform.position = Vector3.SmoothDamp(
transform.position,
targetPosition,
ref followVelocity,
followSmoothTime);
if (composer != null)
{
var targetDistance = defaultCameraDistance + DistanceBias;
composer.CameraDistance = Mathf.SmoothDamp(
composer.CameraDistance,
targetDistance,
ref distanceVelocity,
distanceSmoothTime);
}
}
public void Nudge(Vector3 worldDelta)
{
ManualPanOffset += worldDelta;
}
public void ClampManualPan(float maxDistance)
{
if (followTarget == null)
{
return;
}
var offset = ManualPanOffset;
offset.y = 0f;
if (offset.magnitude > maxDistance)
{
ManualPanOffset = offset.normalized * maxDistance;
}
}
}
}