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]));
}Aufgabe
EinfachVerbinde das Tastenfeld des Tresors in Start().
- Gehe mit
forüberkeys. Deklariere in der Schleifeint digit = i + 1;und verbindekeys[i]mit() => Press(digit). - Verbinde
clearButtonmit einer Lambda-Funktion, dieentered = ""setzt undShowCode()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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der BankÜbe selbstständig: Unity-Playground