Menu
CoddyTech

Lambdas

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 7 de 56.

AddListener acepta un método sin parámetros. Para hacer que un clic llame a Paint(Color.red), que recibe un color, escribe el método en el momento: () => Paint(Color.red). Eso es una lambda, un método sin nombre. () contiene sus parámetros, ninguno en este caso, y después de => viene su cuerpo: una instrucción o un bloque en { } para varias:

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 método Paint sirve para ambos botones de color, y cada lambda pasa su propio color. Una lambda captura las variables que usa: no copia sus valores, sino que los lee cuando se ejecuta. La lambda de restablecimiento asigna un valor al campo changes cada vez que se hace clic en él, mucho después de que Start() haya terminado.

Eso puede atraparte en un bucle. Con swatches[i].onClick.AddListener(() => Paint(colors[i]));, todas las lambdas capturan el mismo i, y para cuando alguien hace clic, el bucle ya habrá terminado con i igual a colors.Length: cada muestra produce una excepción IndexOutOfRangeException. Una variable declarada dentro del bucle es una nueva variable en cada iteración, así que copia i en una y captura la copia:

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

Desafío

Fácil

La cámara acorazada se abre con un código de tres dígitos. Keypad.cs ya tiene Press(int digit), que añade un dígito al código en pantalla y, después de tres dígitos, abre la puerta o muestra Wrong, y ShowCode(), que muestra lo que se ha escrito hasta el momento. Conecta los botones en Start():

  • keys contiene los cuatro botones de dígitos en orden: keys[0] escribe 1, keys[1] escribe 2, keys[2] escribe 3 y keys[3] escribe 4. Conéctalos en un bucle for, cada uno con una lambda que llame a Press.
  • clearButton, con una lambda, borra el código escrito hasta el momento (entered) y lo muestra con ShowCode().

El código es 312. Pulsa Jugar, abre la cámara acorazada y, después, pulsa Comprobar.

Pruébalo tú mismo

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();
        // Conecta cada tecla a Press con su dígito, y clearButton a la función que borra el código
    }

    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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales