Entities/Abilities/MimicChoicePulse.cs

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.

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