Lambdy
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 7 z 56.
AddListener przyjmuje metodę bez parametrów. Aby kliknięcie wywoływało Paint(Color.red), która przyjmuje kolor, zapisz metodę w miejscu wywołania: () => 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 przez siebie zmienne: nie kopiuje ich wartości, tylko odczytuje je w chwili wykonania. Lambda resetująca ustawia pole changes za każdym razem, gdy zostanie kliknięta — długo po zakończeniu działania Start().
To może sprawić problem w pętli. W przypadku swatches[i].onClick.AddListener(() => Paint(colors[i])); każda lambda przechwytuje tę samą zmienną i, a zanim ktokolwiek kliknie, pętla już się zakończy, a i będzie równe colors.Length: każdy próbnik koloru zgłosi wyjątek IndexOutOfRangeException. Zmienna zadeklarowana wewnątrz pętli jest za każdym razem nową zmienną, więc skopiuj i do nowej zmiennej i przechwytuj kopię:
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}Wyzwanie
ŁatwySkarbiec otwiera się po wpisaniu trzycyfrowego kodu. W Keypad.cs znajduje się już Press(int digit), która dodaje cyfrę do kodu wyświetlanego na ekranie i po wpisaniu trzech cyfr otwiera drzwi albo wyświetla Wrong, oraz ShowCode(), która pokazuje dotychczas wpisany kod. Podepnij przyciski w Start():
keysprzechowuje cztery przyciski cyfr w kolejności:keys[0]wpisuje 1,keys[1]wpisuje 2,keys[2]wpisuje 3, akeys[3]wpisuje 4. Podepnij je w pętlifor, używając dla każdego lambdy wywołującejPress.clearButton, za pomocą jednej lambdy, usuwa dotychczas wpisany kod (entered) i wyświetla go za pomocąShowCode().
Kod to 312. Naciśnij Play, otwórz skarbiec, a następnie naciśnij Check.
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();
// Przypisz każdemu klawiszowi wywołanie Press z odpowiadającą mu cyfrą, a clearButton — czyszczenie 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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski 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 banku