Menu
CoddyTech

Lambdas

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

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 nach => 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, wobei jede Lambda-Funktion ihre eigene Farbe übergibt. Eine Lambda-Funktion erfasst die Variablen, die sie verwendet: Sie kopiert deren Werte nicht, sondern liest sie aus, wenn sie ausgeführt wird. Die Reset-Lambda-Funktion setzt das Feld changes bei jedem Klick zurück, noch lange nachdem Start() beendet wurde.

In einer Schleife kann dich das in eine Falle locken. Bei swatches[i].onClick.AddListener(() => Paint(colors[i])); erfasst jede Lambda-Funktion dasselbe i, und wenn jemand klickt, ist die Schleife bereits beendet und i entspricht colors.Length: Jeder Farbfleck 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

Der Tresor öffnet sich mit einem dreistelligen Code. Keypad.cs enthält bereits Press(int digit), das dem Code auf dem Bildschirm eine Ziffer hinzufügt und nach drei Ziffern die Tür öffnet oder Wrong anzeigt, sowie ShowCode(), das anzeigt, was bisher eingegeben wurde. Verknüpfe die Schaltflächen in Start():

  • keys enthält die vier Ziffernschaltflächen in der richtigen Reihenfolge: keys[0] gibt 1 ein, keys[1] gibt 2 ein, keys[2] gibt 3 ein und keys[3] gibt 4 ein. Verknüpfe sie in einer for-Schleife, jeweils mit einer Lambda-Funktion, die Press aufruft.
  • clearButton leert mit einer Lambda-Funktion den bisher eingegebenen Code (entered) und zeigt ihn mit ShowCode() an.

Der Code lautet 312. Drücke auf Play, öffne den Tresor und klicke dann auf Check.

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 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;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Echte Spiele entwickeln