C# 随时间增加和减少光照强度
我想创造一些团结的萤火虫。我想增加光的强度,然后等几秒钟,然后降低它。当它们产卵时,我希望它们增加光强度,等待几秒钟,然后淡出。如何以干净的方式创建此“流程”C# 随时间增加和减少光照强度,c#,unity3d,C#,Unity3d,我想创造一些团结的萤火虫。我想增加光的强度,然后等几秒钟,然后降低它。当它们产卵时,我希望它们增加光强度,等待几秒钟,然后淡出。如何以干净的方式创建此“流程” private Light pointLight; // The light component of the firefly private float minLuminosity = 0; // min intensity private float maxLuminosity = 1; // max intensity priv
private Light pointLight; // The light component of the firefly
private float minLuminosity = 0; // min intensity
private float maxLuminosity = 1; // max intensity
private float luminositySteps = 0.005f; // factor when increasing / decreasing
private float shineDuration = 3; // wait 3 seconds when faded in
private void Start()
{
pointLight = GetComponent<Light>();
pointLight.intensity = Random.Range(minLuminosity, maxLuminosity); // start with a random intensity
StartCoroutine(ChangeIntensity()); // start the process
}
private IEnumerator ChangeIntensity()
{
pointLight.intensity += luminositySteps; // increase the firefly intensity / fade in
yield return new WaitWhile(() => pointLight.intensity >= maxLuminosity); // wait for the maximum intensity
yield return new WaitForSeconds(shineDuration); // wait 3 seconds
pointLight.intensity -= luminositySteps;
yield return new WaitWhile(() => pointLight.intensity <= maxLuminosity); // wait for the minimum intensity
StartCoroutine(ChangeIntensity()); // do it again
}
private Light pointLight;//萤火虫的轻的部分
专用浮点最小亮度=0;//最小强度
专用浮点最大亮度=1;//最大强度
专用浮点数光度步长=0.005f;//增加/减少时的系数
私人浮点数=3;//淡入时等待3秒钟
私有void Start()
{
pointLight=GetComponent();
pointLight.intensity=Random.Range(minluminity,maxluminity);//从随机强度开始
start例程(ChangeIntensity());//启动进程
}
私有IEnumerator ChangeIntensity()
{
pointLight.intensity+=luminositySteps;//增加萤火虫强度/淡入
yield返回新的WaitWhile(()=>pointLight.intensity>=maxluminomity);//等待最大强度
返回新的WaitForSeconds(shineDuration);//等待3秒
pointLight.intensity-=亮度步长;
yield return new WaitWhile(()=>pointLight.intensity您的代码中的问题是您只应用了一次亮度更改,因此您的WaitWhile
条件将永远不会达到。我会将这两个WaitWhile
更改为简单的while循环,然后使用:
private IEnumerator ChangeIntensity()
{
while(true)
{
while(pointLight.intensity最小亮度)
{
pointLight.intensity-=亮度步长;
返回新的WaitForEndOfFrame();
}
}
}
所以我通过使用以下while循环得到了它
private IEnumerator ChangeIntensity()
{
while (true)
{
pointLight.intensity += isIncreasing ? luminositySteps : -luminositySteps;
if (pointLight.intensity <= minLuminosity)
isIncreasing = true;
if (pointLight.intensity >= maxLuminosity)
{
isIncreasing = false;
yield return new WaitForSeconds(shineDuration);
}
yield return null;
}
}
private IEnumerator ChangeIntensity()
{
while(true)
{
pointLight.intensity+=IsIncreating?光度步长:-光度步长;
if(pointLight.intensity=最大亮度)
{
i递增=假;
收益率返回新的等待时间秒(shineDuration);
}
收益返回空;
}
}
即使已经解决了这个问题,当前的解决方案只是减少变量,并且每帧都会创建新对象(WaitForSeconds
)
使用Mathf.Lerp
和Time.deltaTime
进行统一操作的正确方法是使用Mathf.Lerp
进行这种类型的操作,即从minluminomity
到maxluminomity
。您可以在我的另一个问题中了解更多关于使用alp淡出/进入游戏对象的信息ha组件
我从中获取了fadeInAndOut
函数,并将其移植到Light
组件中。下面是一个简单的灯光淡入/淡出函数:
IEnumerator fadeInAndOut(Light lightToFade, bool fadeIn, float duration)
{
float minLuminosity = 0; // min intensity
float maxLuminosity = 1; // max intensity
float counter = 0f;
//Set Values depending on if fadeIn or fadeOut
float a, b;
if (fadeIn)
{
a = minLuminosity;
b = maxLuminosity;
}
else
{
a = maxLuminosity;
b = minLuminosity;
}
float currentIntensity = lightToFade.intensity;
while (counter < duration)
{
counter += Time.deltaTime;
lightToFade.intensity = Mathf.Lerp(a, b, counter / duration);
yield return null;
}
}
用法:
public Light lightToFade;
public float eachFadeTime = 2f;
public float fadeWaitTime = 5f;
void Start()
{
StartCoroutine(fadeInAndOutRepeat(lightToFade, eachFadeTime, fadeWaitTime));
}
“淡出”是什么意思?你是说光强度?是的,我只是想改变光强度。我在做其他事情。回来后看到了一些答案,但它们需要改进,所以我添加了我的答案。很抱歉,这不起作用,协作就到此为止too@peterHasemann我不明白这怎么可能。你是不是把比oper差的和比oper高的放在一起了正确吗?Isuka,可能第二个while应该是“while(pointLight.intensity>minluminity)”,而不是“while(pointLight.intensity>maxluminity)”。我只是复制了你的can并尝试使用它。循环就像我以前的代码一样立即停止:/@rs232确实应该检查一下。
//Fade in and out forever
IEnumerator fadeInAndOutRepeat(Light lightToFade, float duration, float waitTime)
{
WaitForSeconds waitForXSec = new WaitForSeconds(waitTime);
while (true)
{
//Fade out
yield return fadeInAndOut(lightToFade, false, duration);
//Wait
yield return waitForXSec;
//Fade-in
yield return fadeInAndOut(lightToFade, true, duration);
}
}
public Light lightToFade;
public float eachFadeTime = 2f;
public float fadeWaitTime = 5f;
void Start()
{
StartCoroutine(fadeInAndOutRepeat(lightToFade, eachFadeTime, fadeWaitTime));
}