Unity-我似乎无法检测我的游戏对象的颜色
Unity-I can't seem to lerp my GameObject's Color
我只是想制作一个观察者模式程序,一个对象随机改变颜色并导致一组其他对象改变相同的颜色,但我希望它们在 5 秒内逐渐改变。我正在尝试 lerp,但它只是立即交换颜色。我认为这可能与 lerp 的起始颜色有关,因为主要对象不断变换颜色,新颜色变成旧颜色。所以我需要考虑如何为 lerp 选择起始颜色。我不确定这是否与我的 lerp 不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。谢谢你。
public class Subject : MonoBehaviour {
public float timer = 0.0f;
public GameObject[] observers;
float t = 0;
Color oldColor;
void Update () {
t += Time.deltaTime / 5.0f;
timer += Time.deltaTime;
if (timer >= 10f) {
Color newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
GetComponent<Renderer>().material.color = newColor;
for (int i = 0; i < observers.Length; i++) {
observers[i].GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
}
newColor=oldColor
timer = 0;
}
}
}
Color.Lerp(Color a, Color b, float t)
所做的是
Linearly interpolates between colors a and b by t
例如,Color.Lerp(Color.blue, Color.red, 0.5f)
return是蓝色和红色之间的中间插值。
当你说 Color.Lerp(oldColor, newColor, 5)
它会 return newColor,因为
t is clamped between 0 and 1. When t is 0 returns a. When t is 1
returns b.
所以 5 与放入 1 是一样的。
因此您需要在某处保留一个 t
变量,该变量从 0 开始递增到 1,您将其放入 Lerp
.
例如:
float t = 0;
private void Update()
{
t += Time.deltaTime / 5.0f; // Divided by 5 to make it 5 seconds.
this.GetComponent<Renderer>().color = Color.Lerp(oldColor, newColor, t);
}
https://docs.unity3d.com/ScriptReference/Color.Lerp.html
编辑
还有你的代码中发生了什么,假设你在定时器命中时重置了 t
- 计时器 >= 10.0f
- Lerp 一次
- 将计时器重置为 0
。
你可以做的是这样的(我把观察者和东西拿出来只是为了让它更容易看到)
float t, timer;
bool lerping = false;
Color newColor;
void Update()
{
t += Time.deltaTime / 5.0f;
timer += Time.deltaTime;
if (timer >= 10f)
{
lerping = true;
t = 0;
newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
Debug.Log("Lerping!");
timer = 0;
}
if (lerping)
{
GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
if (t >= 1.0f)
{
lerping = false;
Debug.Log("Stopped lerping");
}
}
}
我只是想制作一个观察者模式程序,一个对象随机改变颜色并导致一组其他对象改变相同的颜色,但我希望它们在 5 秒内逐渐改变。我正在尝试 lerp,但它只是立即交换颜色。我认为这可能与 lerp 的起始颜色有关,因为主要对象不断变换颜色,新颜色变成旧颜色。所以我需要考虑如何为 lerp 选择起始颜色。我不确定这是否与我的 lerp 不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。谢谢你。
public class Subject : MonoBehaviour {
public float timer = 0.0f;
public GameObject[] observers;
float t = 0;
Color oldColor;
void Update () {
t += Time.deltaTime / 5.0f;
timer += Time.deltaTime;
if (timer >= 10f) {
Color newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
GetComponent<Renderer>().material.color = newColor;
for (int i = 0; i < observers.Length; i++) {
observers[i].GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
}
newColor=oldColor
timer = 0;
}
}
}
Color.Lerp(Color a, Color b, float t)
所做的是
Linearly interpolates between colors a and b by t
例如,Color.Lerp(Color.blue, Color.red, 0.5f)
return是蓝色和红色之间的中间插值。
当你说 Color.Lerp(oldColor, newColor, 5)
它会 return newColor,因为
t is clamped between 0 and 1. When t is 0 returns a. When t is 1 returns b.
所以 5 与放入 1 是一样的。
因此您需要在某处保留一个 t
变量,该变量从 0 开始递增到 1,您将其放入 Lerp
.
例如:
float t = 0;
private void Update()
{
t += Time.deltaTime / 5.0f; // Divided by 5 to make it 5 seconds.
this.GetComponent<Renderer>().color = Color.Lerp(oldColor, newColor, t);
}
https://docs.unity3d.com/ScriptReference/Color.Lerp.html
编辑
还有你的代码中发生了什么,假设你在定时器命中时重置了 t
- 计时器 >= 10.0f
- Lerp 一次
- 将计时器重置为 0
。 你可以做的是这样的(我把观察者和东西拿出来只是为了让它更容易看到)
float t, timer;
bool lerping = false;
Color newColor;
void Update()
{
t += Time.deltaTime / 5.0f;
timer += Time.deltaTime;
if (timer >= 10f)
{
lerping = true;
t = 0;
newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
Debug.Log("Lerping!");
timer = 0;
}
if (lerping)
{
GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
if (t >= 1.0f)
{
lerping = false;
Debug.Log("Stopped lerping");
}
}
}