using Unity.Cinemachine; using UnityEngine; namespace NightclubArcadia.Cinematics { /// /// Raises a reveal camera priority while the player is inside the volume. /// [RequireComponent(typeof(BoxCollider))] public sealed class CameraFramingVolume : MonoBehaviour { [SerializeField] CinemachineCamera revealCamera; [SerializeField] int activePriority = 20; [SerializeField] float minDwell = 0.5f; CameraStateDirector stateDirector; int defaultPriority; int occupants; float exitTimer; void Awake() { var box = GetComponent(); box.isTrigger = true; if (revealCamera != null) { defaultPriority = revealCamera.Priority.Value; } stateDirector = FindFirstObjectByType(); } void OnTriggerEnter(Collider other) { if (!other.CompareTag("Player") || revealCamera == null) { return; } occupants++; exitTimer = 0f; revealCamera.Priority.Value = activePriority; stateDirector?.RegisterReveal(); } void OnTriggerExit(Collider other) { if (!other.CompareTag("Player") || revealCamera == null) { return; } occupants = Mathf.Max(0, occupants - 1); if (occupants == 0) { exitTimer = minDwell; } } void Update() { if (occupants > 0 || revealCamera == null) { return; } if (exitTimer > 0f) { exitTimer -= Time.deltaTime; return; } if (revealCamera.Priority.Value != defaultPriority) { revealCamera.Priority.Value = defaultPriority; stateDirector?.UnregisterReveal(); } } } }