Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 无限循环崩溃,但不在更新函数中_Loops_Unity3d_Time_While Loop_Timer - Fatal编程技术网

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

Loops 无限循环崩溃,但不在更新函数中,loops,unity3d,time,while-loop,timer,Loops,Unity3d,Time,While Loop,Timer,这些脚本导致统一被挂起。我错过了什么 考虑到Unity如何处理循环,我知道这可能是有史以来最愚蠢的问题。但我发誓我以前写过这本书,而且它已经成功了。。。我做错了什么?我知道循环是无限的,但它必须不断地迭代 Timer.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class Timer{ float tickTime; float lastTick

这些脚本导致统一被挂起。我错过了什么

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

Timer.cs

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

当(timerRunning)循环时,代码永远不能退出
,因为您从未在所述循环内执行
timerRunning=false

此外,即使在
if((Time.Time-lastTicktime)>tickTime){}
部分中添加
timerRunning=false
,也会挂起Unity主线程的执行,直到该条件为
true
(基本上,Unity会停止,直到至少
tickTime
秒过去)

如果您需要使用计时器并让Unity执行,那么请使用协程

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

使用UnityEngine;
使用系统集合;
公共类计时器{
浮动时间;
浮动时间;
bool timerRunning=false;
公共计时器(浮动计时){
this.tickTime=tickTime;
}
公共IEnumerator StartTimer(){
timerRunning=true;
lastTicktime=Time.Time;
while(计时){
如果((Time.Time-lastTicktime)>tickTime){
Debug.Log(“勾选”);
lastTicktime=Time.Time;
timerRunning=false;
}
收益返回空;
}
}
}
实施:

专用定时器;
私有IEnumerator timerCoroutine;
私有void Start(){
定时器=新定时器(触发时间);
timerCoroutine=timer.StartTimer();
启动例行程序(时间例行程序);
}

当(timerRunning)
循环时,代码永远不能退出
,因为您从未在所述循环内执行
timerRunning=false

此外,即使在
if((Time.Time-lastTicktime)>tickTime){}
部分中添加
timerRunning=false
,也会挂起Unity主线程的执行,直到该条件为
true
(基本上,Unity会停止,直到至少
tickTime
秒过去)

如果您需要使用计时器并让Unity执行,那么请使用协程

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

使用UnityEngine;
使用系统集合;
公共类计时器{
浮动时间;
浮动时间;
bool timerRunning=false;
公共计时器(浮动计时){
this.tickTime=tickTime;
}
公共IEnumerator StartTimer(){
timerRunning=true;
lastTicktime=Time.Time;
while(计时){
如果((Time.Time-lastTicktime)>tickTime){
Debug.Log(“勾选”);
lastTicktime=Time.Time;
timerRunning=false;
}
收益返回空;
}
}
}
实施:

专用定时器;
私有IEnumerator timerCoroutine;
私有void Start(){
定时器=新定时器(触发时间);
timerCoroutine=timer.StartTimer();
启动例行程序(时间例行程序);
}

不完全确定你在问什么-但看起来你从来没有调用过
StopTimer()
将timerRunning设置为false,因此它会在
循环中卡住。你的
timerRunning
总是
true
它是否特别需要是一个循环?为什么你不能在
Update()
中只运行一次呢?不完全确定你在问什么-但看起来你从来没有调用
StopTimer()
将timerRunning设置为false,这样它就卡在
循环中了你的
timerRunning
总是
true
它是否特别需要是一个循环?为什么不能在
Update()
中运行一次呢?非常感谢,但是如果timer类不是从MonoBehavior扩展而来,我该如何启动协同程序呢?我可以创建ienumerators,但是找不到StartCustomer。我可以从实现类调用它吗?我试过了,但没有成功。这是帮助Ruli编辑我的答案,向您展示如何使用来自另一个非单行为类的协同程序。基本上,要以协同程序的形式启动一个方法,只需要它返回一个
IEnumerator
,就可以了。非常感谢,但是如果timer类没有从MonoBehavior扩展,我该如何启动协同程序呢?我可以创建ienumerators,但是找不到StartCustomer。我可以从实现类调用它吗?我试过了,但没有成功。这是帮助Ruli编辑我的答案,向您展示如何使用来自另一个非单行为类的协同程序。基本上,要以协同程序的形式启动一个方法,只需要它返回一个
IEnumerator
,就可以了。