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
C# 在不同时间事件上执行不同的代码_C#_Unity3d_Time - Fatal编程技术网

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

C# 在不同时间事件上执行不同的代码,c#,unity3d,time,C#,Unity3d,Time,我必须在Unity3d场景中显示完整的24小时循环在不同的时间执行不同类型的任务。 假设 下午2点我得搬一辆车 下午6点,一架飞机将在机场降落 晚上7点07分,我必须打开市场大楼的门 等等,在不同的时间执行不同的任务/工作 现在,我有一些基本的动画,如汽车、飞机和门等。,。现在我不知道如何根据时间播放和停止我的动画。时间也可以是 使用GUI手动更改。如果当前是下午6点(动画工作),则用户可以切换到上午8点查看上午8点时间的动画。用户还可以快速计时,在一分钟或一小时内查看完整的小时数 我可以在

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

假设

  • 下午2点我得搬一辆车
  • 下午6点,一架飞机将在机场降落
  • 晚上7点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
}

怎么办?如何处理这个问题?

有很多方法。如果陈述是最不专业的。我建议您在这种情况下使用UnityEvents

假设我需要在x:00的时候触发东西。我将创建一个大小为24的UnityEvents数组,每小时触发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;
    }

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


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

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

foreach(IObserver observer in observers) {
   observer.Notify();
}
每个观察者将使用自己的时间表检查时间。例如,交通灯观察员将检查距离最后一个开关是否超过1分钟,如果是,则开关灯:

public TrafficLight : IObserver {
   ...

  public void Notify() {
     if(timePassed > sachedulledTime) {
        SwithcLight();
     }
  }

使用这种代码设计,您可以根据需要向控制器中添加任意多的对象,而不必知道这些对象是什么以及它们的日程安排。

为什么您会说:
如果语句是最不专业的
?因为,嗯,我想我可以在这一点上进行弱引用-“对象而不是外部代码的责任是‘按需’选择要运行/执行的过程代码以响应方法调用”。在您的情况下,时间管理器类是“外部代码”“它调用您的方法。最好使用非硬编码的方法调用来保持重命名、添加和删除要调用的方法的自由。另外,if语句总是会产生大量的代码。我想他的意思是,在这种情况下,你会得到24个if语句。他还可以提到开关,这将导致同样的结果。使用委托可以在不超过5行的时间内完成。因此,基本上我要说的是,管理所有事情不是你的时间管理器脚本的责任-这是一个巨大的混乱,完全违反OOP。在OOP中,一个类做一件事。使用你的时间管理器是其他类的责任,而不是其他方式。我所看到的这种方法的唯一缺点是,它每小时只能使用一种方法。也许更好的方法是使用委托数组(锯齿数组)。每小时迭代一次方法集合。