Делаем Тунца - пять!
Начало: http://pikabu.ru/story/nu_kogda_zhe_myi_uzhe_dodelaem_tuntsa...
Ну что же, продолжим. Сегодня мы будем делать анимашки. Это очень-очень просто (потому что в этой игре анимация очень простая).
Итак, для начала нам нужно нарисовать все кадры для анимации тюленя и импортировать эти кадры в наш проект.
И тунец у нас тоже будет анимирован.
И более того, другие персонажи тоже будут анимированы, а еще мы создадим сегодня друга нашему тюленю - дельфина. И у него тоже масса спрайтов, потому как он будет плыть, помахивая хвостиком, а при встрече с тюленем - весело переворачиваться. Так они будут играть, за что будут начисляться очки и увеличиваться жизнь у тюленя.
Ну вот наимпортировали достаточно. Теперь будем собственно делать анимацию. Создать анимашку можно, например, так: берем спрайты, которые будут в ней использоваться и бросаем их на анимируемый объект в сцене.
Затем переходим во вкладку Animation, выбрав наш объект и видим, что у него уже есть анимация и она имеет имя такое, какое мы дали ей при создании, когда кинули кучу спрайтов в объект.
Однако, надо добавить кадров, чтобы тюлень у нас изгибался вверх и вниз при движении. Ставим новый кадр, меняем значение Sprite в Sprite Renderer - всё очень просто.
Теперь, когда кадров достаточно, перейдем во вкладку Animator. Мы видим, что наша единственная анимация стала анимацией по умолчанию. То есть если сейчас мы запустим игру, то тюлень будет плыть, двигаясь одинаково, вне зависимости от того, просто он плывет, ныряет, ест или повстречал врагов, например.
Вернемся в Animation и создадим еще одну анимацию. Назовем ее seal_dive, потому как это будет анимация погружения.
Добавим один единственный параметр - Sprite из Sprite Renderer.
И добавим все спрайты, которые мы нарисовали для погружения.
Снова идем в Animator и создаем триггер.
Жмем правой кнопкой на Any State, выбираем единственный пункт Make Transition и в полученном Transition в Conditions добавляем наш триггер, который мы назвали, конечно же, dive.
Ну и сделаем еще одну Transition, из tuna_dive в tuna_swim.
Вполне наглядно выглядит. А теперь пора открыть скрипт, управляющий тюленем - SealController. Добавляем provate переменную anim, в методе Awake() устанавливаем ей значение, а в Jump с ее помощью дергаем наш триггер dive.
Повторим всё то же самое для создания анимации seal_eat. Только триггер назовем уже, соответственно, eat.
А в скрипте добавим срабатывание этого триггера, когда тюлень встречает еду.
И снова все то же самое для seal_hurt.
В скрипте мы дергаем этот триггер, когда встречаем Animal - этот тег сейчас у медузы и он будет у всех врагов и друзей.
Создадим анимации для тунца и медузы, на сей раз не перетаскивая спрайтов на объект, а нажав во вкладке Animation кнопку Create. Тунец - парень простой, у него будет только один state и никаких триггеров.
И медузе создадим анимацию, но уже не одну, а парочку, помимо swim, у нее будет еще и play. И, соответствующий триггер и Transition.
А в скрипте добавим, чтобы при встрече с тюленем все наши враги и друзья "играли".
Теперь создадим дельфина. Можно скопировать его с медузы, заменив спрайт, сбросив коллайдер, подняв скорость (дельфин плавает быстрее) и переименовав, можно создать заново - не важно. Помните только, что копируя, вы должны не забывать создать новому объекту отдельный Animation Controller и назначить его. Так же вам нужно будет сделать "фабрику дельфинов", как мы делали раньше "фабрику медуз", только в качестве префаба выбрать там дельфина и настроить паузы между появлениями дельфинов, они уж точно встречаются пореже медуз.
А теперь добавим в скрипт MovingObjectController public переменные life и score. Life - это сколько жизней будет добавлять или отнимать в случае отрицательного значения столкновение с данным объктом, а Score, как не сложно догадаться - очки. У префаба дельфина выставим Life в 10, Score в 1. И очки и жизнь будут добавляться, пока тюлень "играет", то есть соприкасается с дельфином. Медузе выставим -10 в life и оставим 0 в score, а у тунца в score поставим 100 и в life 100 - тунец сразу съедается и добавляем и очков и жизни сразу.
И добавим изменим немного в обработку событий. При столкновении с Animal мы теперь смотрим, включать ли нам hurt (если life < 0) или же добавлять очков.
Вот и всё на сегодня. Не так уж и мало, хотя и всё просто. В следующий раз напишу о звуке.
Я пока оставляю везде, где "нужно" public переменные. Думаю, что тем, кому интересно попробовать создать подобную простую игрушку будет и интереснее и полезнее самим навести порядок в уровне доступов, решить, где будет правильно использовать поля рид-онли и т.д.
У меня на горизонте замаячила новая работа и не исключено, что грядущая неделя - последняя неделя безделья, в работу это надо будет погрузиться чуть менее, чем полностью, поэтому продолжать писать сюда я буду, скорее всего, только по выходным.
(ну когда же мы уже до)Делаем Тунца - четыре
Начало - здесь: http://pikabu.ru/story/delaem_tuntsa__tri_4521249
Сегодня мы сделаем отображение жизни, очков и изменение этих величин в зависимости от того, встретит наш тюлень врагов или еду. Начнем с отображения и потом добавим изменение. Короче говоря, делаем HUD.
Для начала создадим на сцене объект типа Canvas и назовем его HUDCanvas, например:
Создадим в нем дочерний объект типа Slider:
Расположим наш слайдер, который будет отображать жизнь, в самом низу экрана, для этого у него в Transform выберем соответствующий Anchor Presets:
Посмотрим, что есть внутри нашего слайдера, что там можно настроить. Ага, есть цвет заливки, поменяем его на зелененький:
А вот Handle Slide Area нам вообще не нужно, мы же не хотим, чтобы игрок мог добавить себе жизни простым перемещением ползунка. Так что просто удалим его. И посмотрим, что еще можно настроить в нашем Slider, а настроить можно максимальное и стартовое значение:
Так же стоит убрать крыжик Interactable, чтобы игрок действительно не мог изменять собственноручно количество жизни. И настроить цвет. Например, подкрутим альфа-канал и сделаем наш слайдер полупрозрачным, так на мой взгляд красивее. Уменьшите значение A у цветов Normal Color в Slider и Color в Slide-Fill Area-Fill до такого, чтобы вам нравился уровень прозрачности у заполненной и пустой полоски:
А теперь что-то новенькое: создадим новый пустой объект на сцене, назовем его GameManager и добавим в него один единственный компонент - новый скрипт, который так же назовем GameManager:
Добавим в этот скрипт следующий код:
Мы используем instance вместо static-класса. В Awake() нет DontDestroyOnLoad() по той простой причине, что у нас одна сцена и она не будет перезагружаться. Если вы будете использовать много сцен и хотите, чтобы GameManager оставался единым для всех сцен - используйте DontDestroyOnLoad () в Awake() для этого
Так, а про score то мы забыли, ну не беда, вернемся к нашему HUDCanvas и добавим в него дочерний объект типа Panel:
Назовем нашу панель ScorePanel и добавим и ей дочерний объект, но уже типа Text:
Назовем его просто Score, настроим его расположение так, чтобы он был в правом верхнем углу экрана:
Чтобы наша панель не окрашивала все белым цветом, сделаем ее полностью прозрачной:
А теперь пора добавить кое-что в наш скрипт GameManager:
Мы добавили public-переменные timeSlider и scoreText, а так же score. В методе Awake() добавили обнаружение соответствующих объектов на сцене и связали их с нашими переменными. А в Update() добавили постепенное изменение количества жизни и отображение текущего количества очков.
Теперь пришло время сделать так, чтобы тюлень реагировал на столкновение с едой - пополнял количество жизней и увеличивал счет, а так же с врагами - уменьшал количество жизней. Для этого мы пойдем в папку Prefabs, где у нас лежат заготовки для тюленя, медузы и тунца и, встав на одну из заготовок, откроем меню Tag и выберем создание нового тэга:
Создадим сразу парочку тэгов - Food и Animal:
После этого снова идем в Prefabs и раздаем теги - тунцу Food, медузе Animal, ну и заодно дадим тюленю тэг Player, пусть будет:
Теперь пора добавить парочку методов в наш скрипт SealController, который прикреплен у нас к тунцу. Вот такие методы добавим в конце скрипта:
И еще, добавим-ка нашему тюленю PolygonCollider2D и выставим у него isTrigger в true. Это нужно, чтобы все тельце тунца реагировало на столкновения с другими объектами (до сих пор у нас был только Circle Collider, нужный нам для ныряния и подъема на поверхность воды):
Вот теперь всё будет прекрасно работать. Когда тюленю будет попадаться тунец - жизни становится больше, очков тоже, а когда медуза - жизней стремительно становится меньше. Это уже похоже на игру! Однако, наверняка вы заметите, что очки как-то не правильно отображаются, пока их 0 - всё нормально, как только их становится больше - количество их куда-то исчезает. Что же, идите в объект Text, который мы назвали Score и смотрите, что там не так с расположением или размером этого объекта, настраивайте. Нужно же хоть что-то сделать самостоятельно. :)
В этот раз мне удалось сделать перерыв не в 7, а в 6 дней! Успех? Не очень, конечно. Однако, несмотря на занятость и лень, я постараюсь сделать продолжение через 5 дней. А может и раньше, но не обещаю. Впереди у нас такие интересные задачи как: гамовер и стартовое меню, звуки и анимация. Потерпите, осталось не так уж и много.
И я по прежнему рад любой критике от тех, кто лучше меня знает Unity3D и C# - пишите, ругайте, всё мотаю на ус, мне самому эти типа-уроки будут не менее полезны, чем тем, кто просил написать, как сделать такую простенькую игру, "вот я установил юнити - с чего начать" и так далее.
Сможете найти на картинке цифру среди букв?
Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi
Делаем Тунца - три!
Прошла неделя и таки продолжаем. Начала здесь: http://pikabu.ru/story/delaem_tuntsa__dva_4503397
Итак, сегодня мы делаем первых врагов и пищу для нашего тюленя. Сразу создадим папку Prefabs и закинем в нее самого Тюленя со сцены, пусть лежит там тоже:
Затем берем спрайты наших пищи и врагов - это будут медуза и тунец и кидаем их в папку спрайты, потом вытаскиваем на сцену и добавляем каждому из них компонент Polygon Collider 2D, ставим у компонента параметр isTrigger в true. Понадобится он нам чуть позже и не раз.
Теперь закидываем медузу и тунца со сцены в папку Prefabs, а со сцены их можно удалить, ведь наша цель состоит в том, чтобы они появлялись в правой части экрана и проплывали по воде в левую часть.
Создадим на сцене два пустых объекта и назовем их medusaFactory и tunaFactory - эти объекты будут порождать наших медуз и тунца.
Добавим нашим фабрикам иконки, чтобы мы их видели и расположим их в правой части экрана, за пределами видимости камеры.
Добавим к одной из наших фабрик новый скрипт и назовем его FactoryController.
Вот что будет в том скрипте:
Добавим уже готовый скрипт и ко второй фабрике и настроим наши значения: Min и Max Time Out будут отвечать за то, какую минимальную и максимальную паузу нужно делать между генерацией объектов, MinY и MaxY за то, где по оси Y генерировать новый объект, ну и Prefab - это наш объект, чтобы задать его, берем в папке Prefabs тунца и тащим его в это поле у tunaFactory, аналогично поступаем и с медузой и medusaFactory.
Далее, добавляем компонент - новый скрипт нашему тунцу, назовем его, скажем, MovingObjectController. И в скрипте том вот что:
Добавляем этот скрипт и медузе и настраиваем ей и тунцу максимальную и минимальную скорость.
Теперь, если мы запустим игру, медузы и тунцы начнут появляться и проплывать мимо тюленя справа налево. Однако, как не сложно догадаться, они будут плыть и плыть в никуда. Поэтому создадим еще один пустой объект, который назовем Terminator, поместим его слева за пределами видимости камеры, добавим ему компонент Box Collider, настроим его так, чтобы всё, чтобы проплывало по нашей воде, попадало в этот коллайдер, не забываем выставить isTrigger в true, так же добавляем компонент Rigidbody2D и ставим isKinematic в true и добавляем компонент - новый скрипт, который называем Terminator Controller.
А в скрипте этом совсем короткий код, который будет удалять всё, что попадет в коллайдер нашего терминатора:
При запуске мы увидим, что медузы и тунцы поплыли горизонтально мимо тюленя, они не причиняют ему вреда и пользы, просто исчезают в левой части экрана. На сегодня хватит, в следующий раз сделаем взаимодействие персонажа и других объектов, а значит и отображение этого взаимодействия в виде изменения количества очков и жизни на экране, то есть будем делать HUD. Постараюсь дальше писать чаще, чем раз в неделю, простите за столь длительные перерывы.
Делаем Тунца - два!
Ну что же, после некоторого перерыва - продолжаем.
Начало здесь: http://pikabu.ru/story/delaem_tuntsa__raz_4489410
Мы остановились на том, что у нас есть тюлень и есть море. А сегодня будем делать так, чтобы тюлень по этому морю не просто плыл, но мог и нырять.
Для удобства я создал пустой объект и собрал в него все элементы моря. А теперь создаем в этом нашем общем море еще один элемент - тоже пустой объект и в нем добавляем один очень интересный компонент:
И еще один компонент:
Теперь настраиваем в Buoyancy Effector параметр Surface Level так, чтобы поверхность воды примерно совпадало с нижней линией волн. А в Box Collider 2D настраиваем его размеры так, чтобы всё море до дна было "водой", которая будет выталкивать нашего тюленя к своей поверхности.
Однако, пришло время добавить кое-что и к нашему персонажу, чтобы вода его действительно выталкивала и чтобы он покачивался на волнах:
После добавления компонента Rigidbody2D добавляем еще один - Circle Collider 2D:
И настраиваем размер коллайдера:
Теперь пришло время добавить нашему тюленю управление. Покуда мы работаем только с компьютером и пока еще не собираемся устанавливать игру на телефон, обойдемся управлением клавиатурой, тачскрин будем добавлять позже. Добавим нашему тюленю новый скрипт:
И вот что будет в том скрипте:
Настройки Buoyancy Effector, массу тюленя в его Rigidbody2D, а так же нижнюю и верхнюю границу для ныряния в скрипте, в методе FixedUpdate() попробуйте менять, чтобы получить наиболее (на ваш взгляд) реалистичное движение персонажа. На сегодня всё, в следующий раз будем делать первых врагов и пищу тюленя.
Напоминаю, что установить готовую игру, чтобы увидеть результат можно здесь для Андроида: https://play.google.com/store/apps/details?id=com.FRN.tuna
и здесь для Windows Phone: https://www.microsoft.com/ru-ru/store/p/tuna/9nblggh4td3k
Делаем Тунца - раз!
У этого поста есть дубликат: http://pikabu.ru/story/delaem_tuntsa_1_4487033 - было бы здорово, наверное, если бы админы его удалили. Я вчера просто забыл прикрепить пост к сообществу, но всё таки он должен быть именно здесь, в Лиге.
Ну что же, раз два человека высказали заинтересованность, как и обещал, пишу пост о том, как сделать на Unity3D простенькую игру, вроде того самого Тунца, который, кстати, уже зарелизился не только для Андроида, но и для Виндовсфона, вот ссылки:
https://play.google.com/store/apps/details?id=com.FRN.tuna
https://www.microsoft.com/ru-ru/store/p/tuna/9nblggh4td3k
На этом хватит саморекламы, перейдем к тому, что, возможно, будет интересно тем пикабушникам, которые хотят начать делать игры на Unity3D, но не знают как, не знают, с чего начать, не знают, где искать обучающие материалы. Тем же, кто имеет опыт создания игр, вряд ли будет интересно читать дальнейшее, ну разве что покритикуете меня и расскажете мне, глупому, как же надо делать на самом деле. :)
Для меня это первый опыт написания каких-то примеров, уроков по Юнити, так что пинайте меня ногами, тыкайте меня носом в мои ошибки (но не слишком больно).
Будем делать так: я создам в Юнити новый проект и заново сделаю игру. Правда, у меня уже заготовлены и скрипты и префабы и графика, так что я всё сделаю быстро. Вам же я не дам заготовок, ибо считаю, что намного полезнее самому набрать код, создать объекты и всё настроить, чем взять готовенький архивчик и оп-ля - урок пройден. Дело не обойдется одной статьей, хотя игра простенькая и маленькая. Будет их 3 или 4. А может и 5. Вообще первый будет рассказывать о том, как сделать скроллинг фонов в игре и будет он пробным, понравится ли, может быть что-то по-другому делать, всё по другому делать или вообще прекратить - жду отзывов и критики, короче говоря. Итак:
1. Идея
Будем считать, что Юнити у нас уже есть, установлено, мы зарегистрированы и т.д. и т.п., то есть можем запускать среду разработки и разрабатывать. Но, конечно же, игра начинается с идеи, с желания сделать что-то определенное, в определенном жанре. С Тунцом у меня всё было просто - еще на этапе первоначального знакомства захотелось сделать что-то вроде Корявой Птички, но немного другое, чтобы надо было не только уворачиваться, но и ловить, чтобы объекты на экране были не статичные, а движущиеся и... и... и еще что-нибудь, в результате раздумий над этим что-нибудь родилась идея перенести действия игры из воздуха под воду и единственным действием персонажа сделать не взлёт, а нырок.
2. Реализация
Как уже говорилось выше, я не стану рассказывать, где скачать и как установить Unity3D.
Мы сразу создаем 2D-проект и начнем делать игру. С чего же начать? Ну раз наш персонаж и все прочие в этой игре плывут в море, то очевидно, что с воды, дна и самого персонажа. Вам нужно нарисовать текстуры для воды и дна и спрайт для персонажа. Итак, у нас созданы текстуры, я импортировал их в Юнити (просто бросайте файлы драг-н-дропом в Assets и потом переключайте у них Texture Type со Sprite на Texture) и расположил эти текстуры на сцене.
Красота! Но наш персонаж будет постоянно плыть по морю, то есть волны должны двигаться, да и песок на дне. Поэтому придется сделать скроллинг нашим текстурам.
Для этого создаем на сцене объект типа Quad:
Однако, волны так никуда и не плывут. Нужно продолжать. Берем мышкой одну из текстур и тащим ее на список компонентов нашего Quad, а точнее на компонент MeshRenderer и бросаем там. Получается вот что:
Пожалуй, стоит удалить текстуры, которые мы набросали до этого в сцену. Без ниж картина следующая:
Мелко как-то получилось, ну так возьмем и увеличим, поменяем значения Scale у нашего Quad (кстати, значение Scale по y на картинке у меня слишком большое, я его потом поменял на 10):
Ох, страсть то какая, ужасно выглядит, наверное, нужно сменить шейдер. Меняем шейдер со стандартного на Sprites-Diffuse:
И получаем уже что-то более-менее похожее на море и волны, а теперь проделываем всё это для второй текстуры волн и песка и видим уже что-то прямо таки похожее на сцену игры:
Небольшое пояснение: у нас будут волны, которые как бы между персонажем и нами и волны, которые за персонажем. А так же песок, до которого персонаж сможет опускаться. Нам нужно расположить песок на переднем плане, волны которые между персонажем и нами - за песком, а уже за ними - еще одни волны. А персонаж наш окажется между волнами. Для этого мы просто меняем координату Z в Position у компонента Transform нашего Quad. Песку поставим, например, 1, вторым волнам 1, а у первых волн пусть остается 0. Пора бы бросить в это море нашего тюленя!
Выбираем наш Quad и видим, что в нем есть некоторые компоненты. Нам не понадобится компонент Mesh Collider, поэтому удаляем его:
И вот я импортировал спрайт и бросил его в сцену, но тюленя не видно. Вода его полностью закрывает. Сделаем воду достаточно прозрачной, чтобы тюлень был виден - для этого идем у волн в компонент Shader и в нем жмем в Tint и меняем значение альфа-канала:
Итак, мы сделали воду достаточно прозрачной и тюлень стал виден, когда он всплывёт на поверхность, будет видна граница воды на его тельце, а так же дальние волны у нас отличаются оттенком от передних. Отлично. Теперь нужно сделать, чтобы волны двигались. Для этого создаем в Quad новый компонент - скрипт:
Называем скрипт WaterController. Открываем его и вводим такой код:
using UnityEngine;
using System.Collections;
public class WaterController : MonoBehaviour {
public float scrollSpeed;
private Vector2 savedOffset;
private Material mat;
private float offset = 0f;
void Start () {
mat = GetComponent<Renderer> ().material;
savedOffset = mat.GetTextureOffset ("_MainTex");
}
void Update () {
float rate = scrollSpeed * Time.deltaTime;
offset = offset + rate;
if (offset <= -1f || offset >= 1f) {
offset = 0f;
rate = 0f;
}
mat.mainTextureOffset = new Vector2 (offset, savedOffset.y);
}
}
Пожалуйста, озаботьтесь табуляцией самостоятельно, пикабу ее почему-то "съедает".
Сохраняем скрипт. Что происходит в нашем скрипте? В методе Start() определяется наш материал, который использует наш Quad и offset нашего материала. В методе Update() каждый кадр offset меняется и таким образом создается эффект скроллинга текстуры.
Запускаем наш проект... Тюлень в воде висит, но ничего никуда не двигается. Смотрим тогда на наш компонент Скрипт (или в код) и видим, что есть public переменная scrollSpeed. Делаем скорость, скажем, 0.2. И еще один нюанс: идем в наши текстуры и меняем Wrap Mode с Clamp на Repeat, чтобы скроллинг был закольцован. Теперь добавляем наш скрипт (уже не надо создавать новый) ко вторым волнам и к песку и выставляем им скорость , скажем пусть у дальних волн она будет 0.1, у ближних 0.2, а у песка - 0.3 (не забываем так же и про Wrap) и... Всё прекрасно работает!
На сегодня всё, пишите, ругайте, ставьте минусы и плюсы. Завтра или продолжим и заставим нашего тюленя качаться на волнах и нырять ко дну или перепишем этот урок, если вышло всё совсем плохо и непонятно.
Делаем Тунца 1
Ну что же, раз два человека высказали заинтересованность, как и обещал, пишу пост о том, как сделать на Unity3D простенькую игру, вроде того самого Тунца, который, кстати, уже зарелизился не только для Андроида, но и для Виндовсфона, вот ссылки:
https://play.google.com/store/apps/details?id=com.FRN.tuna
https://www.microsoft.com/ru-ru/store/p/tuna/9nblggh4td3k
На этом хватит саморекламы, перейдем к тому, что, возможно, будет интересно тем пикабушникам, которые хотят начать делать игры на Unity3D, но не знают как, не знают, с чего начать, не знают, где искать обучающие материалы. Тем же, кто имеет опыт создания игр, вряд ли будет интересно читать дальнейшее, ну разве что покритикуете меня и расскажете мне, глупому, как же надо делать на самом деле. :)
Для меня это первый опыт написания каких-то примеров, уроков по Юнити, так что пинайте меня ногами, тыкайте меня носом в мои ошибки (но не слишком больно).
Будем делать так: я создам в Юнити новый проект и заново сделаю игру. Правда, у меня уже заготовлены и скрипты и префабы и графика, так что я всё сделаю быстро. Вам же я не дам заготовок, ибо считаю, что намного полезнее самому набрать код, создать объекты и всё настроить, чем взять готовенький архивчик и оп-ля - урок пройден. Дело не обойдется одной статьей, хотя игра простенькая и маленькая. Будет их 3 или 4. А может и 5. Вообще первый будет рассказывать о том, как сделать скроллинг фонов в игре и будет он пробным, понравится ли, может быть что-то по-другому делать, всё по другому делать или вообще прекратить - жду отзывов и критики, короче говоря. Итак:
1. Идея
Будем считать, что Юнити у нас уже есть, установлено, мы зарегистрированы и т.д. и т.п., то есть можем запускать среду разработки и разрабатывать. Но, конечно же, игра начинается с идеи, с желания сделать что-то определенное, в определенном жанре. С Тунцом у меня всё было просто - еще на этапе первоначального знакомства захотелось сделать что-то вроде Корявой Птички, но немного другое, чтобы надо было не только уворачиваться, но и ловить, чтобы объекты на экране были не статичные, а движущиеся и... и... и еще что-нибудь, в результате раздумий над этим что-нибудь родилась идея перенести действия игры из воздуха под воду и единственным действием персонажа сделать не взлёт, а нырок.
2. Реализация
Как уже говорилось выше, я не стану рассказывать, где скачать и как установить Unity3D.
Мы сразу создаем 2D-проект и начнем делать игру. С чего же начать? Ну раз наш персонаж и все прочие в этой игре плывут в море, то очевидно, что с воды, дна и самого персонажа. Вам нужно нарисовать текстуры для воды и дна и спрайт для персонажа. Итак, у нас созданы текстуры, я импортировал их в Юнити (просто бросайте файлы драг-н-дропом в Assets и потом переключайте у них Texture Type со Sprite на Texture) и расположил эти текстуры на сцене.
Красота! Но наш персонаж будет постоянно плыть по морю, то есть волны должны двигаться, да и песок на дне. Поэтому придется сделать скроллинг нашим текстурам.
Для этого создаем на сцене объект типа Quad:
Однако, волны так никуда и не плывут. Нужно продолжать. Берем мышкой одну из текстур и тащим ее на список компонентов нашего Quad, а точнее на компонент MeshRenderer и бросаем там. Получается вот что:
Пожалуй, стоит удалить текстуры, которые мы набросали до этого в сцену. Без ниж картина следующая:
Мелко как-то получилось, ну так возьмем и увеличим, поменяем значения Scale у нашего Quad (кстати, значение Scale по y на картинке у меня слишком большое, я его потом поменял на 10):
Ох, страсть то какая, ужасно выглядит, наверное, нужно сменить шейдер. Меняем шейдер со стандартного на Sprites-Diffuse:
И получаем уже что-то более-менее похожее на море и волны, а теперь проделываем всё это для второй текстуры волн и песка и видим уже что-то прямо таки похожее на сцену игры:
Небольшое пояснение: у нас будут волны, которые как бы между персонажем и нами и волны, которые за персонажем. А так же песок, до которого персонаж сможет опускаться. Нам нужно расположить песок на переднем плане, волны которые между персонажем и нами - за песком, а уже за ними - еще одни волны. А персонаж наш окажется между волнами. Для этого мы просто меняем координату Z в Position у компонента Transform нашего Quad. Песку поставим, например, 1, вторым волнам 1, а у первых волн пусть остается 0. Пора бы бросить в это море нашего тюленя!
Выбираем наш Quad и видим, что в нем есть некоторые компоненты. Нам не понадобится компонент Mesh Collider, поэтому удаляем его:
И вот я импортировал спрайт и бросил его в сцену, но тюленя не видно. Вода его полностью закрывает. Сделаем воду достаточно прозрачной, чтобы тюлень был виден - для этого идем у волн в компонент Shader и в нем жмем в Tint и меняем значение альфа-канала:
Итак, мы сделали воду достаточно прозрачной и тюлень стал виден, когда он всплывёт на поверхность, будет видна граница воды на его тельце, а так же дальние волны у нас отличаются оттенком от передних. Отлично. Теперь нужно сделать, чтобы волны двигались. Для этого создаем в Quad новый компонент - скрипт:
Называем скрипт WaterController. Открываем его и вводим такой код:
using UnityEngine;
using System.Collections;
public class WaterController : MonoBehaviour {
public float scrollSpeed;
private Vector2 savedOffset;
private Material mat;
private float offset = 0f;
void Start () {
mat = GetComponent<Renderer> ().material;
savedOffset = mat.GetTextureOffset ("_MainTex");
}
void Update () {
float rate = scrollSpeed * Time.deltaTime;
offset = offset + rate;
if (offset <= -1f || offset >= 1f) {
offset = 0f;
rate = 0f;
}
mat.mainTextureOffset = new Vector2 (offset, savedOffset.y);
}
}
Пожалуйста, озаботьтесь табуляцией самостоятельно, пикабу ее почему-то "съедает".
Сохраняем скрипт. Что происходит в нашем скрипте? В методе Start() определяется наш материал, который использует наш Quad и offset нашего материала. В методе Update() каждый кадр offset меняется и таким образом создается эффект скроллинга текстуры.
Запускаем наш проект... Тюлень в воде висит, но ничего никуда не двигается. Смотрим тогда на наш компонент Скрипт (или в код) и видим, что есть public переменная scrollSpeed. Делаем скорость, скажем, 0.2. И еще один нюанс: идем в наши текстуры и меняем Wrap Mode с Clamp на Repeat, чтобы скроллинг был закольцован. Теперь добавляем наш скрипт (уже не надо создавать новый) ко вторым волнам и к песку и выставляем им скорость , скажем пусть у дальних волн она будет 0.1, у ближних 0.2, а у песка - 0.3 (не забываем так же и про Wrap) и... Всё прекрасно работает!
На сегодня всё, пишите, ругайте, ставьте минусы и плюсы. Завтра или продолжим и заставим нашего тюленя качаться на волнах и нырять ко дну или перепишем этот урок, если вышло всё совсем плохо и непонятно.
Если вы профи в своем деле — покажите!
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
Томатный Побег
Я пишу этот текст для себя, но если это кому-то будет интересно — что же, ОК. Возможно, это не совсем правильно — использовать pikabu для таких размышлизмов, но что поделать, процесс уже начался и остановиться я не могу.
Итак, первой игрой, которую я выпустил на Google Play и Microsoft Store был Batchman, о нем здесь:
http://pikabu.ru/story/batchman__predyistoriya_sozdaniya_moe...
Но первой игрой, которую начал делать на Unity был все же Tomato Escape. Сразу дам ссылки, может кому-то это будет интересно посмотреть:
https://play.google.com/store/apps/details?id=com.FRN.Tomato...
https://www.microsoft.com/ru-ru/store/games/tomato-escape/9n...
А теперь к делу. Дальнейший текст является неким подобием работы над ошибками, анализом того, что сделано не так, а что так, как больше в будущем делать не надо и т.д.
Проект, начавшийся как первая проба чего-то сделать после просмотра нескольких видеоуроков по Unity, превратился в затяжной долгострой и в результате получилась не столь хорошая игра, какую можно было бы сделать за несколько месяцев. Все таки к началу изучения Unity я уже более-менее знал C# и вообще имел н-дцать лет в IT, разработке и внедрении софта, хоть и не в геймдеве. А чтобы было не так скучно, я разбавлю всё это скриншотами из игры, так что в какой-то степени это ее реклама, да. Но в очень малой.
1. Название.
Что же, Tomato Escape — не худшее название. На момент, когда оно было придумано, я проверил, что в маркетах нет игры с таким или очень похожим названием и успокоился. Когда уже залил игру на маркеты, оказалось, что на виндофоне все ок, а вот для андроида уже появилась игра с таким же названием. Почему при этом мне не было отказано в публикации приложения — загадка. Ну да ладно, игры схожи лишь тем, что главный персонаж — томат и он прыгает. Не то, чтобы это совсем ничего, но графика не похожая, управление не похожее, вообще игры весьма разные. Но на будущее надо знать:
- Стоит или резервировать название заранее или быть готовым к его смене, то есть держать пару запасных вариантов.
2. Сроки.
Я ставил себе сроки по промежуточным задачам, вроде «нарисовать такие-то спрайты», «решить такую-то проблему», но порой ковырялся с какой-то одной фишкой, которая вдруг приходила в голову, днями и дни эти, бывало, что складывались в неделю. Это было жутко интересно, так самозабвенно я мало на какой работе работал, но не очень то продуктивно. Да, игра изменилась в процессе и изменилась она в лучшую сторону, многие элементы не планировались изначально и появились спонтанно, но уж очень много времени ушло на некоторые из них.
- Стоит заранее всё продумывать и поменьше допускать творческого угара, если я хочу выпустить простенькую игру за 1-2 месяца, скажем, а не за 7-8. Конечно, не стоит совсем душить в себе все творческие позывы, но если я что-то придумал и не могу реализовать это быстро — этого не будет в первой версии.
3. Сложность.
Это настоящая беда этой игры. Игра получилась очень сложной. Уровня с 6-го начинаются настоящие проблемы, а всего их 30. Но что самое ужасное, первые 10 уровней — это сад. С 11 по 20 — канализация, с 21 по 30 — завод. То есть, меняется окружение и сильно меняется сама игра. Кто сумеет пройти первые 10 — оценит, я гарантирую это. И проблема именно в том, чтобы пройти с 6 по 10-й, с 11 сложность снижается и нарастает до 20, потом опять снижается, ввиду того, что разные зоны, разные препятствия, враги, ловушки. Просто, блин, 6-10 уровни получились очень сложными, как бы я не пытался их упрощать без урона интересности.
- Стоит больше обращать внимание на плавное усложнение игры с повышением уровня. Допустить такое снова в другой игре не можно.
4. Графика.
В сущности, на этой игре я учился хоть как-то рисовать для двухмерных платформеров в эдаком ретро-стиле, так что косяки понятны, но это не значит, что их не стоит перечислить. Разное качество у разных спрайтов и текстур, разный уровень детализации разное вообще все, стиль разный даже, порой. Всё от того, что когда игра была в зародыше, было придумано и сделано в плане графики только что-то для сада. С ним я провозился довольно долго, а уж когда сделал канализацию и взялся за завод, опыта было побольше и я нарисовал несколько совсем уж иных вещей, которые сами по себе хороши, но в общий стиль, который задают первые 10, да и вторые 10 уровней, вписываются слабо.
- Стоит удерживать некий общий стиль в графическом исполнении игры, сам ли я буду рисовать в дальнейшем или прибегать к помощи художника. И не оставлять некоторые спрайты в состоянии «так сойдет», тогда как другие перерисовывать и дотачивать целыми днями, это и на сроки плохо влияет. Если уж треш, то треш во всем, а если хочется красивенько и аккуратненько, то от треша надо избавляться полностью.
5. Продвижение
Это уже отдельная вещь и она касается как Tomato Escape так и BatchMan. Выложить ссылки на паре тематических форумов, да в соцсетях — не продвижение. 2-5 оценок и дюжина установок игры — не то, ради чего стоит корпеть над игрой неделями и месяцами. Нужно выделить несколько дней для изучения этой темы, на каких ресурсах лучше продвигать игру, заранее делать рекламные изображения, видео, к релизу написать статьи и в конце концов уже раскошелиться на рекламные кампании от гугла и майкрософта, никуда не деться мне от вложения средств в собственные игры, если я хочу, чтобы их установила хотя бы тысяча человек. Получать положительный фидбек оказалось внезапно невероятно приятно, нужно больше, больше! :)
Ну вот и всё, спасибо за внимание, не судите строго, а если есть чего посоветовать — всегда welcome.