Menu
CoddyTech

Лямбды

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 7 из 56.

AddListener принимает метод без параметров. Чтобы при щелчке вызывался Paint(Color.red), которому нужен цвет, запиши метод на месте: () => Paint(Color.red). Это лямбда — метод без имени. В () указываются его параметры; здесь их нет. После => идет его тело: одна инструкция или блок в { }, если инструкций несколько:

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++;
}

Один метод Paint обслуживает обе цветные кнопки, а каждая лямбда передает свой цвет. Лямбда захватывает используемые ею переменные: она не копирует их значения, а считывает их при выполнении. Лямбда сброса устанавливает поле changes при каждом щелчке, даже если с момента завершения Start() прошло много времени.

Здесь легко попасться на цикле. В конструкции swatches[i].onClick.AddListener(() => Paint(colors[i])); каждая лямбда захватывает одну и ту же переменную i, и к тому времени, когда кто-нибудь щелкнет по кнопке, цикл завершится, а значение i будет равно colors.Length: каждый образец цвета вызовет IndexOutOfRangeException. Переменная, объявленная внутри цикла, при каждом проходе создается заново, поэтому скопируй в нее i и захвати эту копию:

for (int i = 0; i < swatches.Length; i++)
{
    int index = i;
    swatches[i].onClick.AddListener(() => Paint(colors[index]));
}
challenge icon

Задание

Легко

Хранилище открывается трёхзначным кодом. В Keypad.cs уже есть Press(int digit), которая добавляет цифру к коду на экране и после ввода трёх цифр открывает дверь или показывает Wrong, и ShowCode(), которая показывает уже введённые цифры. Подключи кнопки в Start():

  • В keys хранятся четыре кнопки с цифрами по порядку: keys[0] вводит 1, keys[1] вводит 2, keys[2] вводит 3, а keys[3] вводит 4. Подключи их в цикле for, используя для каждой лямбда-функцию, которая вызывает Press.
  • clearButton — с помощью одной лямбда-функции очисти уже введённый код (entered) и отобрази его с помощью ShowCode().

Код — 312. Нажми Play, открой хранилище, затем нажми Check.

Попробуйте сами

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();
        // Привяжите каждую клавишу к Press с соответствующей цифрой, а clearButton — к очистке кода
    }

    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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр