C# 中的简单 "Traffic" 轻型脚本

Simple "Traffic" light script in C#

我有一个简单的代码,通过激活和停用红灯和绿灯的 2 个灯光游戏对象,每 x 秒改变一次红色和绿色之间的颜色。或者这就是它应该做的,但是当我 运行 它时没有任何反应。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    public GameObject redLight;
    public GameObject greenLight;

    void Start()
    {
        redLight.SetActive(true);
    }

    // Update is called once per frame
    void Update()
    {
        StartCoroutine(switchLight());
    }

    IEnumerator switchLight()
    {
        while (true)
        {
            redLight.SetActive(true);
            greenLight.SetActive(false);
            yield return new WaitForSeconds(5);
            redLight.SetActive(false);
            greenLight.SetActive(true);
            Debug.Log("loop end");

        }
    }
}

这就是我目前所知道的,它没有显示任何编译器错误并且调试显示它确实通过了循环和所有。我是 C# 的新手,所以我不知道这段代码是否适合我正在尝试做的事情。任何指点将不胜感激,谢谢。

您不应在 Update() 中启动协程。这将启动一堆新的 while 循环(因为您在协程中使用了 while 循环),即使您没有使用 while 循环,这仍然会在每一帧切换灯光并产生一堆问题。

而是在 Start() 函数中启动协程。此外,你需要在两个开关之后 yield 而不仅仅是在中间(否则只是立即取消开关)

这是适用于可能需要它的任何其他人的最终代码,可能有些混乱但它有效:)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    public GameObject redLight;
    public GameObject greenLight;
    
    void Start()
    {
        StartCoroutine (lightSwitch());
    }

    IEnumerator lightSwitch()
    {
        while (true)
        {
            redLight.SetActive(true);
            greenLight.SetActive(false);
            yield return new WaitForSeconds(10);
            
            redLight.SetActive(false);
            greenLight.SetActive(true);
            yield return new WaitForSeconds(10);
        }
    }
}