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]));
}Aufgabe
EinfachDer 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():
keysenthält die vier Ziffernschaltflächen in der richtigen Reihenfolge:keys[0]gibt 1 ein,keys[1]gibt 2 ein,keys[2]gibt 3 ein undkeys[3]gibt 4 ein. Verknüpfe sie in einerfor-Schleife, jeweils mit einer Lambda-Funktion, diePressaufruft.clearButtonleert mit einer Lambda-Funktion den bisher eingegebenen Code (entered) und zeigt ihn mitShowCode()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;
}
}
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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons 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