Лямбды
Часть раздела Создание настоящих игр путешествия по 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]));
}Задание
ЛегкоХранилище открывается трёхзначным кодом. В 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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке