Menu
CoddyTech

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]));
}
challenge icon

Défi

Facile

Le 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() :

  • keys contient les quatre boutons numériques dans l’ordre : keys[0] saisit 1, keys[1] saisit 2, keys[2] saisit 3 et keys[3] saisit 4. Connecte-les dans une boucle for, chacun avec une lambda qui appelle Press.
  • clearButton, avec une lambda, efface le code saisi jusqu’ici (entered) et l’affiche avec ShowCode().

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;
    }
}
quiz iconTestez-vous

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