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