【问题标题】:How to debug a recursive function in unity C#如何在 Unity C# 中调试递归函数
【发布时间】:2019-08-21 17:39:48
【问题描述】:

我正在尝试使用递归制作迷宫生成器。它不工作它应该如何工作,我试图找出错误在哪里。所以我当时想逐步完成递归1迭代。我该怎么做?

private void DevideRecursive(int pMinX, int pMaxX, int pMinY, int pMaxY)
{
    int randomX = Random.Range(pMinX +1, pMaxX);
    int randomY = Random.Range(pMinY +1, pMaxY);
    int randomWall = Random.Range(0, 4);

    List<GameObject> WalllistX1 = new List<GameObject>();
    List<GameObject> WalllistX2 = new List<GameObject>();
    List<GameObject> WalllistY1 = new List<GameObject>();
    List<GameObject> WalllistY2 = new List<GameObject>();
    List<List<GameObject>> MainWallList = new List<List<GameObject>>();

    MainWallList.Add(WalllistX1);
    MainWallList.Add(WalllistX2);
    MainWallList.Add(WalllistY1);
    MainWallList.Add(WalllistY2);

    //// add a wall on a random x coordinate
    for (int x = pMinX; x < pMaxX; x++)
    {
        GameObject wall = Instantiate(WallHor);
        wall.transform.position = new Vector2(tilesize * x + tilesize / 2, tilesize * randomY);
        if (x < randomX)
        {
            WalllistX1.Add(wall);
        }
        else
        {
            WalllistX2.Add(wall);
        }
    }
    //// add a wall on a random y coordinate
    for (int y = pMinY; y < pMaxY ; y++)
    {
        GameObject wall = Instantiate(WallVer);
        wall.transform.position = new Vector2(tilesize * randomX, tilesize * y + tilesize / 2);
        if (y < randomY)
        {
            WalllistY1.Add(wall);
        }
        else
        {
            WalllistY2.Add(wall);
        }
    }

    //make a hole in 3 out of tht 4 walls randomly
    for (int i = 0; i < MainWallList.Count; i++)
    {
        if (randomWall != i)
        {
            RemoveWall(MainWallList[i]);
        }
    }

    ////
    ////
    //// If either of the walls have a cell with only 1 grid stop the recursion


    Debug.Log("randomX - pMinX:" + (randomX - pMinX));
    Debug.Log("pMaxY - randomY:" + (pMaxY - randomY));
    Debug.Log("pMaxX - randomX:" + (pMaxX - randomX));
    Debug.Log("randomY - pMinY:" + (randomY - pMinY));

    if (!(randomX - pMinX <= 1) || !(pMaxY - randomY <= 1))
    {
        Debug.Log("a");
        DevideRecursive(pMinX, randomX, randomY, pMaxY);
    }
    else
    {
        return;
    }

    if (!(pMaxX - randomX <= 1) || !(pMaxY - randomY <= 1))
    {
        Debug.Log("b");
        DevideRecursive(randomX, pMaxX, randomY, pMaxY);
    }
    else
    {
        return;
    }

    if (!(randomX - pMinX <= 1 )|| !(randomY - pMinY <= 1))
    {
        Debug.Log("c");
        DevideRecursive(pMinX, randomX, pMinY, randomY);
    }
    else
    {
        return;
    }

    if (!(pMaxX - randomX <= 1) || !(randomY - pMinY <= 1))
    {
        Debug.Log("d");
        DevideRecursive(randomX, pMaxX, pMinY, randomY);
    }
    else
    {
        return;
    }
}

这是我的递归方法。它在 Start 函数中被调用。 该方法创建 2 个随机墙(1 个垂直,1 个水平)。它将房间分为 4 个较小的房间。然后它对这些房间做同样的事情。

任何帮助都是appriciated

【问题讨论】:

  • 添加调试语句.. 或在 Visual Studio 中单步执行。
  • 你能解释一下吗?我尝试过使用断点,但这不起作用
  • 您是否将 Visual Studio 附加到了 unity?
  • 是的,我有。理想情况下,我想要它,这样当我按下一个按钮时,它就会进入下一次迭代
  • 好吧,不解释当你尝试时会发生什么,就像在黑暗中拍摄,戴着眼罩和耳塞

标签: c# debugging unity3d recursion


【解决方案1】:

您可以修改函数以使用async

using System.Threading.Tasks;
void Start () {
    DevideRecursive( ..params.. );
}
private async void DevideRecursive(int pMinX, int pMaxX, int pMinY, int pMaxY) {
    // code
    while (!Input.GetKeyDown(KeyCode.Space))
        await Task.Yield ();
    // code
    DevideRecursive( .. params .. );
    return
}

Unity here 中有关 aysnc 的更多信息。 也可以使用 IEnumerator,它使您可以选择从外部控制函数。

【讨论】:

  • 我在这句话中得到一个错误:“await 运算符只能用于 aysnc 方法”。这是有道理的。你确定可以这样使用吗? void Start () { await DevideRecursive(0, Rows, 0, Columns); } 作为我的方法
  • 试试async void Start () {
  • 给出“不能等待”无效“”。我以前从未真正使用过等待。但如果这行得通。例如,我应该如何通过按键进行下一次迭代?
  • 对不起,你没有把await 用来启动异步方法,只是等待它。我还更改了代码以在按键上进行迭代
  • 因将async/await 纳入其中而被否决。你到底为什么要把async/await带进这个……?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2014-04-28
  • 1970-01-01
  • 2020-05-25
  • 2010-10-28
相关资源
最近更新 更多