2017-02-21 54 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