Events 如何有效地检查触发事件的时间?

Events 如何有效地检查触发事件的时间?,events,unity3d,Events,Unity3d,这是一个更大的问题,关于计算机如何能够基于时间触发器触发任务 我正在使用运行游戏时钟的GameManager singleton实例构建一个统一的游戏。我希望事件在整个游戏中周期性地发生,但是通过一系列if语句运行时间变量来知道事件应该在何时发生,这似乎是低效和违反直觉的 我也一直在开发移动应用程序,我一直想知道闹钟是如何工作的(这与上面的上下文类似吗?)。设备/基础任务是否每天24小时运行,并通过检查等价的if语句来等待,以知道何时向报警事件发出警报?您所描述的基本上是计算机如何处理事件。包括

这是一个更大的问题,关于计算机如何能够基于时间触发器触发任务

我正在使用运行游戏时钟的GameManager singleton实例构建一个统一的游戏。我希望事件在整个游戏中周期性地发生,但是通过一系列if语句运行时间变量来知道事件应该在何时发生,这似乎是低效和违反直觉的


我也一直在开发移动应用程序,我一直想知道闹钟是如何工作的(这与上面的上下文类似吗?)。设备/基础任务是否每天24小时运行,并通过检查等价的if语句来等待,以知道何时向报警事件发出警报?

您所描述的基本上是计算机如何处理事件。包括操作系统本身在内的大多数事件驱动程序都使用所谓的池系统,系统将在其中抛出所有现有事件的大列表,并检查它们的触发条件是否满足。该触发条件可以是时间或其他触发器,例如从键盘或网卡等设备接收的输入

Unity引擎实际上也做到了这一点。在幕后,Unity将有一个主进程不断运行,检查所有内置MonoBehavior方法的触发条件是否满足,然后在满足条件的情况下触发这些方法。例如,FixedUpdate方法保证每秒调用这么多次,我相信它每秒调用30次,但我不太清楚。因此,固定更新的调用方法就是这样的

timer += Time.deltaTime();
while(timer >= (1.0f/30.0f))
{
    FixedUpdate();
    timer -= (1.0f/30.0f);
}  
此代码将在处理器允许的情况下经常运行,不断检查是否有足够的时间执行对FixeUpdate()的另一个调用,这段代码还执行回溯,因此如果处理器过载,并且这段代码在2秒钟内没有被调用,那么下次调用它时,它将在错过的2秒钟内执行足够的调用

现在对于你的unity应用程序,如果这是一个小类,比如说只有10个时间条件,那么我会使用if语句,就像你建议的那样,我会开始考虑采用一种更面向对象的方法,并且有一个带有两个方法的抽象类

abstract class ConditionEvent{
    bool ConditionMet();
    void Process();
} 

然后在您的Monobhavour调用中,我将有一个由这些类组成的列表,其中包含一个调用ConditionMet函数的循环。如果函数返回true,则调用进程。

Unity的
monobhavior
为此提供了
Invoke
invokererepeating
start例程
函数。有关更多信息,请参阅手册。如果我没有完全弄错的话,也有官方的教程(如果没有,ytube上有很多)。