C# 在不同时间事件上执行不同的代码
我必须在Unity3d场景中显示完整的24小时循环在不同的时间执行不同类型的任务。 假设C# 在不同时间事件上执行不同的代码,c#,unity3d,time,C#,Unity3d,Time,我必须在Unity3d场景中显示完整的24小时循环在不同的时间执行不同类型的任务。 假设 下午2点我得搬一辆车 下午6点,一架飞机将在机场降落 晚上7点07分,我必须打开市场大楼的门 等等,在不同的时间执行不同的任务/工作 现在,我有一些基本的动画,如汽车、飞机和门等。,。现在我不知道如何根据时间播放和停止我的动画。时间也可以是 使用GUI手动更改。如果当前是下午6点(动画工作),则用户可以切换到上午8点查看上午8点时间的动画。用户还可以快速计时,在一分钟或一小时内查看完整的小时数 我可以在
- 下午2点我得搬一辆车
- 下午6点,一架飞机将在机场降落
- 晚上7点07分,我必须打开市场大楼的门
- 等等,在不同的时间执行不同的任务/工作
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中,一个类做一件事。使用你的时间管理器是其他类的责任,而不是其他方式。我所看到的这种方法的唯一缺点是,它每小时只能使用一种方法。也许更好的方法是使用委托数组(锯齿数组)。每小时迭代一次方法集合。