Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让所有游戏对象依次闪烁?_C#_Unity3d_Unity5 - Fatal编程技术网

C# 如何让所有游戏对象依次闪烁?

C# 如何让所有游戏对象依次闪烁?,c#,unity3d,unity5,C#,Unity3d,Unity5,我的意思是像飞机着陆灯的效果。第一个对象的颜色为红色,然后变为绿色,下一个对象的颜色为红色,然后变为绿色,下一个对象的颜色为红色,以此类推。比如显示路径或路线。从红色开始,然后在0.5秒后从绿色开始。我想。效果是显示/照亮一条路/路径 内部更新 void Update() { StartCoroutine(LightsEffect()); } 然后 IEnumerator lightseeffect() { for(int i=0;i

我的意思是像飞机着陆灯的效果。第一个对象的颜色为红色,然后变为绿色,下一个对象的颜色为红色,然后变为绿色,下一个对象的颜色为红色,以此类推。比如显示路径或路线。从红色开始,然后在0.5秒后从绿色开始。我想。效果是显示/照亮一条路/路径

内部更新

void Update()
{
    StartCoroutine(LightsEffect());
}
然后

IEnumerator lightseeffect()
{
for(int i=0;i

但这会将它们全部涂成绿色。

我会这样做:

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;
    }
}
公共列表对象;
公共浮动延迟=0.1f;
私有渲染器[]渲染器;
私人浮动时间;
私人指数=0;
无效唤醒()
{
//检索每个对象的渲染器并初始化为红色
renderers=新渲染器[objects.Count];
对于(int i=0;ilastChangeTime+延迟)
{
lastChangeTime=Time.Time;
//将最后一个渲染器的颜色设置为红色
//并且当前的颜色为绿色
渲染器[greenIndex].material.color=color.red;
greenIndex=(greenIndex+1)%renders.Length;
渲染器[greenIndex].material.color=color.green;
}
}

如果您想将此作为一个协同路由(不是我的偏好,而是Hellium答案的替代方案),您需要了解协同路由不是一个循环(最后一个
产生
没有任何帮助:一旦完成,就没有其他代码运行,方法终止)

因此,我们将从您最初的协程方法开始,并使其成为一个循环:

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

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

我肯定不会在每一帧调用
startcroutine
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());
}