Menu
CoddyTech

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

Wyzwanie

Łatwy

Podłącz klawiaturę sejfu w Start().

  1. Przejdź pętlą for po elementach keys. W pętli zadeklaruj int digit = i + 1; i podłącz keys[i] do () => Press(digit).
  2. Podłącz clearButton do jednej lambdy, która ustawia entered = "" i wywołuje ShowCode().

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

Poćwicz samodzielnie: Edytor online Unity