2017-04-05 1 views
-1
void CreateCubesBesideWaypoints() 
    { 
     const int lightCount = 20; 
     Vector3[] lightPositions = new Vector3[lightCount]; 

     for (int i = 0; i < waypoints.Length - 1; i++) 
     { 
      posToChunkDistances(waypoints[i].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
      for (int x = 0; x < lightPositions.Length; x++) 
      { 
       lightPrefab.GetComponent<Renderer>().material.color = Color.red; 
       GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
       cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
       cloneLightPrefab.tag = "LightPrefab"; 
       //cloneLightPrefab.transform.SetParent(lightPrefab.transform); 
      } 
     } 
    } 

So funktioniert es gut. Aber wenn ich die Linie verwende:Warum, wenn ich GameObject klone/dupliziere, wird die Speicherbelegung auf 98% erhöht?

Dann wird die Speicherauslastung zu 98% und ich muss den PC neu starten. Der LightPrefab ist ein Cube GameObject, das ich in dieses Skript ziehe. Und was ich tun möchte, ist, alle neuen cloneLightPrefab gameobjects unter dem lightPrefab als Kinder zu setzen.

Und eine Unter Frage, in der inneren Schleife auf der Linie:

for (int x = 0; x < lightPositions.Length; x++) 

Soll ich ändere es:

for (int x = 0; x < lightPositions.Length - 1; x++) 
+0

lightPrefab.GetComponent () .material.color = Color.red; Ruf zu vielen Zeiten ... Du kannst es bewegen. –

Antwort

3

Es gibt so viele Probleme in Ihrem Code so wird diese Antwort lange dauern, .

. Vor allem brauchen Sie nicht die äußere Schleife: for (int i = 0; i < waypoints.Length - 1; i++). Bitte entferne das. Das war nicht in meiner letzten Antwort enthalten und ich kann nicht sagen, warum du es dort hinzugefügt hast. Dies erhöht die Zeit, die Sie in der Schleife verbringen.

.Sie modifizieren ein Prefab, wenn Sie das getan haben lightPrefab.GetComponent<Renderer>().material.color = Color.red; Sie sollten stattdessen das geklonte Objekt ändern.

.Stellen Sie nicht fest, dass das übergeordnete Objekt des instanziierten Objekts ein Prefab ist. Das machen Sie mit cloneLightPrefab.transform.SetParent(lightPrefab.transform);.

Erstellen Sie ein leeres GameObject, und verwenden Sie es als übergeordnetes Element für alle Lichtobjekte, die Sie instanziieren. GameObject parentObject = new GameObject("LightParentObj"); dann cloneLightPrefab.transform.SetParent(parentObject.transform);.

Bitte sehen Sie eine this Post für das Erstellen von Prefabs, wenn Sie das nicht bereits wissen.

Ihre festen Code sollte etwas mehr wie folgt aussehen:

void CreateCubesBesideWaypoints() 
{ 
    const int lightCount = 20; 
    Vector3[] lightPositions = new Vector3[lightCount]; 

    posToChunkDistances(waypoints[0].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
    GameObject parentObject = new GameObject("LightParentObj"); 
    for (int x = 0; x < lightPositions.Length; x++) 
    { 
     GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
     cloneLightPrefab.GetComponent<Renderer>().material.color = Color.red; 
     cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
     cloneLightPrefab.tag = "LightPrefab"; 
     cloneLightPrefab.transform.SetParent(parentObject.transform); 
    } 
} 

Sollte ich es ändern zu: for (int x = 0; x < lightPositions.Length - 1; x ++)

Nein.

Wenn Sie for (int x = 0; x < lightPositions.Length; x++) haben, die Schleife beginnt von 0 und endet mit lightPositions.Length - 1. Wenn Sie es in for (int x = 0; x < lightPositions.Length - 1; x++) ändern, startet die Schleife von 0 und endet mit lightPositions.Length - 2. Grundsätzlich würde die Schleife nicht alle Elemente im Array durchlaufen.

Ich denke, Sie sollten Google und verstehen for Schleife mit Array in C#, bevor Sie mit der Codierung fortfahren. Es ist eines dieser grundlegenden Dinge, die Sie kennen müssen.

Hinweis:

Eines der Zeiten ist es in Ordnung sein kann for (int x = 0; x < lightPositions.Length - 1; x++) zu verwenden ist, wenn Sie <= statt < verwenden.

Zum Beispiel for (int x = 0; x <= lightPositions.Length - 1; x++). In diesem Fall wird die Schleife immer noch alle Elemente im Array durchlaufen.

+0

Der Grund, warum ich die äußere Schleife gemacht habe, ist, weil ich Folgendes tun werde: posToChunkDistances (Wegpunkte [0] .transform.position, Wegpunkte [waypoints.Length - 1] .transform.position, lightPositions, lightCount); Es wird nur Würfel auf einen Wegpunkt gelegt. Aber in Wegpunkten habe ich mehr als einen Wegpunkt. Deshalb habe ich vor dem for eingefügt (int i = 0; i

+0

Nicht wirklich. Der Wegpunkt beginnt beim '0'-Index und endet bei' waypoints.Length-1'. Die Funktion 'posToChunkDistances' nimmt zwei Positionen ein: 1. Der Anfang der Position, die 'Wegpunkte [0] .Transform.Position' ist. 2. Das Ende der Position, die "Wegpunkte.Länge - 1" ist. Wenn Sie es in diesen beiden Positionen übergeben, wird es Punkte zwischen diesen beiden Positionen generieren. Die Entfernung dieser Punkte ist gleich und das ist was du willst. – Programmer

+0

Es speichert die erzeugten Punkte gleichmäßig in der Array-Variable 'lightPositions'. Dass wir das Licht über jeder dieser Positionen durchlaufen und instanziieren. Der Hauptgrund, warum ich nicht gerade die "Wegpunkte" umreiße, liegt darin, dass wir nicht sicher sind, dass die Linien gleichmäßig erzeugt werden. Wir haben auch keine Kontrolle darüber, wie viele Punkte generiert werden sollen. – Programmer

Verwandte Themen