35

(ну когда же мы уже до)Делаем Тунца - четыре

Начало - здесь: http://pikabu.ru/story/delaem_tuntsa__tri_4521249

Сегодня мы сделаем отображение жизни, очков и изменение этих величин в зависимости от того, встретит наш тюлень врагов или еду. Начнем с отображения и потом добавим изменение. Короче говоря, делаем HUD.

Для начала создадим на сцене объект типа Canvas и назовем его HUDCanvas, например:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Создадим в нем дочерний объект типа Slider:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Расположим наш слайдер, который будет отображать жизнь, в самом низу экрана, для этого у него в Transform выберем соответствующий Anchor Presets:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

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

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

А вот Handle Slide Area нам вообще не нужно, мы же не хотим, чтобы игрок мог добавить себе жизни простым перемещением ползунка. Так что просто удалим его. И посмотрим, что еще можно настроить в нашем Slider, а настроить можно максимальное и стартовое значение:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Так же стоит убрать крыжик Interactable, чтобы игрок действительно не мог изменять собственноручно количество жизни. И настроить цвет. Например, подкрутим альфа-канал и сделаем наш слайдер полупрозрачным, так на мой взгляд красивее. Уменьшите значение A у цветов Normal Color в Slider и Color в Slide-Fill Area-Fill до такого, чтобы вам нравился уровень прозрачности у заполненной и пустой полоски:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

А теперь что-то новенькое: создадим новый пустой объект на сцене, назовем его GameManager и добавим в него один единственный компонент - новый скрипт, который так же назовем GameManager:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Добавим в этот скрипт следующий код:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Мы используем instance вместо static-класса. В Awake() нет DontDestroyOnLoad() по той простой причине, что у нас одна сцена и она не будет перезагружаться. Если вы будете использовать много сцен и хотите, чтобы GameManager оставался единым для всех сцен - используйте DontDestroyOnLoad () в Awake() для этого

Так, а про score то мы забыли, ну не беда, вернемся к нашему HUDCanvas и добавим в него дочерний объект типа Panel:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Назовем нашу панель ScorePanel и добавим и ей дочерний объект, но уже типа Text:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Назовем его просто Score, настроим его расположение так, чтобы он был в правом верхнем углу экрана:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Чтобы наша панель не окрашивала все белым цветом, сделаем ее полностью прозрачной:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

А теперь пора добавить кое-что в наш скрипт GameManager:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Мы добавили public-переменные timeSlider и scoreText, а так же score. В методе Awake() добавили обнаружение соответствующих объектов на сцене и связали их с нашими переменными. А в Update() добавили постепенное изменение количества жизни и отображение текущего количества очков.

Теперь пришло время сделать так, чтобы тюлень реагировал на столкновение с едой - пополнял количество жизней и увеличивал счет, а так же с врагами - уменьшал количество жизней. Для этого мы пойдем в папку Prefabs, где у нас лежат заготовки для тюленя, медузы и тунца и, встав на одну из заготовок, откроем меню Tag и выберем создание нового тэга:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Создадим сразу парочку тэгов - Food и Animal:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

После этого снова идем в Prefabs и раздаем теги - тунцу Food, медузе Animal, ну и заодно дадим тюленю тэг Player, пусть будет:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Теперь пора добавить парочку методов в наш скрипт SealController, который прикреплен у нас к тунцу. Вот такие методы добавим в конце скрипта:

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

И еще, добавим-ка нашему тюленю PolygonCollider2D и выставим у него isTrigger в true. Это нужно, чтобы все тельце тунца реагировало на столкновения с другими объектами (до сих пор у нас был только Circle Collider, нужный нам для ныряния и подъема на поверхность воды):

(ну когда же мы уже до)Делаем Тунца - четыре Unity3d, Android, Windows Phone, Gamedev, Игры, Tutor, Длиннопост

Вот теперь всё будет прекрасно работать. Когда тюленю будет попадаться тунец - жизни становится больше, очков тоже, а когда медуза - жизней стремительно становится меньше. Это уже похоже на игру! Однако, наверняка вы заметите, что очки как-то не правильно отображаются, пока их 0 - всё нормально, как только их становится больше - количество их куда-то исчезает. Что же, идите в объект Text, который мы назвали Score и смотрите, что там не так с расположением или размером этого объекта, настраивайте. Нужно же хоть что-то сделать самостоятельно. :)

В этот раз мне удалось сделать перерыв не в 7, а в 6 дней! Успех? Не очень, конечно. Однако, несмотря на занятость и лень, я постараюсь сделать продолжение через 5 дней. А может и раньше, но не обещаю. Впереди у нас такие интересные задачи как: гамовер и стартовое меню, звуки и анимация. Потерпите, осталось не так уж и много.

И я по прежнему рад любой критике от тех, кто лучше меня знает Unity3D и C# - пишите, ругайте, всё мотаю на ус, мне самому эти типа-уроки будут не менее полезны, чем тем, кто просил написать, как сделать такую простенькую игру, "вот я установил юнити - с чего начать" и так далее.

Найдены дубликаты

+1

У вас там баянометр, наверное, ругается все время на картинки ))))

раскрыть ветку 1
0

О, еще как, почти 100% совпадение порой находит. Наверное, надо для разнообразия какую-нибудь внезапную картинку вставить. :)

+1

Ну и сразу от программиста - "магические" числа в коде всегда лучше выносить в константы, либо даже паблик поля класса (в случае с unity), для того чтобы легко и из одного места их можно было изменить.

Например вместо score += 100, лучше добавить константное поле в начале тела класса с осмысленным названием:
private const FOOD_EATING_SCORE = 100;
и использовать её как score += FOOD_EATING_SCORE;

раскрыть ветку 5
+1

Не надо ничего выносить в паблик. Все делаем по умолчанию private. Если нужно менять из инспектора - [SerializeField] и все будет хорошо. Увеличивать область видимости только в случае необходимости. А то потом смотришь чужие скрипты, а там куча внутрянки тебе пабликом светится.

раскрыть ветку 3
0

Искренне думал что для того чтобы менять что-либо в инспекторе обязательно делать public поле. Ещё и удивлялся как это криво. Спасибо что открыли мне глаза.
Совет давал со стороны c#, а не unity.

раскрыть ветку 1
0

Спасибо. Три проекта подряд не мог себя заставить действительно навести порядок в уровнях доступа и вот благодаря вашему замечанию, в нынешнем, четвертом, прямо сейчас взял да и исправил всё, пока скриптов там всего ничего. И ладно public vs [SerializeField], такие переменные я использую в основном для настройки разных префабов с одинаковыми скриптами, а поскольку делаю игрульки я один, то принципиальной разницы нет. Куда важнее использовать таки поле с get без set когда нужно только читать, но не писать в другой класс. В общем, спасибо еще раз, тот самый пендель получил, который был нужен.

0

Спасибо, но эти числа там временно, они будут заменены в дальнейших уроках, планово. :)

0
Чтож все так любят моно, почему не студия!?) А за пост плюсик:)
раскрыть ветку 3
0

:) Исторически сложилось, как-то с самого начала знакомства с Unity использовал Mono и быстро привык к нему, VS с Unity использую только чтобы собрать проект для Windows Phone, ну и немного для интеграции рекламы приходится кода дописать в VS.

раскрыть ветку 2
0
Ну, сейчас то интеграция студии и юньки на высоком уровне, грех не пользоваться IDE с таким функционалом:) Но, на вкус и цвет все фломастеры разные)
раскрыть ветку 1
Похожие посты
Возможно, вас заинтересуют другие посты по тегам: