2017-01-23 2 views
0

Ich habe zwei Spielobjekte in meiner Szene und ich weise dieses Skript beiden zu. Wenn ich auf irgendeinen von ihnen klicke, wird der Code in der If-Anweisung, der sich auf jede von ihnen bezieht, zweimal ausgeführt, wenn ich einen von ihnen deaktiviere, wird er einmal ausgeführt, wie es sollte. Das Erkennen von Objekten mit Raycast wird zweimal ausgeführt.

void Update() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     RaycastHit hit; 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit)) 
     { 
      if (hit.transform.name == "Object A") 
      { 
       Debug.Log("Object A Clicked"); // log twice 
      } 

      if (hit.transform.name == "Object B") 
      { 
       Debug.Log("Object B Clicked"); // log twice 
      } 
     } 
    } 
} 

Die Frage ist, warum wird der Code zweimal mit einem einzigen Klick ausgeführt ?!

Antwort

1

Die Frage ist, warum wird der Code zweimal mit einem Einzelklick ausgeführt ?!

Weil jede Funktion von jedem Skript jedes Bild aufgerufen wird. Input.GetMouseButtonDown(0) wird in jedem Frame in jedes Skript, das es in der Update-Funktion hat, wahr sein.

Wenn Sie es wollen, einmal zu erfassen, haben Sie zwei Möglichkeiten: nur

.Attach das Skript ein Gameobject. Normalerweise ein leeres GameObject. Es sollte jedes Gamebject mit einem Collider einmal erkennen, wenn es angeklickt wird.

. Verwenden Sie die IPointerDownHandler und ihre OnPointerDown Funktion. Sie können dies an jedes GameObject anhängen, das Sie erkennen möchten. Überprüfen Sie # 6 von here für 2d/Sprites. Überprüfen Sie für 3D-Objekte # 6.

+0

Danke, das hat geholfen. – Abdou023

0

Dies wird ausgeführt zweimal, denn wenn man ein Ziel mit einem Klick getroffen, tut es auf diese

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

diese Zeile Code, werden Ihnen das Objekt geben, und da haben Sie das Skript in zwei Objekten, die es, wird 2 mal genau dasselbe laufen. Beide Objekte erhalten die gleiche ray.

+1

Danke für die Antwort. – Abdou023

0

Es wurde zweimal protokolliert, weil beide Objekte Strahl senden, wenn Sie auf die linke Maustaste klicken. Dann senden beide einen Strahl von der Kamera mit der Mausposition. Dann treffen und strahlen beide Strahlen;

  • Falls sie treffen, melden sie den gleichen Namen Hit Objekt
  • Falls sie schlagen alles nicht, sie nichts tun.

Eine mögliche Lösung:

void Update() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     RaycastHit hit; 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit) && hit.transform == transform) 
     { 
      if (hit.transform.name == "Object A") 
      { 
       Debug.Log("Object A Clicked"); // log twice 
      } 

      if (hit.transform.name == "Object B") 
      { 
       Debug.Log("Object B Clicked"); // log twice 
      } 
     } 
    } 
} 

Durch die Zugabe von "hit.transform == verwandelt" in der, wenn die Bedingung, die Sie nicht auf das andere Objekt auslösen es zu protokollieren. Dennoch ist dies keine ideale Lösung, da alle Ihre Objekte Strahlen senden und prüfen, ob der Strahl sie trifft.

Ein besserer Ansatz besteht darin, den Strahl von einem zentralen Skript zu senden und dieses Skript dem Objekt mitzuteilen, dass es von einem Strahl getroffen wurde.

+0

Danke für die Antwort. – Abdou023

Verwandte Themen