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 und IPointerUpHandler.
  • Lege eine boolsche Variable mausIstGedrueckt an und setze sie entsprechend innerhalb OnPointerDown bzw. OnPointerUp.
  • Führe die gewünschte Logik, z.B. das Erhöhen des Zählers, innerhalb von Update aus, wenn mausIstGedrueckt 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-Variable warteNoch, 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 auf 0, 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;
        }
    }

Dr. René Bühling

Hi, mein Name ist René und ich möchte Dir dabei helfen, deinen Traum vom eigenen Computerspiel Wirklichkeit werden zu lassen. Mein erstes kommerziell veröffentlichtes Spiel habe ich Mitte der 1990er Jahre als Hobby-Projekt mit einem Basic-Dialekt unter Windows entwickelt. Seither verfolge ich das Thema Spieleentwicklung in Hobby, Studium und Beruf. Ich habe über 20 Jahre Erfahrung in allen Phasen des Entwicklungsprozesses, die ich gerne mit dir teilen möchte.