每隔X秒使一个物体“闪烁”

时间:2018-04-18 19:26:17

标签: c# unity3d unityscript frame-rate flicker

我需要每隔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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以在下面创建类似计时器的内容来管理开关时间:

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
 }

答案 1 :(得分:1)

&#34;我知道像invokeRepeating这样的东西会起作用,但是闪烁依赖于在FixedUpdate中运行每一帧。&#34;

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

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

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