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.