Unity中指示灯不闪烁

时间:2018-10-11 18:42:17

标签: c# unity3d light

解决ReferenceError with my Flash_Light.cs script后,我遇到了一个问题,脚本中的目标指示灯将不会闪烁。

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)

1 个答案:

答案 0 :(得分:1)

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

此外,因为您不是在等待一帧,而是要在多个帧上执行代码,所以它只会在一个帧中执行,因此您将无法看到灯光的变化。解决方案是将yield return null放入每个while循环中。它将使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())来调用或启动它: