2015-12-21 66 views
1

我必须在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 
} 

怎么办?如何处理这个?

回答

2

有很多方法可以做到这一点。如果陈述是最不专业的。我建议你在这种情况下使用UnityEvents。

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

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; 
    } 

} 

然后你就可以添加监听到任何触发的,他们将自动获得在适当的时候启动。

这只是我的头顶,很可能其他人会发布更好的解决方案。尽管如此,这段代码的一大优点是你编写了这个代码,你永远不必再次打开这个脚本。您可以添加预定的操作并将其从外部脚本中删除。

+0

你为什么这么说:'如果陈述是最不专业的'? – rhughes

+0

,因为我认为我可以在这个函数上弱引用[OOP Message Passing](https://en.wikipedia.org/wiki/Object-oriented_programming#Dynamic_dispatch.2Fmessage_passing) - “这是对象的责任,而不是外部代码,以'按需'选择程序代码以响应方法调用而运行/执行“。在你的情况下,时间管理器类是调用你的方法的“外部代码”。有非硬编码的方法调用来保持重命名的自由,添加和删除要调用的方法是很好的。另外,如果语句总是导致巨大的代码。 –

+1

我认为他的意思是在这种情况下,你最终得到24条陈述。他也可以提到会导致相同的开关。使用委托可以不超过5行。 – Everts

1

嗯,我认为这是代码设计问题。我建议使用某种观察者模式。您需要申请在主控制器每分钟IObersver对象,这将触发某些事件的所有用户,例如,像这样:

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

每个观察者都会使用它自己的日程安排检查时间。例如,交通灯的观察者会检查是否1分钟从最后一次切换过去了,如果是的话,那么光开关:

public TrafficLight : IObserver { 
    ... 

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

使用该代码的设计,因为你需要,甚至不知道你可以添加到您的控制器尽可能多的对象,这些对象是什么,他们的计划是什么。

+0

有帮助的事情你有份额!谢谢 –

相关问题