A UI/game component that creates an unscaled pulse animation for a Mimic choice preview. It updates a SpriteRenderer's color alpha and size over time using a cosine-based pulse and an initial fade-in.
namespace BlockParty;
/// <summary>Unscaled presentation pulse for a Mimic choice preview.</summary>
public sealed class MimicChoicePulse : Component
{
private const float PERIOD = 0.8f;
private const float FADE_IN_TIME = 0.4f;
private const float MIN_ALPHA = 0.6f;
private const float MAX_ALPHA = 0.9f;
private const float MAX_SCALE = 1.075f;
private SpriteRenderer _renderer;
private Vector2 _baseSize;
private float _elapsed;
public void Setup( SpriteRenderer renderer, Vector2 baseSize )
{
_renderer = renderer;
_baseSize = baseSize;
ApplyPulse();
}
protected override void OnUpdate()
{
if ( _renderer is null ) return;
_elapsed += Time.Delta;
ApplyPulse();
}
public void SetFadeInProgress( float progress )
{
_elapsed = Math.Clamp( progress, 0f, 1f ) * FADE_IN_TIME;
ApplyPulse();
}
private void ApplyPulse()
{
float pulse = 0.5f - MathF.Cos( _elapsed * MathF.PI * 2f / PERIOD ) * 0.5f;
float fadeIn = Math.Clamp( _elapsed / FADE_IN_TIME, 0f, 1f );
float alpha = (MIN_ALPHA + (MAX_ALPHA - MIN_ALPHA) * pulse) * fadeIn;
float scale = 1f + (MAX_SCALE - 1f) * pulse;
_renderer.Color = Color.White.WithAlpha( alpha );
_renderer.Size = _baseSize * scale;
}
}