2015-12-21 55 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

有幫助的事情你有份額!謝謝 –

相關問題