在不同的时间事件上执行不同的代码
本文关键字:执行 代码 时间 事件 | 更新日期: 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();
}
}
使用此代码设计,您可以根据需要向控制器中添加任意多的对象,甚至不知道这些对象是什么以及它们的时间表是什么。