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

无限循环崩溃,但不在更新函数中

  •  0
  • Don  · 技术社区  · 6 年前

    这些脚本导致Unity挂起。我错过了什么?

    考虑到Unity如何处理循环,我知道这可能是有史以来最愚蠢的问题。但我发誓我以前写过这篇文章,并且成功了。。。我做错了什么?我得到循环是无限的,但它必须不断迭代。

    计时器。反恐精英

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Timer{
        float tickTime;
        float lastTicktime;
        bool timerRunning = false;
    
        public Timer (float tickTime) {
            this.tickTime = tickTime;
        }
    
        public void StartTimer() {
            timerRunning = true;
            lastTicktime = Time.time;
            GenerateTicks ();
    
        }
    
        public void StopTimer () {
            timerRunning = false;
        }
    
        void GenerateTicks () {
            while (timerRunning) {
                if ((Time.time - lastTicktime) > tickTime) {
                    Debug.Log ("Tick");
                    lastTicktime = Time.time;
                }
            }
        }
    }
    

    实施

    Timer timer;
        void Start () {
            timer = new Timer (triggerTime);
            timer.StartTimer ();
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Galandil    6 年前

    代码永远无法退出 while(timerRunning) 循环,因为你从不执行 timerRunning = false 在所述回路内。

    而且,即使你加上 timerRunning=错误 在您的 if ((Time.time - lastTicktime) > tickTime) { } 第节,您将挂起Unity主线程的执行,直到条件满足为止 true (基本上,直到至少 tickTime 几秒钟过去了)。

    如果需要使用计时器并让Unity执行,那么可以使用协同路由。

    编辑:要回答您的评论,请按如下方式修改代码:

    using UnityEngine;
    using System.Collections;
    
    public class Timer {
    
        float tickTime;
        float lastTicktime;
        bool timerRunning = false;
    
        public Timer(float tickTime) {
            this.tickTime = tickTime;
        }
    
        public IEnumerator StartTimer() {
            timerRunning = true;
            lastTicktime = Time.time;
            while (timerRunning) {
                if ((Time.time - lastTicktime) > tickTime) {
                    Debug.Log("Tick");
                    lastTicktime = Time.time;
                    timerRunning = false;
                }
                yield return null;
            }
        }
    }
    

    实施:

    private Timer timer;
    private IEnumerator timerCoroutine;
    
    private void Start() {      
        timer = new Timer(triggerTime);
        timerCoroutine = timer.StartTimer();
        StartCoroutine(timerCoroutine);
    }