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]));
}Desafio
FácilConecte o teclado numérico do cofre em Start().
- Percorra
keyscomfor. No loop, declareint digit = i + 1;e conectekeys[i]a() => Press(digit). - Conecte
clearButtona uma única lambda que defineentered = ""e chamaShowCode().
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no bancoPratique por conta própria: Playground de Unity