Menu
CoddyTech

Lambdas

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 7 de 60.

AddListener recebe um método sem parâmetros. Para fazer um clique chamar Paint(Color.red), que recebe uma cor, escreva o método na hora: () => Paint(Color.red). Isso é uma lambda, um método sem nome. () contém seus parâmetros — nenhum, neste caso — e, depois de =>, vem o corpo: uma instrução ou um bloco em { } para várias instruções:

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

Um único método Paint atende aos dois botões de cor, e cada lambda passa sua própria cor. Uma lambda captura as variáveis que usa: ela não copia os valores delas; lê esses valores quando é executada. A lambda de redefinição define o campo changes a cada clique, muito depois de Start() ter terminado.

Isso pode te pegar em um loop. Com swatches[i].onClick.AddListener(() => Paint(colors[i]));, todas as lambdas capturam o mesmo i e, quando alguém clicar, o loop já terá terminado com i igual a colors.Length: cada amostra de cor lança IndexOutOfRangeException. Uma variável declarada dentro do loop é uma nova variável a cada iteração, então copie i para uma variável e capture a cópia:

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

Desafio

Fácil

Conecte o teclado numérico do cofre em Start().

  1. Percorra keys com for. No loop, declare int digit = i + 1; e conecte keys[i] a () => Press(digit).
  2. Conecte clearButton a uma única lambda que define entered = "" e chama ShowCode().

Pressione “Jogar” e digite 3, 1, 2: a tela mostra Open. Depois, pressione “Verificar”.

Experimente você mesmo

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();
        // Vincule cada tecla a Press com seu dígito e clearButton à limpeza do 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 as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity