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
images labyrinthe Second
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;
}
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 –