c# - 如何在 Unity C# 中为多个游戏对象移动进行多线程处理

标签 c# unity-game-engine genetic-programming

我现在有一个问题。我正在为炸弹人游戏创建基因编程人工智能。

我的问题与线程有关;我想同时执行我的基因组。

这是一个例子:

我有人口

Genome[] population = //5 genomes for example

每个基因组都有一个 Action 或 Action ,例如 向上向左向右向下炸弹

它产生随机移动:

基因组 1 右,炸弹,左,上,右......

基因组 2 左,左,右,左,炸弹......

等等...

这些移动或 Action 将一直有效,直到玩家还活着。我想使用线程将这些 Action 应用到我的玩家 (AI) 中。

我尝试过这个:

for(Genome g in population){
     Thread thread = new Thread(g.run);
     thread.Start();
}

在 run() 方法中,它会产生随机移动并将其应用于游戏对象(即 AI)。比如UP就上去。我使用协程来执行 Action ,因为这些 Action 有动画。

这个游戏是实时的,每帧都会触发 Action 。

是否可以让我的所有基因组在单独的线程中同时运行?可能在游戏对象的另一个实例中。我不希望我的人工智能被这些 Action 弄糊涂。

我有一个可能的解决方案,但我不知道如何实现它。

每个基因组都有相同的游戏、敌人、炸弹等信息。 但他们的 Action 有所不同,例如:

5台电脑,具有相同的游戏环境和相同的敌人。

然而,每台计算机由不同的AI(基因组)以不同的 Action 进行游戏,会得到不同的结果。在第一个基因组中,他在游戏早期 3 秒后死亡,另一个基因组在 5 秒后死亡。那么,对方还活着;类似的事情。我不知道这是否可能,但你能给我一些关于我的情况的建议吗?

提前谢谢您。

最佳答案

我已经成功地为循环内的每个基因组创建了一个线程并且它可以工作。

foreach(Genome g in population)
{
    GP_Agent gp_agent = new GP_Agent();

    //passing the callback method, when the process is done then invoke the callback
    ThreadStart thread = delegate{
         gp_agent.next_move(g, callback);
    };
    thread.Invoke();
}

public void callback(String move){
     //apply the result move from the genome
    Debug.Log(genome.id + " = " +move);
}

作为此代码的结果。我同时获得了所有基因组的移动

1 = 向上

2 = 向下

3 = 左

当我将这些 Action 应用到游戏对象时。人工智能很困惑,因为这些 Action 是同时应用的,这就是我想要的

关于c# - 如何在 Unity C# 中为多个游戏对象移动进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697078/

相关文章:

c# - 'Rigidbody2D' 游戏对象没有附加 "Player",但脚本正在尝试访问它。 (统一)

c# - 输出排序列表内容

java - 遗传算法适应度分数问题

c# - 向服务器发送 http 请求而不期望响应

c# - 将类型 Task<IEnumerable> 转换为类型 IEnumerable

unity-game-engine - 清理Unity目录中垃圾文件的批处理文件

python - 获取 RPN 树大小

c++ - 在 Visual Studio 2010 中编译 C++ 程序时出错

C# 将图像加载到 PictureBox 中而不减慢 UI

c# - WPF 相对绑定(bind)异常