Menu
CoddyTech

Лямбды

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

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

Задание

Легко

Подключи клавиатуру сейфа в Start().

  1. Перебери keys с помощью for. В цикле объяви int digit = i + 1; и подключи keys[i] к () => Press(digit).
  2. Подключи clearButton к одной лямбда-функции, которая задаёт entered = "" и вызывает ShowCode().

Нажми «Играть» и введи 3, 1, 2: на экране появится Open. Затем нажми «Проверить».

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

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

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

Потренируйтесь самостоятельно: Песочница Unity