2017-02-21 15 views
-1

我做了線程和caroutines一些研究,我不知道如何「咬人」的規劃問題,我有:C#,團結 - caroutines,線程,邏輯,PROGRAMM結構

我需要運行simultainously字符AI在一個簡單的遊戲中 - 我需要能夠凍結/暫停執行一段指定的時間以及拖放/取消暫停。 我還需要運行一個foreach函數,它將從列表中提取字符併爲它們中的每個創建一個正在運行的AI,以及能夠根據需要創建新的AI(通過傳遞構造函數)。

也許這是一個簡單的事情,但我沒有經驗,請幫助。

+0

你到底有什麼問題?向我們展示一些代碼。你的Awnser沒有做任何事情。另外Unity3D是基於「基於組件的」體系結構,因此製作一個可以同時移動多個GameObjects的腳本不應該成爲這種挑戰。 – Smartis

回答

2

在Unity中,您不必過多考慮線程等,以創建一個同步行爲。例如;你用一個腳本創建一個GameObject,Enemy,以跟隨另一個GameObject;球員,其中有一個腳本,從你的運動。場景中的每個對象都會同時運行,而不需要線程等。例如,可以有5個GameObjects「Enemy」與EnemyFollowPlayer.cs相同的腳本,它將同時運行5個不同的EnemyFollowPlayer。協程是如果你想在一個單獨的腳本中使用線程行爲,並且可能非常有用,但對於最基本的東西並不需要。

I made a quick GIF to illustrate how Unity handles simuntaneous execution如果從我的描述中不清楚。因爲你似乎對基於統一組件的架構有錯誤的想法。

在此GIF中,您會看到Test.cs,它會導致它附加的GameObject每移動一次void Update()就會移動x + 0.001,Unity會爲我們每幀運行一次。我們看到它如何在1個GameObject上工作,並且當我們複製該GameObject時,我們看到它在2個GameObjects上同時運行,而不需要Coroutines,Threads或類似的東西。

協程很適合運行代碼異步! Unity也帶有一些便利的功能。檢查這個例子:

void SomeNormalMethod() { 
    StartCoroutine(AsyncMethod()); 
    Debug.Log("I will Log first"); 
} 

IEnumerator AsyncMethod() { 
    yield return new WaitForSeconds(3f); 
    Debug.Log("Then after 3 seconds, I will Log!"); 
} 

協同程序的類型必須爲IEnumerator的,這讓我們獲得了yield功能的方法。有了這個,我們可以使用Unity的功能WaitForSeconds(除其他外)讓這個異步代碼在做某事之前等待幾秒鐘,而不中斷SomeNormalMethod()繼續運行!不要忘記用StartCoroutine()初始化它們,否則什麼都不會發生!

+0

謝謝 - 我正在考慮通過代碼初始化運行代碼,對GameObjects沒有多少經驗,並且如果需要它們已經腳本化,可以同時運行。我將嘗試通過圍繞與GameObjects交互的代碼結構進行基礎。 – Bronsoner

+0

好吧!運行由代碼初始化的代碼是Coroutines的一個很好的用法,我用一個例子更新了我的答案,以及它是如何工作的! – Maakep

+0

感謝您在理解這方面的巨大幫助。我會給你更多的積分,如果我可以:) – Bronsoner