Lambdas
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 7 sur 60.
AddListener prend une méthode sans paramètres. Pour qu’un clic appelle Paint(Color.red), qui prend une couleur, écris la méthode directement sur place : () => Paint(Color.red). C’est une lambda, une méthode sans nom. () contient ses paramètres, ici aucun, et après => vient son corps : une instruction, ou un bloc entre { } pour en exécuter plusieurs :
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++;
}Une seule méthode Paint sert pour les deux boutons de couleur, chaque lambda passant sa propre couleur. Une lambda capture les variables qu’elle utilise : elle ne copie pas leurs valeurs, elle les lit lorsqu’elle s’exécute. La lambda de réinitialisation définit le champ changes à chaque clic, bien après la fin de Start().
C’est là que les choses se compliquent dans une boucle. Avec swatches[i].onClick.AddListener(() => Paint(colors[i]));, chaque lambda capture le même i et, au moment où quelqu’un clique, la boucle est terminée et i est égal à colors.Length : chaque échantillon déclenche IndexOutOfRangeException. Une variable déclarée à l’intérieur de la boucle est nouvelle à chaque itération ; copie donc i dans une variable et capture cette copie :
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}Défi
FacileConnecte le clavier du coffre-fort dans Start().
- Parcours
keysavecfor. Dans la boucle, déclareint digit = i + 1;et reliekeys[i]à() => Press(digit). - Relie
clearButtonà une seule expression lambda qui définitentered = ""et appelleShowCode().
Appuie sur « Jouer » et saisis 3, 1, 2 : l’écran affiche Open. Puis clique sur « Vérifier ».
Essayez vous-même
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();
// Associer chaque touche à Press avec son chiffre, et clearButton à l’effacement du code
}
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;
}
}
Toutes les leçons de Créer de vrais jeux
1Texte à l’écran
Canvas et texteAfficher le scoreFormater les nombresUn compte à reboursRécapitulatif : compteur de vitesse4Scènes et niveaux
Charger une scèneRedémarrer le niveauNiveau suivantConserver entre les scènesRécapitulatif : sélection du niveau2Boutons et écrans
Boutons et onClickLambdasRelier les éléments dans l’InspectorActiver et désactiver les panneauxBarres de santéRécapitulatif : boutique d’améliorations5Sauvegarder avec PlayerPrefs
Enregistrer un nombreCharger avec une valeur par défautMeilleur scoreEnregistrer les paramètresRécapitulatif : les pièces à la banqueEntraînez-vous par vous-même : Playground Unity