Unity 中的灯不闪烁
Light isn't flashing in Unity
在解决了一个 之后,我一直遇到脚本中的目标灯不闪烁的问题。
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)
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())
:
调用或启动它
在解决了一个
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)
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())
: