Unity 中的灯不闪烁

Light isn't flashing in Unity

在解决了一个 之后,我一直遇到脚本中的目标灯不闪烁的问题。

Flash_Light 脚本附加到 LampPost_A_Blink1LampPost_A_Blink1 附加了一个灯(称为 RedLight),脚本似乎运行良好(没有警告或错误)。但是,灯不会闪烁。

我的脚本是:

using UnityEngine;
using System.Collections;

 public class Blink_Light : MonoBehaviour
 {

     public float totalSeconds = 2;     // The total of seconds the flash wil last
    public float maxIntensity = 8;     // The maximum intensity the flash will reach
    public Light myLight;

    void Awake()
    {
        //Find the RedLight
        GameObject redlight = GameObject.Find("LampPost_A_Blink1/RedLight");
        //Get the Light component attached to it
        myLight = redlight.GetComponent<Light>();
    }

    public IEnumerator flashNow()
    {
        float waitTime = totalSeconds / 2;
        // Get half of the seconds (One half to get brighter and one to get darker)

        while (myLight.intensity < maxIntensity)
        {
            myLight.intensity += Time.deltaTime / waitTime;        // Increase intensity
        }
        while (myLight.intensity > 0)
        {
            myLight.intensity -= Time.deltaTime / waitTime;        //Decrease intensity
        }
        yield return null;
    }
 }

进入播放模式时,灯会一直亮着,而不是像它应该的那样闪烁。

我该如何解决这个问题? (我有 Unity 2017.2.0f3)

Unity 的Time.deltaTime相同 在函数中或函数中的循环中。它改变每一帧,但调用一次函数是一帧。问题是您在 while 循环中使用它而没有等待下一帧,因此您获得了相同的值。

另外,因为你不是在等待一帧,而不是代码在多帧上执行,它只会在一帧内执行,你将无法看到灯光的变化。解决方案是在每个 while 循环中放入 yield return null。它将使 while 中的代码每帧循环 运行 直到满足条件然后退出。

public IEnumerator flashNow()
{
    float waitTime = totalSeconds / 2;
    // Get half of the seconds (One half to get brighter and one to get darker)

    while (myLight.intensity < maxIntensity)
    {
        myLight.intensity += Time.deltaTime / waitTime;        // Increase intensity
        //Wait for a frame
        yield return null;
    }
    while (myLight.intensity > 0)
    {
        myLight.intensity -= Time.deltaTime / waitTime;        //Decrease intensity
        //Wait for a frame
        yield return null;
    }
    yield return null;
}

因为这是一个caroutine函数,不要忘记用StartCoroutine(flashNow()):

调用或启动它