Ich folgte einem Tutorial zum Erstellen eines prozeduralen generierten Labyrinths in Einheit mit C#, dass beim Klicken mit der Maustaste, erzeugt es ein neues Labyrinth.Verfahren Irrgarten entfernen alte Collider
Wenn ich jedoch ein neues Labyrinth erzeuge, sieht alles gut aus, aber die MeshCollider
für das alte Labyrinthgitter ist noch vorhanden, zusätzlich zu dem neuen Labyrinth MeshCollider
, das zahlreiche unsichtbare Wände bildet.
Wie würde ich die alten MeshCollider
s in meinem Skript löschen, so dass sie entfernt werden und nur das neu erzeugte Mesh bleibt?
Initial Labyrinth Bild
Zweites Labyrinth Bild
Jedes Labyrinth, nach dem ersten, hat die alten MeshCollider
s durch die grüne Kontur dargestellt und es sieht aus wie es nur neue MeshCollider
s macht und nicht wieder Platzieren Sie den alten mit einem neuen. Ich dachte, ich könnte dieses Problem beheben, indem die Mascheneinstellung und MeshCollider
auf null, dann neue Masche am Anfang jeder neuen Labyrinths Generation, aber es tut nichts:
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;
}
Ich denke, dass ich die Quelle des Problems zu finden, was passiert ist, ist, dass in meinem Map-Generator-Skript auf dem Programm ruft aufgeführt, über den ein MeshCollider 'MeshCollider wallCollider = walls.gameObject.AddComponent schafft(); ' was ich tun muss, ist dies nur beim ersten Mal passieren und nicht bei jedem folgenden Klick passieren –