Menu
CoddyTech

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]));
}
challenge icon

Wyzwanie

Łatwy

Skarbiec 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():

  • keys przechowuje cztery przyciski cyfr w kolejności: keys[0] wpisuje 1, keys[1] wpisuje 2, keys[2] wpisuje 3, a keys[3] wpisuje 4. Podepnij je w pętli for, używając dla każdego lambdy wywołującej Press.
  • 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;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier