如何在Unity C中为多个游戏对象制作多线程#

时间:2018-04-06 16:18:19

标签: c# unity3d genetic-programming

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

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

以下是一个例子:

我有人口

Genome[] population = //5 genomes for example

每个基因组都有一个动作或动作 UP LEFT RIGHT DOWN BOMB

它产生随机移动:

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

基因组2   左,左,右,左,BOM ......

等...

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

我试过了:

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

在run()方法中,它产生随机移动并将其应用于作为AI的游戏对象。例如,UP然后上升。我用coroutine来做动作,因为那些动作都有动画。

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

是否有可能使我的所有基因组在单独的线程中同时运行?可能在另一个游戏对象的实例中。我不希望我的AI因这些动作而感到困惑。

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

每个基因组都有关于游戏,敌人,炸弹等的相同信息。 但他们的举动是不同的,例如:

具有相同游戏环境和相同敌人的5台计算机。

但是,每台计算机由不同的AI(基因组)播放,不同的动作会得到不同的结果。在第一个基因组中,他在3秒后在早期游戏中死亡,另一个基因组在5秒后死亡。然后,另一个还活着;类似的东西。我不知道是否有可能,但你可以就我的情况给我一些建议吗?

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

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

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 = UP

2 = DOWN

3 = LEFT

当我将这些动作应用于游戏对象时。 AI很困惑,因为这些动作同时适用,这就是我想要的