每 X 秒创建一个对象 "Flicker"

Making an object "Flicker" every X seconds

我需要让一个对象每隔 X 秒闪烁一次。到目前为止,我有实际闪烁的代码并且效果很好,但是我需要闪烁持续 X 秒,然后关闭,然后再持续 X 秒。类似于打开频闪灯(闪烁),然后关闭。

我知道像 invokeRepeating 这样的东西会起作用,但是闪烁依赖于在 FixedUpdate 中,因为它每帧 运行。

对于任何想知道我实际上是在尝试用图像调制和注意力做点什么的人。这是我目前所拥有的:

public class scrFlicker : MonoBehaviour {
    public SpriteRenderer sRen;
    public float cycleHz; // Hz, the mesurement of cycles.

    private float dtime = 0; // delta time
    private Color alpha;

    // Use this for initialization
    void Start () {
        sRen = GetComponent<SpriteRenderer>();
        GetComponent<SpriteRenderer>().enabled = false;
        alpha = sRen.color;
        alpha.a = 0.4f;
        sRen.color = alpha;
     }

     // Update is called once per frame
     void FixedUpdate () {
        startFlicker();
     }

     void startFlicker() {
        dtime += Time.deltaTime;

        float wave = Mathf.Sin((dtime * 2.0f * Mathf.PI) * cycleHz);

        if(wave > 0.0f) {
            GetComponent<SpriteRenderer>().enabled = true;
        } else {
            GetComponent<SpriteRenderer>().enabled = false;
        }

        if (wave == 0.0f) {
            dtime = 0.0f;
        }
    }
}

您可以在下面创建类似计时器的东西来管理开启和关闭时间:

float toggletime;

 void FixedUpdate () {
    toggletime += Time.deltaTime;
    if (toggletime < 2) // flicker will occur from 0-2 seconds
        startFlicker();
    else if (toggletime > 4) // nothing will occur between 2-4 seconds
        toggletime = 0; // reset timer after 4 seconds have passed
 }

"I know something like invokeRepeating would work however the flickering relies on being in the FixedUpdate for it to run every frame."

FixedUpdate 用于物理。当然你可以将它用于其他目的,但如果它们与物理无关那么它不是主要目的。

Invoke 实际上会很好,你可以完全控制它。

float timer = 2f;
bool isOn = false;
void Start()
{
    Invoke("Method", timer);
}

void Method()
{
    // you can change timer if needed
    this.timer = Random.Range(0f, maxTimer);
    this.isOn = !this.isOn;
    Invoke("Method", this.timer);
}

void CancelMethodAndResetTimerForAnyReason()
{
     CancelInvoke();
     this.timer = Random.Range(0f, maxTimer);
     Invoke("Method", this.timer);
}