解决ReferenceError with my Flash_Light.cs
script后,我遇到了一个问题,脚本中的目标指示灯将不会闪烁。
Flash_Light
脚本已附加到LampPost_A_Blink1
,LampPost_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)
答案 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())
来调用或启动它: