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