2016-07-09 7 views
0

EventSystem.current.IsPointerOverGameObject() überprüft, ob die Maus über ein beliebiges UI-Element geklickt wurde. Wie kann ich überprüfen, ob die Maus auf ein UI-Element mit einem spezifischen Namen oder Tag geklickt hat?Prüfen, ob die Maus auf ein UI-Element mit einem bestimmten Namen oder Tag geklickt hat?

Mit dem folgenden Skript wird ein GameObject auf Input.GetMouseButtonUp(0) verschoben. Wenn ich auf ein UI-Element wie "Text" klicke, wird die Move-Funktion nicht ausgelöst, wodurch das GameObject nicht bewegt wird. Das ist gut. Das Problem hierbei ist, ich kann nicht welche UI-Elemente in Betracht gezogen werden. Was ich zum Beispiel möchte: Wenn der Benutzer auf ein UI-Element mit dem Tag "Bewegungsskript nicht blockieren" klickt, beginnt die Bewegung. Klickt der Benutzer jedoch auf ein UI-Element mit dem Tag "Blockbewegungsskript", wird die Bewegung nicht aufgerufen.

Schau, mein Bildschirm ist voll von "unsichtbaren" UI-Elementen (Farbe A = 0). Sie sind unsichtbar, sodass ich sie aktivieren und deaktivieren kann, wenn ich möchte. Das Problem: Wenn ich den Bildschirm berühre oder klicke, wird mein Moving Code nicht aufgerufen, weil ich auf ein unsichtbares UI-Element geklickt habe. Deshalb möchte ich überprüfen, ob die Maus über bestimmte UI-Elemente (die sichtbaren) geklickt wurde. Hier werden die sichtbaren UI-Elemente button1 und genannt.

Was die Tasten tun, wenn darauf geklickt:

using UnityEngine; 
using UnityEngine.UI; 

public class ButtonChecker: MonoBehaviour 
{ 
    public Button button1; 
    public Button button2; 

    void OnEnable() 
    { 
     //Register Button Events 
     button1.onClick.AddListener(() => buttonCallBack(button1)); 
     button2.onClick.AddListener(() => buttonCallBack(button2)); 
    } 

    private void buttonCallBack(Button buttonPressed) 
    { 
     if (buttonPressed == button1) 
     { 
      Application.LoadLevel ("Example Scene 1");w 
     } 

     if (buttonPressed == button2) 
     { 
      Application.LoadLevel ("Example Scene 2"); 
     } 
    } 

    void OnDisable() 
    { 
     //Un-Register Button Events 
     button1.onClick.RemoveAllListeners(); 
     button2.onClick.RemoveAllListeners(); 
    } 
} 

Bewegungscode (während der Überprüfung, ob Klick auf UI-Elemente):

using UnityEngine; 
using System.Collections; 
using UnityEngine.EventSystems; 

public class MovementCode : MonoBehaviour { 

    bool validInput = true; 

    void Update() 
    { 
     validateInput(); 

     if (Input.GetMouseButtonUp (0) && validInput) 
     { 
      transform.position += new Vector3 (0.08f, 0, 0); 
     } 

     if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Ended && validInput) 
     { 
      transform.position += new Vector3 (0.08f, 0, 0); 
     } 
    } 

    void validateInput() 
    { 

     if (Input.GetMouseButtonDown(0)) 
     { 
      if (EventSystem.current.IsPointerOverGameObject()) 
       validInput = false; 
      else 
       validInput = true; 
     } 

     if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) 
     { 
     if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
     validInput = false; 
     else 
     validInput = true; 
     } 
    } 
} 
+0

Ich habe Ihr Problem überhaupt nicht verstanden, und das ist, weil Sie Dinge verwirren. Was Sie versuchen zu tun ist leicht gelöst, wenn Sie die Schaltfläche UI verwenden. Und denken Sie daran, dass Sie Ebenen verwenden können, um mit der Maus zu kollidieren oder nicht (beim Klicken), damit Sie den größten Teil des Klicks lösen. – matiaslauriti

+0

@ P0lT10n Einfache Version: Wie kann ich überprüfen, ob die Maus auf ein UI-Element mit einem bestimmten Tag geklickt hat? – Dake

+0

Dies ist für die Einheit 4.6, aber das "Denken" ist das gleiche: [Siehe dies] (https://unity3d.com/es/learn/tutorials/topics/user-interface-ui/ui-events-and-event- Auslöser) – matiaslauriti

Antwort

1

Sie haben zwei Lösungen für Ihr Problem.

.Instead des Versteckens des UI Element durch das alpha Herstellung 0 verwenden gameObject.SetActive(false); auf dem Knopf Gameobject. Dies sollte Ihr Problem lösen, da das Ereignis bei einem deaktivierten GameObject nicht funktioniert.

.another Lösung ist EventSystem.current.currentSelectedGameObject.CompareTag zu verwenden, um zu überprüfen, welcher Tag der UI gehört dann etwas zu tun, auf der Grundlage dieser. Fügen Sie es zu Ihrer validateInput() Funktion hinzu.

Erstellen Sie eine sichtbare und unsichtbare tags. Ändern Sie Ihre Buttons, um diese tags zu haben. Dann ersetzen Sie die validateInput() Funktion aus dem MovementCode Skript mit dem folgenden Code:

void validateInput() 
{ 

    if (Input.GetMouseButtonDown(0)) 
    { 
     if (EventSystem.current.IsPointerOverGameObject() && EventSystem.current.currentSelectedGameObject.CompareTag("invisible")) 
      validInput = true; 
     else if (EventSystem.current.IsPointerOverGameObject()) 
      validInput = false; 
     else 
      validInput = true; 
    } 

    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) 
    { 
     if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId) && EventSystem.current.currentSelectedGameObject.CompareTag("invisible")) 
      validInput = true; 
     else if (EventSystem.current.IsPointerOverGameObject()) 
      validInput = false; 
     else 
      validInput = true; 
    } 
} 

Der obige Code wird die unsichtbare Buttonsnicht blockieren die Bewegung machen.

+0

Das ist komisch. Ihr Code funktioniert im Unity-Editor, aber nicht beim Erstellen und Ausführen auf einem Gerät. – Dake

+0

Erinnere dich an den Code, den ich mit '#if UNITY_STANDALONE || geschrieben habe UNITY_EDITOR'? Du musst es zurücklegen. Hören Sie auf, das zu entfernen. Dies trennt den mobilen und den Desktop-Code. Wenn Sie es zurückstellen und es nicht funktioniert, erstellen Sie einen neuen Thread mit Code, der im Editor funktioniert, aber nicht, wenn er erstellt wird. Ich werde es mir nochmal ansehen. Dies könnte tatsächlich ein Fehler mit Unity sein, aber ich werde sehen. – Programmer

+0

Das funktioniert auch in meinem Editor. Habe keine Zeit, um auf dem Handy zu testen. – Programmer

2
EventSystem.current.currentSelectedGameObject.GetComponent<Type>().name. 

Es gibt den UI-Objektnamen zurück.

Zum Beispiel wird der obige Code den Namen der Textkomponente einer UI-Schaltfläche zurückgeben, wenn darauf geklickt wird.

+1

Danke für Ihre richtige Antwort. Ich habe es upvolotiert, aber die vorherige Antwort löste das Problem und wurde vor 8 Stunden gepostet. – Dake

Verwandte Themen