检查navmesh路径是否被阻止需要太长时间

时间:2017-01-02 11:28:17

标签: c# unity3d

我正在制作一款简单的塔式防御游戏。我已经写了一个函数来检查放置一个塔是否会阻止敌人达到他们的目标:

public bool CheckPathNotBlocked(Vector3 pos)
{
    navmesh_obstacle_tester.gameObject.SetActive(true);
    navmesh_obstacle_tester.position = pos;
    NavMeshPath path = new NavMeshPath();
    botsInPlay[botsInPlay.Count - 1].CalculatePath(enemyBase.position, path);
    navmesh_obstacle_tester.gameObject.SetActive(false);
    return path.status == NavMeshPathStatus.PathComplete;
}

navmesh_obstacle_tester是一个空的GameObject,附有一个NavMeshObstacle。 botsInPlay是一个敌人NavMeshAgent的列表,所以我使用最近产生的敌人来检查路径。这实际上有效,但不及时阻止我的塔被放置:

public void PlaceTower(Vector3 pos, int tType)
{
    if (!F_BotsManager.bots.CheckPathNotBlocked(pos)) return;

    // rest of my code to place a tower
}

如果路径被完全阻挡但是在放置将阻挡路径的塔之前没有退出,则该功能退出,例如一旦我在所有敌人周围形成了一圈塔楼,就不再能够放置塔楼了,但是完成环形的最后一座塔就被放置了。

我已阅读in the docs路径计算可能需要几帧,这可能是问题的原因吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您没有显示调用PlaceTower函数的方式和位置。这对于弄清楚如何提供帮助非常重要。

  

我该如何解决这个问题?

任何需要很长时间才能完成的事情,你必须在Unity中等待它,应该使用coroutine或Thread来完成,具体取决于事情。在这种情况下,应该使用协程等待它,以便代码中的其他内容可以继续运行。

public IEnumerator PlaceTower(Vector3 pos, int tType)
{
    while (!F_BotsManager.bots.CheckPathNotBlocked(pos))
    {
        Debug.Log("waiting!");
        yield return null;
    }

    // rest of my code to place a tower
}

现在,您调用此函数的任何地方现在应该替换为StartCoroutine(PlaceTower(yourPost,yourIntType));。您必须重构整个代码以适应协程的使用。