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);
}
}
}
我有一个简单的代码,通过激活和停用红灯和绿灯的 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);
}
}
}