随机更改相机背景颜色

时间:2017-11-02 13:34:07

标签: c# unity3d colors background-color smoothing

我正在尝试平滑地更改相机随机拾取的两种颜色之间的背景颜色。我已经实现了这一点,但随后我开始注意到每当选择一种新颜色时都会闪烁。我已在此link上传了该问题的视频。这是我目前正在使用的脚本:

public Color color1;
public Color color2;

float time;
float time2;
float transition;

int firstColor = 0;


void Update()
{
    if (firstColor == 0)
    {
        color1 = Random.ColorHSV(Random.value, Random.value);
        color2 = Random.ColorHSV(Random.value, Random.value);

        firstColor = 1;
    }

    Camera.main.backgroundColor = Color.Lerp(color2, color1, transition);

    time += Time.deltaTime;
    time2 += Time.deltaTime;
    transition = time2 / 5;

    if (time > 5)
    {
        color2 = color1;
        color1 = Random.ColorHSV(Random.value, Random.value);

        time = 0;
        time2 = 0;
    }
}

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

您需要使用协程执行此操作。然后,您可以轻松地编程在当前转换结束后何时更改新颜色。你必须加班加点,你应该总是考虑使用协同程序。它消除了很多布尔变量和混淆的需求。

您可以在没有布尔变量的协程函数中等待,但是您可以在Update函数之类的void函数中等待。您已经在使用Time.deltaTimeLerp功能,因此您知道自己正在做什么。这是一个正确的方法:

//2 seconds within each transition/Can change from the Editor
public float transitionTimeInSec = 2f;

private bool changingColor = false;

private Color color1;
private Color color2;


void Start()
{
    StartCoroutine(beginToChangeColor());
}

IEnumerator beginToChangeColor()
{
    Camera cam = Camera.main;
    color1 = Random.ColorHSV(Random.value, Random.value);
    color2 = Random.ColorHSV(Random.value, Random.value);

    while (true)
    {
        //Lerp Color and wait here until that's done
        yield return lerpColor(cam, color1, color2, transitionTimeInSec);

        //Generate new color
        color1 = cam.backgroundColor;
        color2 = Random.ColorHSV(Random.value, Random.value);
    }
}

IEnumerator lerpColor(Camera targetCamera, Color fromColor, Color toColor, float duration)
{
    if (changingColor)
    {
        yield break;
    }
    changingColor = true;
    float counter = 0;

    while (counter < duration)
    {
        counter += Time.deltaTime;

        float colorTime = counter / duration;
        Debug.Log(colorTime);

        //Change color
        targetCamera.backgroundColor = Color.Lerp(fromColor, toColor, counter / duration);
        //Wait for a frame
        yield return null;
    }
    changingColor = false;
}

答案 1 :(得分:1)

我的猜测是错误在这里:

if (time > 5)
{
    color2 = color1;
    color1 = Random.ColorHSV(Random.value, Random.value);

    time = 0;
    time2 = 0;
}

如果您注意到,眨眼发生在游戏时间开始约5秒后,游戏时间开始时间约为3秒,绿色眨眼时间约为7-8秒。

我认为color2 = color1;行是错误的。

基本上,您在前5秒内平滑颜色,在2种颜色之间进行插值,然后随机强制颜色。这会产生眨眼效果。

答案 2 :(得分:0)

虽然@ Programmer的回答是现场的,并且它完美无缺,但我设法在上面的代码中找到了问题。

在我将第29行中的 color1 设置为新的随机颜色后,转换的值为1(钳位)。 因此,在第25行的下一帧中设置 转换 之前,第21行执行,并且由于transition = 1,新的 color1 ,因此新 color1 的“闪烁”。因此,在重新设置 时间 time2后,我只需将 转换 重新设置为0

答案 3 :(得分:0)

闪烁 用这个

 if (time > 5)
    {
        color2 = color1;
        color1 = Random.ColorHSV(Random.value, Random.value);

        time = 0;
        time2 = 0;
    }
    else
    {
        time += Time.deltaTime;
        time2 += Time.deltaTime;
        transition = time2 / 5;
        background.color = Color.Lerp(color2, color1, transition);
    }