随机更改相机背景颜色

我正在尝试在随机选择的两种颜色之间平滑更改相机的背景颜色.我已经实现了,但是随后我开始注意到,每当选择一种新颜色时都会出现闪光.我已经在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;
    }
}

很感谢任何形式的帮助.

解决方法:

您需要使用协程进行此操作.然后,您可以轻松地编程当前过渡结束后何时更改新颜色.任何您需要加班的事情,都应该始终考虑使用协程.它消除了很多布尔变量和混乱的需求.

您可以在没有布尔变量的协程函数中等待,但不能在诸如Update函数的void函数中等待.您已经在使用Time.deltaTime和Lerp函数,因此您知道自己在做一半.这是执行此操作的正确方法

//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;
}

相关文章

前言 本文记录unity3D开发环境的搭建 unity安装 unity有中文...
前言 有时候我们希望公告牌跟随镜头旋转永远平行面向屏幕,同...
前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行...
前言 在unity中我们常用的获取鼠标点击的方法有: 1、在3D场...
前言 在之前的例子中,我们都没有用到unity的精髓,例如地形...
这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...