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));
}