【问题标题】:Am I on the right track- Unity C# Events at a certain time我在正确的轨道上吗 - 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 但不知道为什么。

【问题讨论】:

    标签: c# visual-studio unity3d game-engine


    【解决方案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 也可以调用它。
    • 哦,这完全有道理!一直想知道,因为我看到人们经常这样做。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多