有效处理数百个AI

时间:2018-09-23 18:55:02

标签: c# unity3d artificial-intelligence

为了练习AI,我决定制作一个像Cuboid Sandbox这样的AI模拟游戏。像Cuboid Sandbox一样,它将有3个AI团队(但是我的却是红色,绿色和蓝色,而不是红色,黄色和蓝色)。

在长方体沙箱中,总共有750个,并且我的没有限制(尚未)。通过测试,我发现Cuboid Sandbox不管当前有多少AI都不会出现帧率下降的情况(使用bandicam的帧率计数器,因为游戏中没有,所以它可能有点不准确,尽管它从不显得不稳定/ laggy)。

在我的系统中,我开始以总计约100 AI的速度下降到40fps。

我已将其跟踪到更新AI的食物清单的地方

食物由每个团队分开(如果一个团队没有食物,它就到最近),并且对于每个AI,我将一个名为“ availableFoodSources”的列表设置为一个在生成器功能中设置的名为“ redFood”的列表。它会在启动时产生食物,并且仅在食物来源被破坏或产生新食物时才更新。

大量的AI会导致很大的滞后。

还有另一个类似的循环(由于大量滞后而被删除),我通过所有其他AI部落逐个循环检查敌人部落的距离是否小于20,并检查每个部落的距离。

我不确定如何解决这两个问题。

我还统一使用StateMachineBehaviour,这消除了我(轻松)使用协程的能力。

以下是我更新availableFoodSources的代码:

if (aIController.team == Color.red)
{
    availableFoodSources = spawner.redFood;
}
if (aIController.team == Color.green)
{
    availableFoodSources = spawner.greenFood;
}
if (aIController.team == Color.blue)
{
    availableFoodSources = spawner.blueFood;
}
if (!Attacking)
{
    if (animator.transform.GetComponent<AIController>().hunger > 30)
    {

        GameObject f = FindClosestFoodSource(animator.transform);
        Vector3 closestFoodPos = f.transform.position;

        Debug.DrawLine(animator.transform.position, closestFoodPos);
        closestFoodPos.y = animator.transform.position.y;
        animator.GetComponent<NavMeshAgent>().SetDestination(closestFoodPos);
    }
    else
    {
        animator.SetBool("Walking", false);
    }
}

0 个答案:

没有答案