Menu
CoddyTech

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

Défi

Facile

Connecte le clavier du coffre-fort dans Start().

  1. Parcours keys avec for. Dans la boucle, déclare int digit = i + 1; et relie keys[i] à () => Press(digit).
  2. Relie clearButton à une seule expression lambda qui définit entered = "" et appelle ShowCode().

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

Entraînez-vous par vous-même : Playground Unity