统一渐变色淡化

时间:2016-06-05 03:55:21

标签: c# unity3d

我正试图在C#的天气系统中对两种颜色进行淡入淡出。我正在使用以下代码淡化云使用的渐变键的颜色:

void ChangeWeather(string to)
{
    Gradient g = skyController.WispyColorGradientColor[0];
    GradientColorKey[] gck = new GradientColorKey[5];
    GradientAlphaKey[] gak = new GradientAlphaKey[2];

    gak[0].alpha = 1f;
    gak[1].alpha = 1f;
    gak[0].time = 0f;
    gak[1].time = 100f;

    Color color = new Color();

    skyController.WispyColorGradientColor[0] = g;

    //Set the initial value
    gck[0] = g.colorKeys[0];
    gck[1] = g.colorKeys[1];
    gck[2] = g.colorKeys[2];
    gck[3] = g.colorKeys[3];
    gck[4] = g.colorKeys[4];

    //refer te variables
    g.colorKeys[0] = gck[0];
    g.colorKeys[1] = gck[1];
    g.colorKeys[2] = gck[2];
    g.colorKeys[3] = gck[3];
    g.colorKeys[4] = gck[4];

    //set the times
    gck[0].time = .209f;
    gck[1].time = .238f;
    gck[2].time = .50f;
    gck[3].time = .756f;
    gck[4].time = .791f;

    if (to == "clear")
    {
        ColorUtility.TryParseHtmlString(cleanCloudsColors[0], out color);

        gck[0].color = Color.Lerp(g.colorKeys[0].color, color, changeSpeed * Time.deltaTime);
        gck[4].color = Color.Lerp(g.colorKeys[4].color, color, changeSpeed * Time.deltaTime);

        ColorUtility.TryParseHtmlString(cleanCloudsColors[1], out color);

        gck[1].color = Color.Lerp(g.colorKeys[1].color, color, changeSpeed * Time.deltaTime);
        gck[3].color = Color.Lerp(g.colorKeys[3].color, color, changeSpeed * Time.deltaTime);

        ColorUtility.TryParseHtmlString(cleanCloudsColors[2], out color);

        gck[2].color = Color.Lerp(g.colorKeys[2].color, color, changeSpeed * Time.deltaTime);

        Debug.Log("Changing");
    }
}

“skyController.WispyColorGradientColor [0]”是指数组列表中的渐变,“ColorUtility.TryParseHtmlString”只是将十六进制颜色(如#fff)转换为RGB。它记录了“改变”,但是,云正在改变颜色而不褪色,所以我做了这些改变而且没有改变。我需要FADE,但似乎没有任何工作。 :(

编辑:我使用类似代码尝试在5秒内淡化颜色:

float fadeTime = 5f;

void Update(){
    //...
    if (param)
        StartCoroutine(fadeColor(0, Color.grey, Color.white));
    //...
}

IEnumerator fadeColor (int index, Color from, Color to){
    float counter = 0;

    while (counter < fadeTime){
        counter += Time.deltaTime;
        gradient.colorKeys[index].color = Color.Lerp(from, to, counter / fadeTime);
    }

    yield return null;
}

它会改变颜色,但会立即改变,我想随着时间的推移而改变。

1 个答案:

答案 0 :(得分:1)

无法理解您的代码,但我所知道的是您希望在两种颜色之间淡入淡出。这应该使用Coroutine来完成。下面的函数应该在任何GameObject中的两种颜色之间淡入淡出。您可以轻松修改它以适应您正在做的任何事情。

下面的函数调用会在5秒内将GameObject的颜色更改为红色。

StartCoroutine(fadeColor(obj, Color.red, 5));

淡化功能:

IEnumerator fadeColor(GameObject objectToFade, Color newColor, float fadeTime = 3)
{
    int mode = 0;

    Color currentColor = Color.clear;

    SpriteRenderer tempSPRenderer = objectToFade.GetComponent<SpriteRenderer>();
    Image tempImage = objectToFade.GetComponent<Image>();
    RawImage tempRawImage = objectToFade.GetComponent<RawImage>();
    Renderer tempRenderer = objectToFade.GetComponent<Renderer>();

    //Check if this is a Sprite
    if (tempSPRenderer != null)
    {
        currentColor = tempSPRenderer.color;
        mode = 0;
    }
    //Check if Image
    else if (tempImage != null)
    {
        currentColor = tempImage.color;
        mode = 1;
    }
    //Check if RawImage
    else if (tempRawImage != null)
    {
        currentColor = tempRawImage.color;
        mode = 2;
    }
    //Check if 3D Object
    else if (tempRenderer != null)
    {
        currentColor = tempRenderer.material.color;
        mode = 3;
    }
    else
    {
        yield break;
    }

    float counter = 0;

    while (counter < fadeTime)
    {
        counter += Time.deltaTime;
        switch (mode)
        {
            case 0:
                tempSPRenderer.color = Color.Lerp(currentColor, newColor, counter / fadeTime);
                break;
            case 1:
                tempImage.color = Color.Lerp(currentColor, newColor, counter / fadeTime);
                break;
            case 2:
                tempRawImage.color = Color.Lerp(currentColor, newColor, counter / fadeTime);
                break;
            case 3:
                tempRenderer.material.color = Color.Lerp(currentColor, newColor, counter / fadeTime);
                break;
        }
        yield return null;
    }
}