Кнопки и onClick
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 6 из 56.
GameObject > UI > Button - TextMeshPro добавляет кнопку: изображение, по которому можно щёлкнуть, компонент Button и дочерний объект Text (TMP) для её надписи. onClick кнопки — это событие, список методов, которые оно вызывает, когда щелчок по кнопке отпускают. Скрипт добавляет собственный метод в этот список с помощью AddListener один раз, в Start(). Button находится в пространстве имён UnityEngine.UI:
using UnityEngine;
using UnityEngine.UI;
public class Doorbell : MonoBehaviour
{
public Button bellButton;
private int rings;
void Start()
{
bellButton.onClick.AddListener(Ring);
}
void Ring()
{
rings++;
Debug.Log("Ding! " + rings);
}
}AddListener(Ring) передаёт сам метод, без скобок. AddListener(Ring()) вызвал бы Ring сразу и передал бы то, что он возвращает, то есть ничего, поэтому такой код не компилируется: Argument 1: cannot convert from 'void' to 'UnityEngine.Events.UnityAction'. Обработчик события не принимает параметров и возвращает void. Если добавить его в Update(), тот же метод будет добавляться в список снова каждый кадр, и от одного щелчка звонок прозвучит сотни раз. Щелчок засчитывается, только если нажать на саму кнопку, тогда как Input.GetMouseButtonDown(0) возвращает true при щелчке где угодно.
Параметр interactable кнопки определяет, можно ли её использовать. bellButton.interactable = false; окрашивает её цветом Disabled Color, а её обработчики событий не вызываются, пока значение не будет снова установлено в true, поэтому игрок видит, какие кнопки работают сейчас. На телефоне по тем же кнопкам нажимают.
Задание
ЛегкоУ лифта в башне есть кнопки «Вверх» и «Вниз». Напиши Lift.cs (сцена связывает upButton, downButton и floorText):
- В
Start()привяжи кupButtonметод, который поднимает лифт на один этаж, а кdownButton— метод, который опускает его на один этаж. - Этажи идут от 0 до
topFloor(3). Лифт находится на высоте y = этаж ×floorHeight(3), поэтому на этаже 2 его y равен 6. Значения x и z остаются прежними. - С самого начала
floorTextотображает этаж в форматеFloor: 2. - На верхнем этаже кнопка «Вверх» недоступна для нажатия, а на этаже 0 недоступна кнопка «Вниз».
Нажми Play, поднимись на верхний этаж и вернись обратно, затем нажми Check.
Попробуйте сами
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Lift : MonoBehaviour
{
public Button upButton;
public Button downButton;
public TMP_Text floorText;
public int topFloor = 3;
public float floorHeight = 3f;
private int floor;
void Start()
{
// Привяжите upButton и downButton к методам, которые перемещают лифт на один этаж
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке