我怎样才能让所有的游戏对象依次闪烁?
How can i make all the gameobjects to flash in turn?
我的意思是像飞机着陆灯效果。第一个对象将是红色,然后它会变成绿色,下一个将是红色,然后是绿色,下一个是红色,依此类推。就像显示路径或路线一样。从红色开始,然后在 0.5 秒后从绿色开始。我认为。效果是show/light一个way/path.
内部更新
void Update()
{
StartCoroutine(LightsEffect());
}
然后
IEnumerator LightsEffect()
{
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.red;
}
yield return new WaitForSeconds(.5f);
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.green;
}
yield return new WaitForSeconds(.5f);
}
但是这一次把它们全部涂成绿色。
我会这样做:
public List<GameObject> objects ;
public float delay = 0.1f;
private Renderer[] renderers;
private float lastChangeTime;
private int greenIndex = 0;
void Awake()
{
// Retrieve the renderer of each object and init to red color
renderers = new Renderer[objects.Count];
for ( int i = 0 ; i < renderers.Length ; i++ )
{
renderers[i] = objects[i].GetComponent<Renderer>();
renderers[i].material.color = Color.red;
}
// Set green color to the first one
greenIndex = 0;
renderers[greenIndex].material.color = Color.green;
}
void Update()
{
// Change color each `delay` seconds
if( Time.time > lastChangeTime + delay )
{
lastChangeTime = Time.time;
// Set color of the last renderer to red
// and the color of the current one to green
renderers[greenIndex].material.color = Color.red;
greenIndex = ( greenIndex + 1 ) % renderers.Length;
renderers[greenIndex].material.color = Color.green;
}
}
如果您想将其保留为协程(不是我的偏好,而是 Hellium 的答案的替代方案),您需要了解协程不是循环(最后一个 yield
没有任何帮助: 一旦它完成,就没有其他代码运行并且该方法终止)。
所以我们将从您原来的协程方法开始,使成为一个循环:
IEnumerator LightsEffect()
{
while(true) {
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.red;
}
yield return new WaitForSeconds(.5f);
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.green;
}
yield return new WaitForSeconds(.5f);
}
}
现在,因为这永远不会真正终止,我们只需要启动协程一次:
void Awake()
{
StartCoroutine(LightsEffect());
}
我们可能还想设置逻辑以在我们完成让灯闪烁后进行清理,但现在这已经足够了。
我的意思是像飞机着陆灯效果。第一个对象将是红色,然后它会变成绿色,下一个将是红色,然后是绿色,下一个是红色,依此类推。就像显示路径或路线一样。从红色开始,然后在 0.5 秒后从绿色开始。我认为。效果是show/light一个way/path.
内部更新
void Update()
{
StartCoroutine(LightsEffect());
}
然后
IEnumerator LightsEffect()
{
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.red;
}
yield return new WaitForSeconds(.5f);
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.green;
}
yield return new WaitForSeconds(.5f);
}
但是这一次把它们全部涂成绿色。
我会这样做:
public List<GameObject> objects ;
public float delay = 0.1f;
private Renderer[] renderers;
private float lastChangeTime;
private int greenIndex = 0;
void Awake()
{
// Retrieve the renderer of each object and init to red color
renderers = new Renderer[objects.Count];
for ( int i = 0 ; i < renderers.Length ; i++ )
{
renderers[i] = objects[i].GetComponent<Renderer>();
renderers[i].material.color = Color.red;
}
// Set green color to the first one
greenIndex = 0;
renderers[greenIndex].material.color = Color.green;
}
void Update()
{
// Change color each `delay` seconds
if( Time.time > lastChangeTime + delay )
{
lastChangeTime = Time.time;
// Set color of the last renderer to red
// and the color of the current one to green
renderers[greenIndex].material.color = Color.red;
greenIndex = ( greenIndex + 1 ) % renderers.Length;
renderers[greenIndex].material.color = Color.green;
}
}
如果您想将其保留为协程(不是我的偏好,而是 Hellium 的答案的替代方案),您需要了解协程不是循环(最后一个 yield
没有任何帮助: 一旦它完成,就没有其他代码运行并且该方法终止)。
所以我们将从您原来的协程方法开始,使成为一个循环:
IEnumerator LightsEffect()
{
while(true) {
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.red;
}
yield return new WaitForSeconds(.5f);
for (int i = 0; i < objects.Count; i++)
{
objects[i].GetComponent<Renderer>().material.color = Color.green;
}
yield return new WaitForSeconds(.5f);
}
}
现在,因为这永远不会真正终止,我们只需要启动协程一次:
void Awake()
{
StartCoroutine(LightsEffect());
}
我们可能还想设置逻辑以在我们完成让灯闪烁后进行清理,但现在这已经足够了。