Menu
CoddyTech

Lambda

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 7 di 56.

AddListener accetta un metodo senza parametri. Per fare in modo che un clic chiami Paint(Color.red), che accetta un colore, scrivi il metodo direttamente sul posto: () => Paint(Color.red). Questa è una lambda, un metodo senza nome. () contiene i suoi parametri, nessuno in questo caso, e dopo => viene il suo corpo: un’istruzione oppure un blocco in { } per più istruzioni:

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++;
}

Un solo metodo Paint serve entrambi i pulsanti dei colori, e ciascuna lambda passa il proprio colore. Una lambda acquisisce le variabili che usa: non ne copia i valori, li legge quando viene eseguita. La lambda di ripristino imposta il campo changes ogni volta che viene cliccata, molto tempo dopo la fine di Start().

Questo può coglierti in un ciclo. Con swatches[i].onClick.AddListener(() => Paint(colors[i])); tutte le lambda acquisiscono lo stesso i e, quando qualcuno fa clic, il ciclo è già terminato con i uguale a colors.Length: ogni campione genera un’eccezione IndexOutOfRangeException. Una variabile dichiarata all’interno del ciclo è nuova a ogni iterazione, quindi copia i in una variabile e acquisisci la copia:

for (int i = 0; i < swatches.Length; i++)
{
    int index = i;
    swatches[i].onClick.AddListener(() => Paint(colors[index]));
}
challenge icon

Sfida

Facile

Il caveau si apre con un codice di tre cifre. Keypad.cs ha già Press(int digit), che aggiunge una cifra al codice sullo schermo e, dopo tre cifre, apre la porta oppure mostra Wrong, e ShowCode(), che mostra ciò che è stato digitato finora. Collega i pulsanti in Start():

  • keys contiene i quattro pulsanti delle cifre in ordine: keys[0] digita 1, keys[1] digita 2, keys[2] digita 3 e keys[3] digita 4. Collegali in un ciclo for, ciascuno con una lambda che chiama Press.
  • clearButton, con una lambda, svuota il codice digitato finora (entered) e lo mostra con ShowCode().

Il codice è 312. Premi Play, apri il caveau, poi premi Check.

Provalo tu

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();
        // Collega ogni tasto a Press con la rispettiva cifra e clearButton alla cancellazione del codice
    }

    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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi