Menu
CoddyTech

Lambdas

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

AddListener recibe un método sin parámetros. Para 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; aquí no hay ninguno, y después de => viene su cuerpo: una instrucción o un bloque entre { } si hay 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; cada lambda pasa su propio color. Una lambda captura las variables que usa: no copia sus valores, los lee cuando se ejecuta. La lambda de restablecimiento asigna un valor al campo changes cada vez que se hace clic en ella, 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 cuando alguien haga clic, el bucle ya habrá terminado con i igual a colors.Length: todos los colores lanzarán IndexOutOfRangeException. Una variable declarada dentro del bucle es una nueva variable en cada iteración, así que copia i en una variable 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

Conecta el teclado numérico de la bóveda en Start().

  1. Recorre keys con for. En el bucle, declara int digit = i + 1; y conecta keys[i] a () => Press(digit).
  2. Conecta clearButton a una lambda que establece entered = "" y llama a ShowCode().

Pulsa «Jugar» e introduce 3, 1, 2: la pantalla muestra Open. 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();
        // Asocia cada tecla a Press con su dígito, y clearButton a la acción de borrar 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;
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity