Fadder.cs 1.69 KB
using UnityEngine;
using UnityEngine.UI;

public class Fadder : MonoBehaviour {

	public bool visible = true;
	public float visibleAlpha = 1f;
	public float hiddenAlpha = 0f;
	public float showingSpeed = 0.01f;
	public float hiddingSpeed = 0.01f;
	public bool disableWhenHidden = true;

	private CanvasRenderer mainRenderer;
	private CanvasRenderer[] renderers;
	private bool visibilityChange = false;

	public void fade(bool visible)
	{
		if (this.visible != visible)
		{
			this.gameObject.transform.localScale = new Vector3(1, 1, 1);
			this.visible = visible;

			visibilityChange = true;
		}
    }

	public void set(bool visible)
	{
		this.visible = visible;

		float alpha = visible ? visibleAlpha : hiddenAlpha;

		foreach (CanvasRenderer renderer in renderers)
			renderer.SetAlpha(alpha);
		
		updateScale();
	}

	private void updateScale()
	{
		if (disableWhenHidden && this.mainRenderer.GetAlpha() == hiddenAlpha)
			this.gameObject.transform.localScale = new Vector3(0, 0, 0);
	}

	void Start ()
	{
		mainRenderer = this.gameObject.GetComponent<CanvasRenderer>();
		renderers = this.gameObject.GetComponentsInChildren<CanvasRenderer>();

		hiddingSpeed = -hiddingSpeed;

		set(visible);
    }
	
	void Update ()
	{
		if (visibilityChange)
		{
			float objective = visible ? visibleAlpha : hiddenAlpha;
			visibilityChange = false;

			foreach (CanvasRenderer renderer in renderers)
			{
				float alpha = renderer.GetAlpha();

				if (alpha != objective)
				{
					float speed = visible ? showingSpeed : hiddingSpeed;
					renderer.SetAlpha(Mathf.Abs(alpha - objective) < Mathf.Abs(speed) ? objective : alpha + speed);
					visibilityChange = true;
				}
			}

			if (visibilityChange) updateScale();
		}
	}

}