Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unity_в_действии_Джозеф_Хокинг_Рус.pdf
Скачиваний:
83
Добавлен:
21.06.2022
Размер:
26.33 Mб
Скачать

120      Глава 5. Игра Memory на основе новой 2D-функциональности

Впрочем, важный параметр Projection в редактировании не нуждается, чего не скажешь о прочих настройках камеры. Обратите внимание на параметр Size; он определяет размер поля зрения камеры от центра экрана до его верхнего края. Другими словами, этому параметру присваивается значение, равное половине желаемого размера экрана в пикселах. Если позднее вы укажете такое же разрешение для развертываемой игры, вы получите графику пиксел в пиксел.

ОПРЕДЕЛЕНИЕ  Пиксел в пиксел (pixel-perfect) означает, что один экранный пиксел соответствует одному пикселу изображения (в противном случае видеокарта может сделать изображение слегка размытым, растянув его под размер экрана).

Предположим, что вы хотите попасть пиксел в пиксел при разрешении экрана 1024 × 768. Значит, высота камеры должна составить 384 пиксела. Поделите это число на 100 (с учетом соотношения пикселов и единиц измерения), и вы получите размер камеры, равный 3.84. То есть вычисления ведутся по формуле РАЗМЕР ЭКРАНА / 2 /100f (f указывает на значение типа float, а не типа int). Так как наше фоновое изображение имеет размер 1024 × 768 (для проверки выделите этот ресурс), очевидно, что значение 3.84 идеально подходит для нашей камеры.

Еще два параметра, которые нужно поменять на панели Inspector, — это фоновый цвет камеры и ее положение по координате Z. Как уже упоминалось при рассмотрении спрайтов, чем больше значение координаты Z, тем дальше расположен объект. Поэтому отодвинем камеру подальше в область отрицательных значений Z; например, 0, 0, –100. В качестве фонового цвета, наверное, лучше всего выбрать черный; по умолчанию фон имеет синий цвет, и если экран окажется шире фонового изображения (что вполне вероятно), синие полоски по сторонам будут выглядеть странно. Щелкните на образце цвета Background и выберите черный цвет.

Сохраните сцену под именем Scene и щелкните на кнопке Play — вы увидите игровое поле, заполненное спрайтом, изображающим поверхность стола. Думаю, вы согласитесь, что путь до этой точки был не совсем очевидным (еще раз напомню, что причиной этого является трехмерный игровой движок Unity, в который только недавно добавили возможность работы с двухмерной графикой). Итак, у нас есть пустая поверхность стола, теперь нужно выложить на нее карты.

5.2. Создание карт и превращение их в интерактивные объекты

Так как все изображения уже импортированы и готовы к использованию, давайте создадим объекты, представляющие карты, которые сформируют ядро нашей игры. В игре Memory карты выкладываются лицевой стороной вниз и переворачиваются только на время после выбора пары карт. Для реализации такой функциональности мы создадим объекты, состоящие из положенных друг на друга спрайтов. Затем мы напишем код, который заставит карты переворачиваться по щелчку мыши.

5.2.Создание карт и превращение их в интерактивные объекты      121

5.2.1.Создание объекта из спрайтов

Перетащите в сцену одну из карт. Используйте изображение лицевой стороны, так как мы добавим поверх другую карту, чтобы скрыть рисунок. С технической точки зрения положение карты пока не имеет значения, но в конечном счете она должна будет оказаться в определенной точке, поэтому присвойте полям Position значения –3, 1, 0. Затем перетащите в сцену спрайт card_back. Сделайте этот новый спрайт потомком предыдущего (напоминаю, что для этого на вкладке Hierarchy нужно перетащить дочерний объект на родительский) и установите для него положение 0, 0, –0.1. Помните, что это положение относительно предка, то есть данные координаты означают «Поместите рубашку карты в точку с теми же координатами X и Y, но ее чуть ближе по координате Z».

