【问题标题】:c#, unity - caroutines, threads, logic, programm structure [closed]c#,unity - 协程、线程、逻辑、程序结构
【发布时间】:2017-02-21 07:57:29
【问题描述】:

我对线程和 caroutines 做了一些研究,但我不知道如何“解决”我遇到的编程问题:

我需要在一个简单的游戏中同时运行角色 AI - 我需要能够在指定的时间内冻结/暂停它们的执行以及取消/取消暂停。 我还需要运行一个 foreach 函数,该函数将从列表中获取字符并为每个字符创建一个正在运行的 AI,并且能够按需创建新的 AI(通过传递构造函数)。

也许这是一件简单的事情,但我没有经验,请帮助。

【问题讨论】:

  • 你到底有什么问题?向我们展示一些代码。您的 Awnser 没有表现出做任何事情的努力。 Unity3D 也是Component-Based Architecture,因此制作一个同时移动多个 GameObjects 的脚本不应该是那个挑战。

标签: c# multithreading unity3d logic


【解决方案1】:

在 Unity 中,您无需过多考虑线程等即可创建同时行为。例如;您创建一个游戏对象 Enemy,并使用脚本跟随另一个游戏对象; Player,它有一个脚本,可以接收你的动作。场景中带有脚本的每个对象都将同时运行,不需要线程等。例如,可以有 5 个 GameObjects "Enemy" 使用相同的脚本 EnemyFollowPlayer.cs,它将同时作为 5 个不同的 EnemyFollowPlayer 运行。如果您希望在 ONE 单个脚本中实现线程化行为,协程是非常有用的,但对于最基本的事情并不需要。

I made a quick GIF to illustrate how Unity handles simuntaneous execution 如果我的描述不清楚。由于您似乎对基于统一组件的架构有错误的想法。

在这个 GIF 中,您会看到 Test.cs,它会导致它所连接的游戏对象在每次运行 void Update() 时移动 x + 0.001,Unity 每一帧都会为我们运行。我们看到它是如何在 1 个 GameObject 上工作的,当我们复制该 GameObject 时,我们会看到它同时在 2 个 GameObject 上运行,而不需要任何协程、线程或类似的东西。

协程非常适合异步运行代码! 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()初始化它们,否则什么都不会发生!

【讨论】:

  • 谢谢 - 我在考虑运行由代码初始化的代码,对 GameObjects 没有太多经验,并且它们已经编写了脚本,可以在需要时同时运行。我将尝试基于与 GameObjects 交互的代码结构。
  • 好的!运行由代码初始化的代码是协程的一个很好的用法,我用一个例子更新了我的答案以及它是如何工作的!
  • 感谢您对理解这一点的巨大帮助。如果可以的话,我会给你更多的分数:)
  • 很高兴能帮到你! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2018-03-25
相关资源
最近更新 更多