为了练习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);
}
}