Files
decay-grid/Assets/Scripts/Infrastructure/Unity/BeatPulseController.cs

66 lines
1.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Events;
namespace Infrastructure.Unity
{
public class BeatPulseController : MonoBehaviour
{
[Header("Music Settings")]
[Tooltip("Beats Per Minute of your track")]
[SerializeField] private float bpm = 90f;
[Tooltip("Delay in seconds to sync the first beat with the music start")]
[SerializeField] private float startDelay = 0.0f;
[Header("Events")]
public UnityEvent OnBeat; // Fires every beat (1, 2, 3, 4)
public UnityEvent OnMeasure; // Fires every 4th beat (The Drop)
private float _beatInterval;
private float _timer;
private int _beatCount;
private bool _isRunning;
private void Start()
{
if (bpm > 0) _beatInterval = 60f / bpm;
}
public void BeginTracking()
{
_timer = -startDelay;
_beatCount = 0;
_isRunning = true;
}
public void StopTracking()
{
_isRunning = false;
}
private void Update()
{
if (!_isRunning) return;
_timer += Time.deltaTime;
if (_timer >= _beatInterval)
{
_timer -= _beatInterval;
Pulse();
}
}
private void Pulse()
{
_beatCount++;
OnBeat?.Invoke();
if (_beatCount % 4 == 0)
{
OnMeasure?.Invoke();
}
}
}
}