Zähler erhöhen solange ein Button gedrückt wird
Um Unitys UI-Button interaktiv zu gestalten, wird im Inspector eine Methode an das Klick-Ereignis der Button-Komponente angehängt. Jedoch unterstützt dieses Vorgehen nur ein einfaches Klick-Ereignis. Für komplexere Ereignisse wie z.B. das Erhöhen eines Zählers solange der Button gedrückt gehalten wird, ist die Überwachung zusätzlicher Ereignisse nötig.
Eine ausführliche Anleitung kannst Du Dir im Video ansehen. Das Beispiel-Projekt findest Du außerdem bei GitHub. Im Folgenden fasse ich die wesentlichen Punkte nochmal zusammen:
Solange-gedrückt-Logik
- Verwende einen gewöhnlichen UI-Button und erzeuge ein MonoBehaviour-Script, das als Geschwister der Button-Komponente hinzugefügt wird. Die klassische Verknüpfung mit dem OnClick-Ereignis im Inspector ist nicht nötig!
- Importiere das EventSytem im Code:
using UnityEngine.EventSystems;
- Implementiere die Interfaces
IPointerDownHandler
undIPointerUpHandler
. - Lege eine boolsche Variable
mausIstGedrueckt
an und setze sie entsprechend innerhalbOnPointerDown
bzw.OnPointerUp
. - Führe die gewünschte Logik, z.B. das Erhöhen des Zählers, innerhalb von
Update
aus, wennmausIstGedrueckt
wahr ist.
using UnityEngine.EventSystems; public class ZaehlerButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { ... // Update is called once per frame void Update() { if (mausIstGedrueckt) ... Zähler erhöhen ... } private bool mausIstGedrueckt = false; public void OnPointerDown(PointerEventData eventData) { Debug.Log("Maus gedrückt."); mausIstGedrueckt = true; } public void OnPointerUp(PointerEventData eventData) { Debug.Log("Maus losgelassen."); mausIstGedrueckt = false; }
Geschwindigkeit steuern
Der Zähler wird nun in jedem Frame erhöht, je nach Systemleistung also sehr schnell. Um die Aktualisierungsgeschwindigkeit zu steuern, müssen zusätzlich noch die Zeit messen.
- Deklariere eine
private float
-VariablewarteNoch
, die angibt, wie lange noch gewartet werden muss, bevor das nächste Mal hochgezählt wird. - Führe das Hochzählen nur aus, wenn
warteNoch<=0
ist, ansonsten ziehe die verstrichene Zeit (Time.deltaTime
) von der Wartezeit ab. - Damit der erste Klick immer sofort auslöst, setze
warteNoch
auf0
, wenn die Maus nicht gedrückt ist.
private float warteNoch=0f; // Update is called once per frame void Update() { if (mausIstGedrueckt) { if (warteNoch <= 0f) //Wartezeit abgelaufen { WennButtonAngeklickt(); warteNoch = 0.5f; //Wartezeit bis WennButtonAngeklickt wieder ausgelöst wird } else { warteNoch -= Time.deltaTime; //verstrichene Zeit von Wartezeit abziehen } } else //maus ist nicht gedrückt { warteNoch = 0f; } }