Лямбды
Часть раздела Создание настоящих игр путешествия по 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]));
}Задание
ЛегкоПодключи клавиатуру сейфа в Start().
- Перебери
keysс помощьюfor. В цикле объявиint digit = i + 1;и подключиkeys[i]к() => Press(digit). - Подключи
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;
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity