我在正确的轨道上吗 - Unity C# Events at a certain time

Posted

技术标签:

【中文标题】我在正确的轨道上吗 - Unity C# Events at a certain time【英文标题】:Am I on the right track- Unity C# Events at a certain time 【发布时间】:2021-11-27 06:27:34 【问题描述】:

让我知道我是否在正确的轨道上 - 我想在游戏中的某个时间触发某些事件。例如,假设每天早上 10 点,我将发生事件 a、b 和 c。 我当前的代码是这样的:

public static Action<int> morningEvents = delegate  ;

所以我声明了一个动作,然后是一些检查时间和触发动作的方法;例如

void CheckTime()

  check if current time is 10AM then call morningEvents()

我会将事件 a b c 注册到动作中

morningEvents += event a;
morningEvents +=event b;
morningEvents +=event c;

是否可以通过上述逻辑实现我的目标?另外我不知道我需要在 Action 中传递哪些参数。我知道默认值是 int 但不知道为什么。

【问题讨论】:

【参考方案1】:

您可以在下面的代码中使用事件,但这肯定不是最好的示例。在这样的“简单示例”中,我不会创建事件 - 只是因为它是如此简单。

public class MySampleClass : MonoBehaviour

    public delegate void CertainTimeReachedHandler();
    public event CertainTimeReachedHandler tenAmTimeReached;
    private bool wasReachedToday = false;

    void Start()
    
        tenAmTimeReached += ShowClock();
        tenAmTimeReached += b();
        tenAmTimeReached += c();
    

    void Update()
    
        var now = DateTime.Now;
        var tenAm = DateTime.Today.AddHours(10);

        if( (!wasReachedToday) && (now > tenAm) && (now < tenAm.AddSeconds(1)) )
        
            wasReachedToday = true;
            tenAmTimeReached?.Invoke();
        
    

    private void ShowClock()  
    private void b()  
    private void c()  

如果我想为“生产级别”创建它,我会创建:

表示条件和时间之间关系的类 - 应该何时触发(DT from、DT to、每天可以触发多少次等)~TaskDTCondition 存储所有条件的类 + 为它们存储事件 + 在条件有效性(DT 范围)时调用这些事件 ~ TaskScheduler 在我想要进行此类检查的课程中,我会致电 TaskScheduler,请求在特定日期发生事件并注册我的私有方法以在该事件上调用。

对于上述情况,可能已经存在一些库,请尝试四处看看。甚至可能在 Unity 框架中(我不知道)。无论如何,这真的很广泛,如果您想了解更多详细信息,您可能希望放在不同的 SE 网站上。

【讨论】:

非常感谢您的帮助!你能解释一下为什么我必须比较现在和上午 10 点之间的时间吗?而不是仅仅在 Time.Hour ==10 或类似的时间触发事件 DateTime.Now 表示 PC 中设置的当前时间。我在两者之间使用它,因为您永远无法确定您在精确的毫秒内达到了这个 - 游戏将加载或出现一些问题,并且 CPU 时间将花费在物理上。但您也希望在上午 10 点运行,而不是在 10:15、10:25 左右运行。这就是为什么我将窗口限制为 1 秒 - 在 10:00:0010:00:01 之间,它可以被激活。 除此之外,你当然可以只做DateTime.Now.Hours == 10 :) 但即使在10:59:59 也可以调用它。 哦,这完全有道理!一直想知道,因为我看到人们经常这样做。非常感谢!

以上是关于我在正确的轨道上吗 - Unity C# Events at a certain time的主要内容,如果未能解决你的问题,请参考以下文章

Unity能发布到Windows上吗?具体怎么发布呢?

椭圆面片之间的仿射变换

枚举器、迭代器、IEnumerable - 有点困惑

如何快速创建由类实例填充的数组?

通过 C# 在 Unity 中从 API URL 解析 JSON

保持轨道椭圆的距离