Progress Bar Attribute

Draws a horizontal progress bar based on the value of the property. Use it for displaying a meter to indicate how full an inventory is, or to make a visual indication of a health bar.

[ProgressBar(0, 100)]
public int ProgressBar = 50;

[HideLabel]
[ProgressBar(-100, 100, r: 1, g: 1, b: 1, Height = 30)]
public short BigColoredProgressBar = 50;

[ProgressBar(0, 10, 0, 1, 0, Segmented = true)]
public int SegmentedColoredBar = 5;

[ProgressBar(0, 100, ColorGetter = "GetHealthBarColor")]
public float DynamicHealthBarColor = 50;

// The min and max properties also support attribute expressions with the $ symbol.
[BoxGroup("Dynamic Range")]
[ProgressBar("Min", "Max")]
public float DynamicProgressBar = 50;

[BoxGroup("Dynamic Range")]
public float Min;

[BoxGroup("Dynamic Range")]
public float Max = 100;

[Range(0, 300)]
[BoxGroup("Stacked Health"), HideLabel]
public float StackedHealth = 150;

[HideLabel, ShowInInspector]
[ProgressBar(0, 100, ColorGetter = "GetStackedHealthColor", BackgroundColorGetter = "GetStackHealthBackgroundColor", DrawValueLabel = false)]
[BoxGroup("Stacked Health")]
private float StackedHealthProgressBar
{
    get { return this.StackedHealth % 100.01f; }
}

private Color GetHealthBarColor(float value)
{
    return Color.Lerp(Color.red, Color.green, Mathf.Pow(value / 100f, 2));
}

private Color GetStackedHealthColor()
{
    return
        this.StackedHealth > 200 ? Color.white :
        this.StackedHealth > 100 ? Color.green :
        Color.red;
}

private Color GetStackHealthBackgroundColor()
{
    return
        this.StackedHealth > 200 ? Color.green :
        this.StackedHealth > 100 ? Color.red :
        new Color(0.16f, 0.16f, 0.16f, 1f);
}