Lambda
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 7 di 60.
AddListener accetta un metodo senza parametri. Per fare in modo che un clic chiami Paint(Color.red), che accetta un colore, scrivi il metodo sul momento: () => Paint(Color.red). Questa è una lambda, un metodo senza nome. () contiene i parametri, qui nessuno, e dopo => viene il corpo: un'istruzione oppure un blocco tra { } se sono più di una:
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 solo metodo Paint serve entrambi i pulsanti dei colori, ciascuna lambda passa il proprio colore. Una lambda cattura le variabili che usa: non ne copia i valori, li legge quando viene eseguita. La lambda di ripristino imposta il campo changes a ogni clic, molto tempo dopo che Start() è terminato.
Questo può coglierti in un ciclo. Con swatches[i].onClick.AddListener(() => Paint(colors[i])); tutte le lambda catturano lo stesso i e, quando qualcuno fa clic, il ciclo è terminato con i uguale a colors.Length: ogni campione genera IndexOutOfRangeException. Una variabile dichiarata all'interno del ciclo è una nuova variabile a ogni iterazione, quindi copia i in una variabile e cattura la copia:
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}Sfida
FacileCollega il tastierino della cassaforte in Start().
- Scorri
keysconfor. Nel ciclo, dichiaraint digit = i + 1;e collegakeys[i]a() => Press(digit). - Collega
clearButtona un'unica lambda che impostaentered = ""e chiamaShowCode().
Premi «Gioca» e digita 3, 1, 2: sullo schermo appare Open. Poi premi «Verifica».
Provalo tu
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();
// Collega ogni tasto a Press con la cifra corrispondente e clearButton alla cancellazione del codice
}
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;
}
}
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity