Lambdy
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 7 z 60.
AddListener przyjmuje metodę bez parametrów. Aby kliknięcie wywoływało Paint(Color.red), która przyjmuje kolor, zapisz metodę bezpośrednio w tym miejscu: () => Paint(Color.red). To lambda, czyli metoda bez nazwy. () zawiera jej parametry — tutaj nie ma żadnych — a po => znajduje się jej treść: jedna instrukcja albo blok w { }, jeśli instrukcji jest kilka:
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++;
}Jedna metoda Paint obsługuje oba przyciski kolorów, a każda lambda przekazuje własny kolor. Lambda przechwytuje używane zmienne: nie kopiuje ich wartości, lecz odczytuje je w chwili uruchomienia. Lambda resetująca ustawia pole changes przy każdym kliknięciu — długo po zakończeniu działania Start().
Możesz jednak wpaść w pułapkę w pętli. W przypadku swatches[i].onClick.AddListener(() => Paint(colors[i])); każda lambda przechwytuje to samo i, a zanim ktokolwiek kliknie, pętla zakończy działanie, ustawiając i na colors.Length: każda próbka koloru zgłosi wyjątek IndexOutOfRangeException. Zmienna zadeklarowana wewnątrz pętli jest za każdym razem nową zmienną, więc skopiuj do niej wartość i i przechwyć kopię:
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}Wyzwanie
ŁatwyPodłącz klawiaturę sejfu w Start().
- Przejdź pętlą
forpo elementachkeys. W pętli zadeklarujint digit = i + 1;i podłączkeys[i]do() => Press(digit). - Podłącz
clearButtondo jednej lambdy, która ustawiaentered = ""i wywołujeShowCode().
Naciśnij „Graj” i wpisz 3, 1, 2: na ekranie pojawi się Open. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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();
// Podłącz każdy klawisz do Press z odpowiadającą mu cyfrą, a clearButton do czyszczenia kodu
}
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;
}
}
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w bankuPoćwicz samodzielnie: Edytor online Unity