2017-06-16 1 views
2

J'ai suivi un tutoriel sur la création d'un labyrinthe procédural généré dans l'unité en utilisant C# qui, lorsque vous cliquez sur le bouton de la souris, génère un nouveau labyrinthe.Labyrinthe procédural enlève les anciens collisionneurs

Cependant, lorsque je génère un nouveau labyrinthe, tout semble correct mais le MeshCollider pour l'ancien maillage maillé est toujours en place, en plus du nouveau labyrinthe MeshCollider rendant de nombreux murs invisibles.

Comment pourrais-je effacer les anciens MeshCollider s dans mon script, afin qu'ils soient retirés et que le maillage nouvellement généré reste?

image labyrinthe initial

Initial maze image

images labyrinthe Second

Second maze image

Chaque labyrinthe, après la première, a les anciens MeshCollider s représentés par le contour vert et il semble que c'est juste de faire MeshCollider nouveaux et non re plaçant l'ancien avec un nouveau. Je pensais que je pouvais résoudre ce problème en définissant le maillage et MeshCollider à null, puis nouveau maillage au début de chaque nouvelle génération de labyrinthe, mais il ne fait rien:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Mesh_Generator : MonoBehaviour { 

public SquareGrid squareGrid; 
public MeshFilter walls; 
public MeshFilter cave; 

public bool is2D; 

List<Vector3> vertices; 
List<int> triangles; 

Dictionary<int,List<Triangle>> triangleDictionary = new Dictionary<int, List<Triangle>>(); 
List<List<int>> outlines = new List<List<int>>(); 
HashSet<int> checkedVerticies = new HashSet<int>(); 

public void GenerateMesh(int[,] map, float squareSize){ 
    triangleDictionary.Clear(); 
    outlines.Clear(); 
    checkedVerticies.Clear(); 

    squareGrid = new SquareGrid (map, squareSize); 

    vertices = new List<Vector3>(); 
    triangles = new List<int>(); 

    for (int x = 0; x < squareGrid.squares.GetLength (0); x++) { 
     for (int y = 0; y < squareGrid.squares.GetLength (1); y++) { 
      TriangulateSquare (squareGrid.squares [x, y]); 
     } 
    } 

    Mesh mesh = null; 
    mesh = new Mesh(); 

    cave.mesh = mesh; 

    mesh.vertices = vertices.ToArray(); 
    mesh.triangles = triangles.ToArray(); 
    mesh.RecalculateNormals(); 
    if (!is2D) { 
     CreateWallMesh(); 
    } 
} 


void CreateWallMesh(){ 

    CalculateMeshOutLines(); 

    List<Vector3> wallVerticies = new List<Vector3>(); 
    List<int> wallTriangles = new List<int>(); 
    Mesh wallMesh = new Mesh(); 
    float wallHeight = 5; 

    foreach (List<int> outline in outlines){ 
     for (int i = 0; i < outline.Count -1; i ++){ 
      int startIndex = wallVerticies.Count; 
      wallVerticies.Add (vertices [outline [i]]); // left vertex 
      wallVerticies.Add (vertices [outline [i+1]]); // right vertex 
      wallVerticies.Add (vertices [outline [i]] - Vector3.up * wallHeight); // bottom left vertex 
      wallVerticies.Add (vertices [outline [i+1]] - Vector3.up * wallHeight); // bottom right vertex 

      wallTriangles.Add (startIndex + 0); //triangle 1 
      wallTriangles.Add (startIndex + 2); 
      wallTriangles.Add (startIndex + 3); 

      wallTriangles.Add (startIndex + 3); //triangle 2 
      wallTriangles.Add (startIndex + 1); 
      wallTriangles.Add (startIndex + 0); 
     } 
    } 
    wallMesh.vertices = wallVerticies.ToArray(); 
    wallMesh.triangles = wallTriangles.ToArray(); 
    walls.mesh = wallMesh; 


    MeshCollider wallCollider = walls.gameObject.AddComponent<MeshCollider>(); 
    wallCollider = null; 
    wallCollider = new MeshCollider(); 
    wallCollider.sharedMesh = wallMesh; 
} 

Répondre

0

De here, vous devez appeler Mesh.Clear « avant de reconstruire des triangles tableau. "

mesh = new Mesh(); 
cave.mesh.Clear(); 
cave.mesh = mesh; 
+0

Je pense avoir trouvé la source du problème, ce qui se passe est que dans ma carte script générateur, il appelle le programme ci-dessus qui crée un MeshCollider 'MeshCollider wallCollider = walls.gameObject.AddComponent (); ' ce que j'ai besoin de faire est que cela se produit seulement la première fois et ne se produise pas à chaque clic successif –