我正在尝试平滑地更改相机随机拾取的两种颜色之间的背景颜色。我已经实现了这一点,但随后我开始注意到每当选择一种新颜色时都会闪烁。我已在此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;
}
}
非常感谢任何帮助。
答案 0 :(得分:2)
您需要使用协程执行此操作。然后,您可以轻松地编程在当前转换结束后何时更改新颜色。你必须加班加点,你应该总是考虑使用协同程序。它消除了很多布尔变量和混淆的需求。
您可以在没有布尔变量的协程函数中等待,但是您可以在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;
}
答案 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);
}