Lambdas
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 7 sur 56.
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. Les () contiennent ses paramètres — aucun ici — et après => vient son corps : une instruction ou un bloc dans { } pour plusieurs instructions :
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 aux deux boutons de couleur, chaque lambda transmettant 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 boucles peuvent vous piéger. 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 une exception IndexOutOfRangeException. Une variable déclarée à l’intérieur de la boucle est nouvelle à chaque itération ; copiez donc i dans une autre variable et capturez cette copie :
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}Défi
FacileLe coffre-fort s’ouvre avec un code à trois chiffres. Keypad.cs contient déjà Press(int digit), qui ajoute un chiffre au code affiché à l’écran et, après trois chiffres, ouvre la porte ou affiche Wrong, ainsi que ShowCode(), qui affiche ce qui a été saisi jusqu’ici. Connecte les boutons dans Start() :
keyscontient les quatre boutons numériques dans l’ordre :keys[0]saisit 1,keys[1]saisit 2,keys[2]saisit 3 etkeys[3]saisit 4. Connecte-les dans une bouclefor, chacun avec une lambda qui appellePress.clearButton, avec une lambda, efface le code saisi jusqu’ici (entered) et l’affiche avecShowCode().
Le code est 312. Appuie sur Play, ouvre le coffre-fort, puis clique sur Check.
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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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 niveau7Contrôle du temps
Mettre en pause avec timeScaleRalentiTemps non mis à l’échelleRécapitulatif : Bullet Time10Projet : jeu de plateforme en 3D
Le parcoursPlateformes mobiles2Boutons 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 banque