СОВЕТ  Вместо инструментов Move, Rotate и Scale, которыми мы пользовались в режиме 3D, теперь нам доступен единый инструмент манипуляции Rect Tool. В режиме 2D этот инструмент активируется автоматически. Кроме того, вы можете нажать крайнюю правую кнопку на навигационной панели, расположенной в верхнем левом углу Unity. Когда этот инструмент активен, перетаскивание объектов приводит к выполнению всех трех операций (перемещения/поворота/масштабирования) в двух измерениях.

Поместив рубашку карты на место, как показано на рис. 5.6, вы подготовили все для создания интерактивного объекта, реагирующего на щелчок мыши.

Р а а а а а а

О а а а•а •

• а а

(П , а

)

Рис. 5.6. Иерархическое связывание и расположение спрайта с рубашкой карты

5.2.2. Код ввода с помощью мыши

Чтобы карта могла реагировать на щелчки мыши, ей требуется такой компонент, как коллайдер. У новых спрайтов он отсутствует, поэтому щелкать на них бесполезно. Мы присоединим коллайдер к корневому объекту, а не к рубашке карты, поэтому именно лицевая сторона будет восприимчива к щелчкам. Для этого выделите корневой объект на вкладке Hierarchy (не имеет смысла щелкать на карте в сцене, так как сверху находится рубашка, и именно она будет выделена), а затем щелкните на кнопке Add Component в нижней части панели Inspector. Выделите строку Physics 2D (строка Physics относится к физике трехмерных игр) и выберите вариант Box collider.

Кроме коллайдера карте нужен сценарий, который заставит ее реагировать на действия игрока, поэтому давайте напишем его код. Создайте новый сценарий с именем MemoryCard.cs и присоедините его к корневой карте (а не к рубашке). Код

122      Глава 5. Игра Memory на основе новой 2D-функциональности

в следующем листинге заставляет карту после щелчка на ней сгенерировать отладочное сообщение.

Листинг 5.1. Генерация отладочных сообщений по щелчку

using UnityEngine;

using System.Collections;

public class MemoryCard : MonoBehaviour {

public void OnMouseDown() { ¬ Эта функция вызывается после щелчка на объекте. Debug.Log("testing 1 2 3"); ¬ Пока мы только генерируем текстовое сообщение, выводимое на консоль.

}

}

СОВЕТ  Если вы еще не приобрели такой привычки, приучайте себя распределять ресурсы по папкам; создайте отдельную папку для сценариев и перетащите все сценарии туда непосредственно на вкладке Project. Главное — избегать имен, на которые реагирует Unity: Resources, Plugins, Editor и Gizmos. Позднее мы поговорим о том, какую функцию выполняют эти папки, а пока просто избегайте называть свои собственные папки перечисленными именами.

Итак, теперь мы можем щелкнуть на карте! Подобно методу Update(), функция OnMouseDown() также происходит от класса MonoBehaviour, именно она вызывает реакцию на щелчок мыши. Запустите игру и посмотрите, как на консоли появляется сообщение. Но вывод на консоль был сделан только с целью тестирования, мы же хотим открыть карту.

5.2.3. Открытие карты по щелчку

Перепишите код в соответствии со следующим листингом (пока запустить этот код не получится, но это не повод для беспокойства).

Листинг 5.2. Сценарий, скрывающий рубашку после щелчка на карте

using UnityEngine;

using System.Collections;

public class MemoryCard : MonoBehaviour {

[SerializeField] private GameObject cardBack; ¬ Переменная, которая появляется на панели Inspector.

public void OnMouseDown() {

 

Просто запускаем код деактивации, если объект

if (cardBack.activeSelf) {

¬

в данный момент является активным/видимым.

cardBack.SetActive(false); ¬ Делаем объект неактивным/невидимым.

}

}

}

В этом сценарии есть два ключевых дополнения: ссылка на объект в сцене и метод SetActive(), деактивирующий данный объект. Первая часть, то есть ссылка на объект, аналогична тому, что мы делали в предыдущих главах: переменная помечается как сериализованная, а затем объект с вкладки Hierarchy перетаскивается на эту переменную на панели Inspector. После того как ссылка на объект установлена, код начинает влиять на объект сцены.

Вторым ключевым дополнением является команда SetActive. Она деактивирует любой объект GameObject, делая его невидимым. Если теперь перетащить