递归方法调用冻结Unity

时间:2018-03-11 16:48:30

标签: c# unity3d

我试图使用递归来调用方法CreateFinalPath()但Unity第二次调用方法Test()时会冻结。

你知道问题是什么吗?

我几乎尝试了一切,不知道发生了什么。

public class SplinePlus : MonoBehaviour
{
    int h = 0;
    public void Test()
    {
        FinalPath.Vertices.Clear();
        FinalPath.Tangents.Clear();
        FinalPath.Normals.Clear();

        CreateFinalPath();
    }

    private void CreateFinalPath()
    {
        for (int i = 0; i < Branches[h].Vertices.Count; i++)// branch vertices
        {
            for (int n = 0; n < SharedNodes.Count; n++) // shared nodes loop
            {
                if (SharedNodes[n].Nodes.Point.position == Branches[h].Vertices[i]) // shared node detected , see next branch to take
                {
                    h = SharedNodes[n].BranchToFollow; // next branch ID to take

                    CreateFinalPath(); // trigger data storage for the new branch in Final path class
                    break;
                }
            }
            // data storage in finalpath class
            FinalPath.Vertices.Add(Branches[h].Vertices[i]);
            FinalPath.Normals.Add(Branches[h].Normals[i]);
            FinalPath.Tangents.Add(Branches[h].Tangents[i]);

        }
    }
}
public class FinalPath
{
    public List<Vector3> Vertices = new List<Vector3>();
    public List<Vector3> Tangents = new List<Vector3>();
    public List<Vector3> Normals = new List<Vector3>();
}
public class Branches
{
    public List<Vector3> Vertices = new List<Vector3>();
    public List<Vector3> Tangents = new List<Vector3>();
    public List<Vector3> Normals = new List<Vector3>();
    public List<PathPoint> PathPoints = new List<PathPoint>();

}

[System.Serializable]
public class SharedNodesData
{

    public PathPoint Nodes = new PathPoint();
    public List<string> ConnectedBranches = new List<string>();
    public int BranchToFollow = 0;
}

UPDATE2

Spline representation inside viewport

所以我要做的就是为一个基于复杂路径系统的gameObject跟随者创建一个最终路径,其中有一个主分支(红色)和子分支(黄色),可以无限制号。

共享节点是在它们之上有数字的点,我首先在主分支中循环寻找共享节点,一旦找到一个节点,我就可以得到下一个分支索引来定义用户在检查员中。我影响到了&#34; h&#34;并调用CreateFinalPath()为下一个分支做同样的事情,直到我得到最后的完整路径。

1 个答案:

答案 0 :(得分:0)

我对你的代码了解很多,但也许你需要这样的东西

public class Branches
{
    public List<Vector3> Vertices = new List<Vector3>();
    public List<Vector3> Tangents = new List<Vector3>();
    public List<Vector3> Normals = new List<Vector3>();
    public List<PathPoint> PathPoints = new List<PathPoint>();
    public bool visited = false;

}

private void CreateFinalPath()
{
    for (int i = 0; i < Branches[h].Vertices.Count; i++)// branch vertices
    {
        for (int n = 0; n < SharedNodes.Count; n++) // shared nodes loop
        {
            if (!Branches[h].visited && SharedNodes[n].Nodes.Point.position == Branches[h].Vertices[i]) // shared node detected , see next branch to take
            {
                Branches[h].visited = true;

                h = SharedNodes[n].BranchToFollow; // next branch ID to take

                CreateFinalPath(); // trigger data storage for the new branch in Final path class
                break;
            }
        }
        // data storage in finalpath class
        FinalPath.Vertices.Add(Branches[h].Vertices[i]);
        FinalPath.Normals.Add(Branches[h].Normals[i]);
        FinalPath.Tangents.Add(Branches[h].Tangents[i]);

    }
}