Геймдев за 7 дней. 5 День

05.05.2020
Posted in blog-article
05.05.2020 admin

Геймдев за 7 дней. 5 День

Пора заняться интерфейсом! День 5 курса Геймдева

Пользовательский интерфейс

Сегодня мы будем работать над пользовательским интерфейсом. Мы настроим счетчик очков и отображение игры на экране.

Счетчик очков

Объект GameMode должен считать количество обручей, через которые удалось пройти игроку, и вести счет. Также нужно добавить зону оценки, о которой мы упоминали при создании HoopObstacle. Её задача – отправлять сигналы GameMode в момент, когда игрок успешно проходит через нее.

Начнем с добавления в GameMode нового скрипта. Назовем его «GameRules», (Правила игры)

public class GameRules : MonoBehaviour {

int score = 0;

    public void IncreaseScore () {

score++;

Debug.Log(«Score: » + score);

}

.

В первую очередь зададим целочисленную переменную под именем Score и придадим ей нулевое значение. В начале игры у игрока на счёте должно быть ноль очков.

Теперь создадим ещё один метод — IncreaseScore. Это ключевое слово позволяет вызывать метод, расположенный вне его класса. Поскольку мы хотим, чтобы препятствия обрели возможность сообщать игре о необходимости увеличить счет, мы обучим их этому при помощи данного метода.

Понаблюдаем за происходящем внутри метода, чтобы лучше понять то, как он работает. В первой строке IncreaseScore используется оператор ++, который увеличивает значение счета на единицу. Вторая строка печатает текущий счет в консоли. Добавление обоих строчек со знаком + позволяет нам объединить текст «Оценка:» и значение переменной. В результате в игре должно появиться нечто вроде «Оценка: 12», что будет означать, что игрок сумел преодолеть 12 препятствий.

Но в данный момент у нас нет привязки метода к общей системе, поэтому отображение счёта в игре отсутствует. Давайте изменим это.

Вернитесь к Unity. Создайте еще один пустой GameObject и поместите его внутрь HoopObstacle. Переименуйте новый GameObject на ScoreZone. Найдите в верхнем правом углу компонента Transform маленький значок шестеренки и нажмите Reset внутри него. Так вы сможете проверить, что система обнуляется в соответствии с вашей командой.

Добавим 2D-компонент Box Collider внутрь объекта ScoreZone, чтобы создать триггер. Установите его размер равным X 0,5 и Y 4. Вы заметите, что данные параметры помогают ему плотно прилегать к прямоугольникам. Это важно, поскольку иначе игрок при прохождении сквозь препятствия может удариться о невидимую зону счёта.

Создадим скрипт, который при нажатии на триггер будет вызывать объект GameMode. Назовём новый скрипт ScoreUp.

public class ScoreUp : MonoBehaviour

    void OnTriggerEnter2D(Collider2D collisionInfo

{

FindObjectOfType<GameRules>().IncreaseScore

}

.

Теперь создадим метод с именем OnTriggerEnter2D. Он является специфичным для Unity, т.е. не используется при работе на других движках. Метод OnTriggerEnter2D активироваться каждый раз, когда что-то будет входить в триггер объекта. Обращаю ваше внимание, что переменная Collider2D внутри скобок является параметром. Несмотря на то, что мы никогда не используем данный параметр, Unity требует, чтобы переменная в любом случае находилась на своём месте. Удовлетворим запрос движка и добавим её.

Вы можете догадаться, за какое действие отвечает наша строка внутри метода. Если вы помните, когда мы создавали скрипт GameRules для GameMode, внутрь мы помещали метод IncreaseScore. Так вот, наша строка находит этот скрипт и активирует метод.

Теперь, когда что-то войдёт в зону оценки, счёт автоматически будет увеличен. Откройте Unity и протестируйте игру. Не забудьте открыть вкладку Консоль (Console), чтобы проверить, как выводится текст.

Просмотр счета в консоли не подойдёт для конечного пользователя, поэтому давайте создадим отображение счета на экране игры.

Текст оценки

Перейдите в меню GameObject, выберите в нём UI, а затем Text. Переименуйте новый объект в ScoreText и переместите его в объект Canvas на вкладке Hierarchy. Не забывайте: чтобы вывести на экран вкладку «Сцена», вы можете дважды щелкнуть «Холст» на вкладке «Иерархия». Также вы можете использовать колесико мыши для увеличения или уменьшения изображения, а правую кнопку мыши для захвата или перемещения по изображению.

Настройка пользовательского интерфейса может быть немного трудной, зато она является достаточно простой. К примеру, я хочу, чтобы текст располагался в центре верхней части экрана. Чтобы его было легко увидеть, я сделаю его белым и крупным. Разберемся, какие действия для этого нам потребуется выполнить.

Во-первых, давайте закрепим центр верхней части элемента и установим Pos X в 0. Pos Y должен быть отрицательным, потому что тексту предстоит находиться под верхней частью экрана. Я поставил -60.

Во-вторых, доработаем компонент Text (Script). Просто повторяйте мои действия.

1. Нажмите на цвет и измените его на белый.

2. Переключите выравнивание абзаца в центр.

3. Замените текст на «0», чтобы нам не нужно было инициализировать его в коде.

4. Измените стиль шрифта на жирный.

5. Увеличьте размер шрифта до 48.

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

Осталось подключить текст пользовательского интерфейса к нашему методу IncreaseScore. Для этого вернемся к сценарию GameRules. В верхней части блока класса для объекта ScoreText создадим новую переменную Text.

TextscoreText;

Поскольку текстовые переменные являются частью библиотеки пользовательского интерфейса Unity, система может нам выдать ошибку. Поэтому нам нужно заставить файл сценария использовать эту библиотеку, добавив последнюю строку здесь вверху файла.

usingSystem.Collections

usingSystem.Collections.Generic

usingUnityEngine

usingUnityEngine.UI

Мы должны инициализировать переменную. Сделаем это в методе Start. Внутри объекта ScoreText находится много различных компонентов. Нас интересует только компонент Text (Script). Поэтому мы должны укажем, что хотим получить только этот компонент.

void Start () {

scoreText = GameObject.Find(«ScoreText»).GetComponent<Text>

}

Теперь, когда у нас есть защищенный компонент Text объекта ScoreText, мы можем перейти к методу IncreaseScore. Изменим текстовое свойство компонента Text .

scoreText.text = score.ToString

В результате наших манипуляций мы запустим последовательное выполнение двух задач. Переменная ScoreText указывает на компонент Text (Script) объекта. Тот, в свою очередь, указывает на текстовое свойство или текстовое поле этого компонента. Мы присваиваем переменную оценки этому полю сразу после ее увеличения.

Как насчет ToString ()? Если вы помните, вчера я объяснил, что переменные могут содержать только данные того типа, к которому относятся сами. Переменная Score является целым числом. Свойство text является символьной строкой. (Совет: если в Visual Studio навести указатель мыши на свойство text, вы увидите его тип.) Они несовместимы. ToString () — это команда, которая превращает целое число в строку. Он делает совместимыми две наши переменные, поскольку даёт возможность назначить одну переменную другой.

Запустите игру и проверьте, всё ли работает так, как мы задумали. Если вы всё сделали правильно, то счёт в верхней части экрана будет увеличиваться каждый раз, как вам удастся пройти через очередную пару препятствий.

Игра окончена

Пришла пора подумать о том, что увидит игрок, когда он врежется в препятствие и игра завершится.

Создадим еще один текстовый объект и поместим его в Иерархии внутрь объекта Canvas. Назовите его GameOverText. Придайте надписи угрожающий вид и поместите её на середину экрана. Не беспокойтесь о том, что она появится раньше времени. Во время игры она будет прятаться в скрипте.

Создайте для игрока новый скрипт. Назовем его PlayerCollision. Внутри скрипта создайте метод OnCollisionEnter2D

void OnCollisionEnter2D(Collision2D collisionInfo

{

FindObjectOfType<GameRules>().EndGame

}

Внутри него мы настроим активацию метода EndGame, расположенный в скрипте GameRules. Не спешите, его пока не существует! Но мы скоро его создадим.

Зайдите в скрипт GameRules. Создайте в нём новую переменную типа GameObject и назовите её gameOverText.

Теперь в методе Start возьмем игровой объект GameOverText, поместим его в переменную, которую мы определили, и установим значение false для его активного состояния. Так он обретет в сцене невидимость.

gameOverText = GameObject.Find(«GameOverText

gameOverText.SetActivefalse);

Пора заняться созданием метода EndGame. Я хочу, чтобы вы сделали его общедоступным. Это позволит нам вызывать его из сценария PlayerCollision.

public void EndGame

Destroy(GameObject.Find(«PlayerCircle

gameOverText.SetActive(true

}

Что происходит внутри?

Первая строка отвечает за захват объекта PlayerCircle изнутри игры и его уничтожение. Это гарантирует, что игрок не сможет продолжить игру и набирать дальше очки.

Вторая строка активирует GameOverText – ту страшную надпись, которую мы создали в начале дня.

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

Вот и все, наш 5 -й день подошёл к концу!

Поздравляю, мы справились с большим количеством задач.

Завтра мы начнем работать над игровой графикой.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Contact

Давайте работать вместе!

Пишите нам и найдем точки соприкосновения, может станем партнерами, а может поможем вам зайти в нашу чудесную нишу

Вы разработчик?

Пишите! Нам постоянно нужны новые кадры, либо можем помочь в продвижении вашего приложения

Новичок?

Поможем быстро войти в нишу, не тратя годы на понимание

Давно в нише?

Рады будем пообщаться как на темы whitehat, так и blackhat тематики ^_^ + всегда есть что обсудить по поводу рекламных сетей

ПИШИ В TELEGRAM!

Contact