Menu
CoddyTech

Lambda

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

AddListener accetta un metodo senza parametri. Per fare in modo che un clic chiami Paint(Color.red), che accetta un colore, scrivi il metodo sul momento: () => Paint(Color.red). Questa è una lambda, un metodo senza nome. () contiene i parametri, qui nessuno, e dopo => viene il corpo: un'istruzione oppure un blocco tra { } se sono più di una:

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, ciascuna lambda passa il proprio colore. Una lambda cattura le variabili che usa: non ne copia i valori, li legge quando viene eseguita. La lambda di ripristino imposta il campo changes a ogni clic, molto tempo dopo che Start() è terminato.

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

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

Sfida

Facile

Collega il tastierino della cassaforte in Start().

  1. Scorri keys con for. Nel ciclo, dichiara int digit = i + 1; e collega keys[i] a () => Press(digit).
  2. Collega clearButton a un'unica lambda che imposta entered = "" e chiama ShowCode().

Premi «Gioca» e digita 3, 1, 2: sullo schermo appare Open. Poi premi «Verifica».

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 cifra corrispondente 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;
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity