Menu
CoddyTech

Lambdas

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 7 von 60.

AddListener erwartet eine Methode ohne Parameter. Damit ein Klick Paint(Color.red) aufruft, das eine Farbe erwartet, schreibst du die Methode direkt an Ort und Stelle: () => Paint(Color.red). Das ist eine Lambda-Funktion, eine Methode ohne Namen. Die () enthalten ihre Parameter – hier keine –, und auf => folgt ihr Rumpf: eine Anweisung oder ein Block in { } für mehrere Anweisungen:

public Button redButton;
public Button blueButton;
public Button resetButton;
public Renderer lamp;
private int changes;

void Start()
{
    redButton.onClick.AddListener(() => Paint(Color.red));
    blueButton.onClick.AddListener(() => Paint(Color.blue));
    resetButton.onClick.AddListener(() =>
    {
        changes = 0;
        lamp.material.color = Color.white;
    });
}

void Paint(Color color)
{
    lamp.material.color = color;
    changes++;
}

Eine Paint-Methode dient beiden Farbschaltflächen; jede Lambda-Funktion übergibt ihre eigene Farbe. Eine Lambda-Funktion erfasst die Variablen, die sie verwendet: Sie kopiert deren Werte nicht, sondern liest sie beim Ausführen aus. Die Reset-Lambda-Funktion setzt das Feld changes bei jedem Klick zurück, lange nachdem Start() beendet wurde.

Das kann dich in einer Schleife erwischen. Bei swatches[i].onClick.AddListener(() => Paint(colors[i])); erfasst jede Lambda-Funktion dasselbe i, und bis jemand klickt, ist die Schleife beendet und i entspricht colors.Length: Jede Farbkachel löst eine IndexOutOfRangeException aus. Eine innerhalb der Schleife deklarierte Variable ist bei jedem Durchlauf eine neue Variable. Kopiere also i in eine solche Variable und erfasse die Kopie:

for (int i = 0; i < swatches.Length; i++)
{
    int index = i;
    swatches[i].onClick.AddListener(() => Paint(colors[index]));
}
challenge icon

Aufgabe

Einfach

Verbinde das Tastenfeld des Tresors in Start().

  1. Gehe mit for über keys. Deklariere in der Schleife int digit = i + 1; und verbinde keys[i] mit () => Press(digit).
  2. Verbinde clearButton mit einer Lambda-Funktion, die entered = "" setzt und ShowCode() aufruft.

Drücke „Spielen“ und gib 3, 1, 2 ein: Auf dem Bildschirm erscheint Open. Drücke anschließend „Prüfen“.

Probier es selbst

using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class Keypad : MonoBehaviour
{
    public Button[] keys;
    public Button clearButton;
    public TMP_Text codeText;
    public GameObject door;
    public string secret = "312";
    private string entered = "";

    void Start()
    {
        ShowCode();
        // Verknüpfe jede Taste mit Press und ihrer jeweiligen Ziffer und clearButton mit dem Löschen des Codes
    }

    void Press(int digit)
    {
        entered += digit;
        ShowCode();
        if (entered.Length == 3)
        {
            if (entered == secret)
            {
                door.SetActive(false);
                codeText.text = "Open";
            }
            else
            {
                codeText.text = "Wrong";
            }
            entered = "";
        }
    }

    void ShowCode()
    {
        codeText.text = "Code: " + entered;
    }
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground