using UnityEngine;
using System.Collections;

public class ColorFade : MonoBehaviour {

    SpriteRenderer render;

	// 初期化処理
	void Awake () {
        render = GetComponent<SpriteRenderer>();
	}
    // 切り替え時間
    float MaxTime;
    // 現在の時間
    float NowTime;
    // フェードイン:true
    bool FadeinFlag;
    // 処理フラグ
    bool Flag = false;
    // 変更前の色
    Color BeforeColor;
    // 変更後の色
    Color AfterColor;
    // 色変更フラグ
    bool ColorChangeFlag = false;
    
    // フェードイン
    public void Fadein() {
        Flag = false;
        render.color = new Color(render.color.r, render.color.g, render.color.b, 1.0f);
        
    }
    public void Fadein(float t) {
        if (t <= 0) {
            Debug.Log("ColorFadeのFadein処理の引数tに0以下の値が代入されたので、一瞬で切り替えます。　tの値→" + t);
            Fadein();
            return;
        }
        MaxTime = t;
        NowTime = 0;
        FadeinFlag = true;
        BeforeColor = render.color;
        ColorChangeFlag = false;
        Flag = true;
    }
    // フェードアウト
    public void Fadeout() {
        Flag = false;
        render.color = new Color(render.color.r, render.color.g, render.color.b, 0.0f);
    }
    public void Fadeout(float t) {
        if (t <= 0) {
            Debug.Log("ColorFadeのFadeout処理の引数tに0以下の値が代入されたので、一瞬で切り替えます。　tの値→" + t);
            Fadein();
            return;
        }
        MaxTime = t;
        NowTime = 0;
        FadeinFlag = false;
        BeforeColor = render.color;
        ColorChangeFlag = false;
        Flag = true;
    }
    // 色替え
    public void ColorChange(Color c) {
        Flag = false;
        render.color = c;
    }
    public void ColorChange(Color c,float t) {
        if (t <= 0) {
            Debug.Log("ColorFadeのColorChange処理の引数tに0以下の値が代入されたので、一瞬で切り替えます。　tの値→" + t);
            ColorChange(c);
            return;
        }
        MaxTime = t;
        NowTime = 0;
        BeforeColor = render.color;
        AfterColor = c;
        ColorChangeFlag = true;
        Flag = true;
    }

    // 更新
    void Update () {
        if (Flag) {
            // 時間更新
            NowTime += Time.deltaTime;
            if (ColorChangeFlag) {
                // 色替えあり
                if (NowTime >= MaxTime) {
                    // 指定時間になったらフェード終了
                    render.color = AfterColor;
                    Flag = false;
                    return;
                }
                // 色を変えていく
                render.color = new Color(
                    Mathf.Lerp(BeforeColor.r, AfterColor.r, NowTime / MaxTime),
                    Mathf.Lerp(BeforeColor.g, AfterColor.g, NowTime / MaxTime),
                    Mathf.Lerp(BeforeColor.b, AfterColor.b, NowTime / MaxTime),
                    Mathf.Lerp(BeforeColor.a, AfterColor.a, NowTime / MaxTime));
            } else {
                // 色替えなし
                if (NowTime >= MaxTime) {
                    // 指定時間になったらフェード終了
                    if (FadeinFlag) Fadein();
                    else Fadeout();
                    Flag = false;
                    return;
                }
                // 透明度を変えていく
                if (FadeinFlag) {
                    render.color = new Color(
                        BeforeColor.r,
                        BeforeColor.g,
                        BeforeColor.b,
                        Mathf.Lerp(BeforeColor.a, 1.0f, NowTime / MaxTime));
                }else {
                    render.color = new Color(
                        BeforeColor.r,
                        BeforeColor.g,
                        BeforeColor.b,
                        Mathf.Lerp(BeforeColor.a, 0.0f, NowTime / MaxTime));
                }
            }
        }
	}
}
