Unity3d 统一-我能';我似乎不喜欢我的游戏对象';s颜色
我只是想让一个观察者模式程序,一个对象随机改变颜色,并使一组其他对象改变相同的颜色,但我希望它们在5秒内逐渐改变。我正在尝试lerp,但它只是立即交换颜色。我认为这可能与lerp的起始颜色有关,因为主要对象是不断变换颜色,新颜色变成旧颜色。因此,我需要考虑如何为lerp选择起始颜色。我不确定这是否与我的lerp不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。多谢各位Unity3d 统一-我能';我似乎不喜欢我的游戏对象';s颜色,unity3d,lerp,Unity3d,Lerp,我只是想让一个观察者模式程序,一个对象随机改变颜色,并使一组其他对象改变相同的颜色,但我希望它们在5秒内逐渐改变。我正在尝试lerp,但它只是立即交换颜色。我认为这可能与lerp的起始颜色有关,因为主要对象是不断变换颜色,新颜色变成旧颜色。因此,我需要考虑如何为lerp选择起始颜色。我不确定这是否与我的lerp不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。多谢各位 public class Subject : MonoBehaviour { public float t
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;
}
}
}
公共课科目:单一行为{
公共浮动计时器=0.0f;
公共游戏对象[]观察员;
浮动t=0;
颜色旧颜色;
无效更新(){
t+=时间增量/5.0f;
timer+=Time.deltaTime;
如果(计时器>=10f){
Color newColor=新颜色(Random.value,Random.value,Random.value,1.0f);
GetComponent().material.color=newColor;
for(int i=0;i颜色。Lerp(颜色a、颜色b、浮动t)
的作用是
通过t在颜色a和b之间进行线性插值
例如,Color.Lerp(Color.blue,Color.red,0.5f)
返回蓝色和红色之间的中间插值。
当您说Color.Lerp(oldColor,newColor,5)
时,它将返回newColor,因为
t被夹在0和1之间。当t为0时,返回a。当t为1时
返回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);
}
float t=0;
私有void更新()
{
t+=Time.deltaTime/5.0f;//除以5等于5秒。
this.GetComponent().color=color.Lerp(oldColor,newColor,t);
}
编辑
另外,假设在定时器触发时重置了t,代码中会发生什么
float t,定时器;
布尔勒平=假;
新颜色;
无效更新()
{
t+=时间增量/5.0f;
timer+=Time.deltaTime;
如果(计时器>=10f)
{
勒平=真;
t=0;
newColor=新颜色(Random.value,Random.value,Random.value,1.0f);
Log(“Lerping!”);
定时器=0;
}
如果(勒平)
{
GetComponent().material.color=color.Lerp(oldColor、newColor、t);
如果(t>=1.0f)
{
勒平=假;
Log(“已停止删除”);
}
}
}
我试过这个,但颜色仍然会立即改变。无论是在if语句中还是在for循环中,我将t增量行放在何处都很重要吗?我尝试在示例中应用代码,效果很好。我不认为它应该在for循环中,如果这不是你想要的,那么如果你一直在每帧增加t,当你真正想要使用它时,它的值可能大于1。。因此,要么在开始lerp之前重置它,要么在lerp时增加它。我尝试在lerp之前使用t=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");
}
}
}