我怎样才能让所有的游戏对象依次闪烁?

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());
}

我们可能还想设置逻辑以在我们完成让灯闪烁后进行清理,但现在这已经足够了。