代码之家  ›  专栏  ›  技术社区  ›  Daniel

使对象每X秒“闪烁”

  •  1
  • Daniel  · 技术社区  · 6 年前

    我需要让一个对象每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 回复  |  直到 4 年前
        1
  •  2
  •   ryeMoss    6 年前

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

    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
     }
    
        2
  •  1
  •   Everts    6 年前

    “我知道调用重复(invokereepeating)之类的方法会起作用,但闪烁依赖于处于固定更新(FixedUpdate)中,以便它运行每一帧。”

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

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