2016-12-02 1 views
1

Ich verwende eine OverlapSphere, um alle Collider innerhalb eines bestimmten Radius meines Objekts zu erkennen. Ich filtere dann ein paar, die mir egal sind. Mit den verbleibenden wenigen versuche ich eine Nachricht an diese Objekte zu senden, um ihre Renderfarbe zu aktualisieren. Wann immer es die Nachricht sendet, friert die Einheit ein. Ich habe versucht, etwas zu recherchieren und das Beste, was ich finden konnte, ist, dass Endlosschleifen es einfrieren können. Aber ich sehe kein Potenzial dafür. Hier ist der Code:.SendMessage stürzt Einheit C#

Objekt die Nachricht zu senden:

void sendmyMessage(bool status) 
{ 
    Collider[] tiles = Physics.OverlapSphere(gameObject.transform.position, 10); 

    int i = 0; 
    while (i < tiles.Length) 
    { 
     if(tiles[i].tag == "Tile") 
     { 
      //turn light on 
      if (status == true) 
      { 
       tiles[i].SendMessage("Highlight", true); 
       i++; 
      } 

      //turn light off 
      if (status == false) 
      { 
       tiles[i].SendMessage("Highlight", false); 
       i++; 
      } 
     }  
    } 
} 

Objekt empfangen Nachricht:

void Highlight(bool status) 
{ 
    //turn light on 
    if(status == true) 
    { 
     gameObject.GetComponent<Renderer>().material.color = new Color(0, 0, 0); 
    } 

    //turn light off 
    if(status == false) 
    { 
     gameObject.GetComponent<Renderer>().material.color = new Color(1, 1, 1); 
    } 
} 

Jede Hilfe ist sehr zu schätzen!

+0

Wo/Wie nennst du 'sendmyMessage'? – UnholySheep

Antwort

5

Es friert wegen der Logik if(tiles[i].tag == "Tile") hier ist Ihre Antwort. Stellen Sie sich nun vor, dass das Objekt, mit dem Sie kollidieren, das Tag "not a tile" hat? dann endet die Schleife nie.

foreach(var tile in tiles) { 
    if (tile.tag == "Tile") { 
     tiles[i].SendMessage("Highlight", status); 
    } 
} 
+0

Ich wollte seinen Code für ihn einfach wegen der unnötigen If-Anweisung vereinfachen, aber deine Antwort ist perfekt –

3
while (i < tiles.Length) 
{ 
    if(tiles[i].tag == "Tile") 
    { 
     //snip 
    }  

    // else - loop forever? 
} 

Hier ist Ihr Problem. Wenn das Tag! = "Tile" ist, dann erhöhst du niemals i.