在不同的时间事件上执行不同的代码

本文关键字:执行 代码 时间 事件 | 更新日期: 2023-09-27 18:27:29

我必须在Unity3d场景中显示完整的24小时循环在不同的时间执行不同类型的任务

假设

  • 下午2点我得挪一辆车
  • 下午6点一架飞机将降落在机场
  • 晚上07:07我必须打开市场大楼的门
  • 等等在不同的时刻执行不同的任务/工作

现在,我有一些基本的动画,例如汽车、飞机和门等。现在我很困惑如何根据时间播放和停止我的动画。时间也可以使用GUI手动更改。如果当前是下午6点(动画工作),则用户可以切换到上午8点查看上午8点的动画。用户还可以加快时间,在一分钟或一小时内查看完整的小时数。

我可以在更新事件中使用if/else,但我想这不是正确的方法,如果我需要展示大量作品,这将非常困难在不同的持续时间内(这意味着大量的if/else语句)。就像下面的一样

void Update(){
if(time =1){
//logic 
}
if(time =2){
//logic 
}
if(time =3){
//logic 
}
...//so on, tedious way 
...//and also not possible if time require between the hours, suppose 06:06pm
}

该怎么办?如何处理?

在不同的时间事件上执行不同的代码

有很多方法可以做到这一点。if语句是最不专业的。在这种情况下,我建议您使用UnityEvents。

比方说我需要在x:00触发一些东西。我会创建一个UnityEvents数组,大小为24,每小时触发1次。像这样:

public UnityEvent[] hourTrigger;    //24 hours
public float oneHour = 120f;        //one hour in game is 120 seconds real time
private int hourCounter = 0;
void Start(){
    hourTrigger = new UnityEvent[24];
    StartCoroutine (HourlyTrigger ());
}
IEnumerator HourlyTrigger(){
    //repeat this every oneHour interval
    while(true){
        hourTrigger[hourCounter].Invoke();
        yield return new WaitForSeconds(oneHour);
        hourCounter = ++hourCounter % 24;
    }
}

然后,您可以将侦听器添加到任何触发器中,它们将在适当的时间自动启动。

这只是我的想法,很可能其他人会发布更好的解决方案。尽管如此,此代码的一大优点是,您可以编写此代码,并且以后再也不必打开此脚本了。您可以添加计划的操作,也可以从外部脚本中删除这些操作。

嗯,我认为这是代码设计问题。我建议使用某种Observer模式。您需要在主控制器中订阅IObersver对象,这将在某些事件上触发所有订阅者,例如每分钟,如下所示:

foreach(IObserver observer in observers) {
   observer.Notify();
}

每个观察者将使用自己的时间表检查时间。例如,红绿灯观察员将检查距离最后一个开关是否已经过了1分钟,如果是,则切换灯:

public TrafficLight : IObserver {
   ...
  public void Notify() {
     if(timePassed > sachedulledTime) {
        SwithcLight();
     }
  }

使用此代码设计,您可以根据需要向控制器中添加任意多的对象,甚至不知道这些对象是什么以及它们的时间表是什么。