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]));
}Desafio
FácilO 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():
keyscontém os quatro botões de dígitos em ordem:keys[0]digita 1,keys[1]digita 2,keys[2]digita 3 ekeys[3]digita 4. Conecte-os em um loopfor, cada um com uma expressão lambda que chamaPress.clearButton, com uma expressão lambda, limpa o código digitado até o momento (entered) e o mostra comShowCode().
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;
}
}
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botõ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 banco