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
IPointerDownHandlerundIPointerUpHandler. - Lege eine boolsche Variable
mausIstGedruecktan und setze sie entsprechend innerhalbOnPointerDownbzw.OnPointerUp. - Führe die gewünschte Logik, z.B. das Erhöhen des Zählers, innerhalb von
Updateaus, wennmausIstGedruecktwahr 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<=0ist, ansonsten ziehe die verstrichene Zeit (Time.deltaTime) von der Wartezeit ab. - Damit der erste Klick immer sofort auslöst, setze
warteNochauf0, 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;
}
}