Sie verwenden die Eingabe-API nicht für die neue Benutzeroberfläche. Sie abonnieren UI-Ereignisse oder implementieren je nach Ereignis eine Schnittstelle.
Dies sind die richtigen Methoden zum Erkennen von Ereignissen auf den neuen UI-Komponenten:
1 . Image
, RawImage
Und Text
Komponenten:
Implementieren Sie die benötigte Schnittstelle und überschreiben Sie deren Funktion. Das folgende Beispiel implementiert die am häufigsten verwendeten Ereignisse.
using UnityEngine.EventSystems;
public class ClickDetector : MonoBehaviour, IPointerDownHandler, IPointerClickHandler,
IPointerUpHandler, IPointerExitHandler, IPointerEnterHandler,
IBeginDragHandler, IDragHandler, IEndDragHandler
{
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("Drag Begin");
}
public void OnDrag(PointerEventData eventData)
{
Debug.Log("Dragging");
}
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("Drag Ended");
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Mouse Down: " + eventData.pointerCurrentRaycast.gameObject.name);
}
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("Mouse Enter");
}
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("Mouse Exit");
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("Mouse Up");
}
}
2 . Button
Komponente:
Sie verwenden Ereignisse, um sich für Schaltflächenklicks zu registrieren:
public class ButtonClickDetector : MonoBehaviour
{
public Button button1;
public Button button2;
public Button button3;
void OnEnable()
{
button1.onClick.AddListener(() => buttonCallBack(button1));
button2.onClick.AddListener(() => buttonCallBack(button2));
button3.onClick.AddListener(() => buttonCallBack(button3));
}
private void buttonCallBack(Button buttonPressed)
{
if (buttonPressed == button1)
{
Debug.Log("Clicked: " + button1.name);
}
if (buttonPressed == button2)
{
Debug.Log("Clicked: " + button2.name);
}
if (buttonPressed == button3)
{
Debug.Log("Clicked: " + button3.name);
}
}
void OnDisable()
{
button1.onClick.RemoveAllListeners();
button2.onClick.RemoveAllListeners();
button3.onClick.RemoveAllListeners();
}
}
Wenn Sie etwas anderes als Button Click auf den Button erkennen, verwenden Sie Methode 1. Verwenden Sie beispielsweise Button down und nicht Button Click, verwenden Sie IPointerDownHandler
und seine OnPointerDown
Funktion aus Methode 1.
3 . InputField
Komponente:
Sie verwenden Ereignisse, um sich zu registrieren, um sich für InputField Submit zu registrieren:
public InputField inputField;
void OnEnable()
{
inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}
private void inputEndEdit()
{
Debug.Log("Input Submitted");
}
private void inputValueChanged()
{
Debug.Log("Input Changed");
}
void OnDisable()
{
inputField.onEndEdit.RemoveAllListeners();
inputField.onValueChanged.RemoveAllListeners();
}
4 . Slider
Komponente:
So erkennen Sie, wann sich der Schiebereglerwert beim Ziehen ändert:
public Slider slider;
void OnEnable()
{
slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}
void sliderCallBack(float value)
{
Debug.Log("Slider Changed: " + value);
}
void OnDisable()
{
slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}
Verwenden Sie für andere Ereignisse Methode 1 .
5 . Dropdown
Komponente
public Dropdown dropdown;
void OnEnable()
{
dropdown.onValueChanged.AddListener(delegate { callBack(); });
dropdown.onValueChanged.AddListener(callBackWithParameter);
}
void OnDisable()
{
dropdown.onValueChanged.RemoveAllListeners();
}
void callBack()
{
}
void callBackWithParameter(int value)
{
}
NICHT-UI-OBJEKTE:
6. Für 3D-Objekte (Mesh Renderer / beliebiger 3D Collider)
In PhysicsRaycaster
auf die Kamera dann verwenden Sie einen des Ereignisses von Methode 1 .
Der folgende Code wird automatisch PhysicsRaycaster
zum Hauptcode hinzugefügt Camera
.
public class MeshDetector : MonoBehaviour, IPointerDownHandler
{
void Start()
{
addPhysicsRaycaster();
}
void addPhysicsRaycaster()
{
PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType<PhysicsRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
}
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
}
7. Für 2D-Objekte (Sprite-Renderer / beliebiger 2D-Collider)
In Physics2DRaycaster
auf die Kamera dann verwenden Sie einen des Ereignisses von Methode 1 .
Der folgende Code wird automatisch Physics2DRaycaster
zum Hauptcode hinzugefügt Camera
.
public class SpriteDetector : MonoBehaviour, IPointerDownHandler
{
void Start()
{
addPhysics2DRaycaster();
}
void addPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = GameObject.FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
}
Fehlerbehebung beim EventSystem:
Auf der Benutzeroberfläche, 2D-Objekten (Sprite-Renderer / beliebiger 2D-Collider) und 3D-Objekten (Mesh-Renderer / beliebiger 3D-Collider) wurden keine Klicks festgestellt:
A .Überprüfen Sie, ob Sie über EventSystem verfügen. Ohne EventSystem können Klicks überhaupt nicht erkannt werden. Wenn Sie es nicht haben, erstellen Sie es selbst.
Gehen Sie zu GameObject ---> UI ---> Event System . Dadurch wird ein EventSystem erstellt, falls es noch nicht vorhanden ist. Wenn es bereits existiert, wird es von Unity einfach ignoriert.
B. Die UI-Komponente oder GameObject mit der UI-Komponente muss sich unter a befinden Canvas
. Dies bedeutet, dass a Canvas
das übergeordnete Element der UI-Komponente sein muss. Ohne dies funktioniert EventSystem nicht und Klicks werden nicht erkannt.
Dies gilt nur für UI-Objekte. Dies gilt nicht für 2D-Objekte (Sprite-Renderer / 2D-Collider) oder 3D-Objekte (Mesh-Renderer / 3D-Collider).
C. Wenn dies ein 3D-Objekt ist, PhysicsRaycaster
ist es nicht an der Kamera angebracht. Stellen Sie sicher, dass diese PhysicsRaycaster
an der Kamera angebracht ist. Siehe Nr. 6 oben für weitere Informationen.
D. Wenn dies ein 2D-Objekt ist, Physics2DRaycaster
ist es nicht an der Kamera angebracht. Stellen Sie sicher, dass diese Physics2DRaycaster
an der Kamera angebracht ist. Siehe Nr. 7 oben für weitere Informationen.
E .Wenn dies ist ein UI - Objekt , das Sie wollen Klicks erkennen an den Schnittstellenfunktionen wie OnBeginDrag
, OnPointerClick
, OnPointerEnter
und andere in den genannten Funktionen # 1 dann das Skript mit dem Erkennungscode muss an dieser UI - Objekt angebracht werden Sie klicken Sie ermitteln möchten.
F. Wenn es sich um ein UI-Objekt handelt, auf das Sie Klicks erkennen möchten, stellen Sie sicher, dass sich kein anderes UI-Objekt davor befindet. Wenn sich vor dem zu erkennenden Klick eine andere Benutzeroberfläche befindet, wird dieser Klick blockiert.
Um zu überprüfen, ob dies nicht das Problem ist, deaktivieren Sie jedes Objekt unter der Leinwand mit Ausnahme des Objekts, das Sie erkennen möchten. Klicken Sie auf und prüfen Sie, ob das Klicken funktioniert.
OnPointerClick
welche dieIPointerClickHandler
Schnittstelle verwendet. Bitte lesen Sie meine Antwort noch einmal. Alles in meiner Antwort sollte auf Desktop und Mobile funktionieren. Ich habe eine Antwort gesehen, die den Leuten sagt, dass sieOnPointerClick
für eine Button-Komponente verwenden sollen. Das ist so falsch. Es wird funktionieren, aber es gibt einen Fehler, von dem sie nicht wissen, wann Sie das tun. Verwenden Sie das Ereignis in meiner Antwort, um zu erkennen, wann auf eine Schaltfläche geklickt wirdAddListerner
. Knopfklick mit nicht erkennenOnPointerClick
.OnPointerClick
ist für andere Komponenten, die kein Button ist.Sie können
EventTrigger
Ihren UI-Elementen, die diese bereits haben , eine Komponente hinzufügen , dieEvents
Sie nurmethod/Function
an ein bestimmtes Ereignis weitergeben müssen.quelle
Sie können auch OnMouseDown verwenden. OnMouseDown wird aufgerufen, wenn der Benutzer die Maustaste über dem GUIElement oder Collider gedrückt hat. Dieses Ereignis wird an alle Skripte des Colliders oder GUIElement gesendet.
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; // The new load level needs this public class ExampleClass : MonoBehaviour { void OnMouseDown() { // Edit: // Application.LoadLevel("SomeLevel"); // Application.LoadLevel() is depreciating but still works SceneManager.LoadScene("SomeLevel"); // The new way to load levels } }
quelle
Sie nicht verwenden OnMouseDown () für mobile Performance und Multi-Touch - Themen.
Dieser Code funktioniert auf UI-Objekten für Mehrfachberührungen
In meiner Antwort verwende ich das Image- Element mit einem " Button " -Tag und es verfügt über ein ButtonController- Skript mit einer öffentlichen ButtonDown () -Methode, die aufgerufen werden sollte, wenn der Benutzer das Image-Element berührt.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class TouchScript : MonoBehaviour { void Update() { PointerEventData pointer = new PointerEventData(EventSystem.current); List<RaycastResult> raycastResult = new List<RaycastResult>(); foreach (Touch touch in Input.touches) { if(touch.phase.Equals(TouchPhase.Began)) { pointer.position = touch.position; EventSystem.current.RaycastAll(pointer, raycastResult); foreach(RaycastResult result in raycastResult) { if(result.gameObject.tag == "Button") { result.gameObject.GetComponent<ButtonController>().ButtonDown(); } } raycastResult.Clear(); } } } }
quelle