Menu
CoddyTech

Lambdas

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 7 de 56.

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

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 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 seus valores; 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 pegar você em um loop. Com swatches[i].onClick.AddListener(() => Paint(colors[i]));, todas as lambdas capturam o mesmo i e, quando alguém clica, o loop já terminou com i igual a colors.Length: cada amostra de cor gera 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 essa 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

O cofre abre com um código de três dígitos. Keypad.cs já tem Press(int digit), que adiciona um dígito ao código na tela e, após três dígitos, abre a porta ou mostra Wrong, e ShowCode(), que mostra o que foi digitado até o momento. Conecte os botões em Start():

  • keys contém os quatro botões de dígitos em ordem: keys[0] digita 1, keys[1] digita 2, keys[2] digita 3 e keys[3] digita 4. Conecte-os em um loop for, cada um com uma expressão lambda que chama Press.
  • clearButton, com uma expressão lambda, limpa o código digitado até o momento (entered) e o mostra com ShowCode().

O código é 312. Pressione Play, abra o cofre e, em seguida, Check.

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 à função de limpar o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade