2017-07-15 1 views
0

Ich habe zwei weiße Sprite-Spielobjekte. Einer wurde rot und der andere grün mit dem Farbwähler im Sprite Renderer dargestellt. Die RGB-Werte sind die gleichen wie im folgenden Code. Beide haben das Tag 'Objekt'.Eine Live-Liste von Spielobjekten basierend auf ihrer Farbe beibehalten

Ich habe 3 Listen, die ich während des Spiels aktualisiert habe - totalObjects, redObjects & greenObjects, die ihre jeweiligen Spielobjekte enthalten. Ich bin in der Lage, TotalObjects zu füllen, aber nicht die anderen beiden.

Hier ist die Code-

public List<GameObject> totalObjects = new List <GameObject>();   
public List<GameObject> redObjects = new List <GameObject>(); 
public List<GameObject> greenObjects = new List <GameObject>(); 

private Color red = new Color (0.9f, 0.5f, 0.5f, 1.0f); 
private Color green = new Color (0.8f, 0.8f, 0.3f, 1.0f); 

void Awake() 
    { 
     totalObjects.AddRange (GameObject.FindGameObjectsWithTag("object")); 

     foreach (GameObject x in totalObjects) 
     { 
      if (x.GetComponent<SpriteRenderer>().color == red) 
      { 
       redObjects.Add(x); 
      } 
      else if (x.GetComponent<SpriteRenderer>().color == green) 
      { 
       greenObjects.Add(x); 
      } 
     } 
    } 

void Update() 
    { 
     totalObjects.RemoveAll(GameObject => GameObject == null); 
     redObjects.RemoveAll(GameObject => GameObject == null); 
     greenObjects.RemoveAll(GameObject => GameObject == null); 
    } 

Auch die Farbe der Objekte während des Spiels (red> grün & umgekehrt) ändern können, wenn sie einen bestimmten Bereich von einem OnTriggerEnter2D eingeben. Wie aktualisiere ich diese Änderungen in den Listen?

+0

Nun, können Sie nicht einfach die Listen vom Auslöser aktualisieren? –

+0

Wie sollte ich das tun? Wenn zB ein rotes Objekt grün wird, muss es aus der roten Liste entfernt und zur grünen Liste hinzugefügt werden. Ich denke, in gewisser Weise müssen die Listen immer ' scannen 'für die Farben aller Objekte, so dass es alle Änderungen verfolgen kann. Auch aus irgendeinem Grund funktionieren die verschachtelten if-Anweisungen innerhalb der foreach-Schleife nicht. –

+0

Ich schätze, die Objekte werden die Farbe nicht von allein ändern, also wenn Sie ändere die Farbe, entferne sie aus der einen Liste und füge sie zu der anderen hinzu ... – yes

Antwort

0

1) Werfen Sie einen Blick auf dieses Thema. Compare two Color objects

„Farben vergleichen basiert ausschließlich auf ihre ARGB Werte, Sie die ToArgb Methode verwenden, sollten hierfür ist, dass die Equals und die Gleichstellung der Mitglieder Äquivalenz bestimmen B. Schwarz und FromArgb (0,0,0) werden nicht als gleich betrachtet, da Schwarz eine benannte Farbe ist und FromArgb (0,0,0) nicht "

2) Wenn Sie Auslöser für Farbänderungen haben, warum steuern Sie Objekte in Listen in einem Trigger-Handler nicht? Es wird viel effektiver sein. Vor allem, wenn Sie einige Handler bei der Erstellung von Objekten und "Töten" von Objekten hinzufügen.

3) Vielleicht sollten Sie Ihre Listen löschen, wenn Sie sie erneut in Awake() -Methode ausfüllen, auch wenn Sie Update() rufen, bevor ich? Sie löschen "tote" Objekte in Update und fügen Sie der Liste "lebende" Objekte wieder hinzu. Es scheint, dass Sie doppelte Objekte in Listen ohne das bekommen.

+0

Die Farben ändern sich beim Auslösen. Aber, wie aktualisiere ich die Listen, um diese Änderung anzuzeigen? Jedes Mal, wenn ein rotes Objekt in grün geändert wird, muss es aus der roten Liste entfernt und automatisch zur grünen Liste hinzugefügt werden. –

+0

Sie haben Ihre Frage bereits beantwortet: Wenn der Auslöser bei Farbwechsel von Rot auf Grün ausgelöst wird, zum Beispiel: RedObjectList.Remove (changing_object); GreenObjectList.Add (changing_object); –

+0

Ja, ich war unnötig kompliziert Dinge. Aber die if-Anweisungen, die verwendet werden, um die Farblisten von Awake() zu füllen, funktionieren immer noch nicht. Irgendeine Idee warum? –

Verwandte Themen