【问题标题】:Making an object "Flicker" every X seconds每 X 秒让一个对象“闪烁”一次
【发布时间】:2018-09-29 03:51:06
【问题描述】:

我需要让一个对象每隔 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;
        }
    }
}

【问题讨论】:

    标签: c# unity3d frame-rate flicker


    【解决方案1】:

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

    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
     }
    

    【讨论】:

    • 这会导致错误使用 deltaTime。 FixedUpdate 已经固定,但deltaTime 取决于帧速率,因此您可以在每次运行时获得不同的值。
    • 根据unity docs - deltaTime 是测量时间增量的推荐方法(包括在 FixedUpdate 中),而 fixedDeltaTime 用于物理。
    • 好吧,在 FixedUpdate 中调用时,Unity 似乎正在重置 deltaTime 的值,如果你问我,我会说这不聪明。所以是的会运行。
    【解决方案2】:

    “我知道像 invokeRepeating 这样的东西会起作用,但是闪烁依赖于在 FixedUpdate 中才能运行每一帧。”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多