В Unity не мигает свет - PullRequest
       11

В Unity не мигает свет

0 голосов
/ 11 октября 2018

После решения ReferenceError с моим Flash_Light.cs сценарием у меня возникла проблема, из-за которой не мигает целевой индикатор в сценарии.

Сценарий 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)

1 Ответ

0 голосов
/ 11 октября 2018

Unity's 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;
}

Поскольку это функция карутины, не забудьте вызвать или запустить ее с StartCoroutine(flashNow()) * * 1014

...