【问题标题】:How to use multithread in Unity3D for AI如何在 Unity3D 中为 AI 使用多线程
【发布时间】:2015-11-15 01:43:52
【问题描述】:

我正在制作一个带有 AI 的 Unity3D 国际象棋游戏。

我的游戏画面在 AI 正在寻找一个好的动作时卡住了。

一般来说,AI 思考大约需要 5~30 秒。

我知道那是因为我的 CPU 资源专门用于计算 AI。

但是我打开任务管理器,发现我的游戏只占用了50%的CPU,可能是因为我的电脑是intel core 2,有2个线程。

所以我的想法是:

Unity(或 C#)是否可以在一个线程中进行 AI 计算,并在另一个线程中保存游戏玩法?

所以玩家在 AI 计算时不会看到卡住的屏幕。

听说过Delegate或Event,但还是不知道多线程之间的关系。

【问题讨论】:

  • 您的用例非常适合多线程(棘手的一点是 Unity 对象无法在线程之间轻松共享,但您可以使用自定义 C# 对象传递您的 AI 查询和结果).. 只需 google C#多线程,你应该能找到比“Delegate or Event”更多的东西。在这里提出任何具体的问题。
  • 感谢您的回复,@Paul-Jan。那么这是否意味着我不能在我的 AI 中使用任何 Unity API,因为它们在不同的线程中?所以我不能使用 GetComponent 之类的方法,也不能读取类从 MonoBehaviour 继承的任何变量,对吗?
  • 没错,直接将这些值传递给AI线程(如果有很多,写一个特定的对象来包含它们,或者使用字典),当线程完成时,回读处理的主统一线程中的值并将它们分配给适当的游戏对象属性(或生成对象,或任何 AI 处理的结果)。
  • 我知道了,但现在的问题是 AI 需要做“假动作”(或称为尝试/搜索),而假动作方法写在主要游戏代码中,并且确定它调用统一 api,它不是一个简单的国际象棋游戏,所以“移动”包含大量情况和各种数据。我不能自己复制它,而只是拉出所有统一 API 用法。以后也很难维护。我会继续考虑的。谢谢你的帮助!保罗。

标签: c# multithreading unity3d delegates artificial-intelligence


【解决方案1】:

您应该使用不引用 Unity API 的类(您编写的)创建一个表示游戏状态的模型。这些类应该只代表你的棋子,以及它们在棋盘上的位置。然后,您可以将此模型传递给在单独线程中运行的 AI 代码,在那里它可以评估并修改它以表示新的游戏状态。然后,您编写一些控制器代码,将模型映射到对 GameObjects 的调用(Unity 案例中的视图)。

通过以这种方式将模型从视图中分离出来,您可以获得各种优势,请参阅:MVC

您可以使用 .Net 线程 API 创建线程来执行 AI 处理,并且您可能希望使用 Latch 来控制游戏代码和 AI 线程之间的同步。见:NET Framework System.Threading

【讨论】:

  • 我明白了……我认为现在对我来说最大的问题是如何拆分AI所需的数据和游戏代码。游戏代码不是我写的。事实上,棋盘数据保存在 GameObject 数组中,AI 用来“尝试”移动的函数也不是我写的(如 DoMove 或 DoSkill)。除了 View 之外,我几乎不可能编写出完全相同的结果的全新代码。无论如何,非常感谢您的回答,谢谢!
【解决方案2】:

Unity 的 API 不是线程安全的,您必须在主线程中执行它们。好吧,您可以在 Asset Store 上试用这个包,这将帮助您更轻松地使用线程。 http://u3d.as/wQg 只需一行代码即可启动线程并安全执行Unity API。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2020-12-28
    • 2021-08-04
    相关资源
    最近更新 更多