TonyKOT

TonyKOT

пикабушник
пол: мужской
поставил 4009 плюсов и 438 минусов
проголосовал за 0 редактирований
2534 рейтинг 207 комментариев 18 постов 6 в "горячем"
1 награда
более 1000 подписчиков
12

Маркетинг головного мозга

Маркетинг головного мозга Маркетинг, Шоколад

Вчера купил девушке плитку шоколада. С клубничкой.... Если вы понимаете, о чем я. Стоит ли говорить, что вечер был испорчен, поскольку клубнички не было не только у шоколада, но и у меня =(

P.S. Пардон за маленький кусок шоколадки, я её всю поломал в поисках начинки.

38

Исходники мини-игры (вдруг кому пригодится)

Исходники мини-игры (вдруг кому пригодится) Gamedev, Open Source, Исходники, Длиннопост, Unity

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

Весь код лежит на Bicbucket, а описание, что и как работает - под катом.

И да, в репозитории лежит не проект, а только папка Assets. Поэтому не забудьте назначить объектам теги. Какие? Напишу ниже. Поехали!

Исходники мини-игры (вдруг кому пригодится) Gamedev, Open Source, Исходники, Длиннопост, Unity

Вот так выглядит игра. Просто и скромно. Фичи:

1 - Генерация карты при загрузке уровня. Вообще, карта собирается по словарю. Поэтому массив с объектами с карты можно хранить как угодно. Хоть в текстовом документе. Но в моём случае карта заполняется рандомными объектами.

2 - 6 видов объектов на карте: кирпичные блоки (можно разрушить, но нельзя проехать), бетонные блоки (ни разрушить, не проехать), вода (не разрушается, по ней нельзя ездить, но через неё можно стрелять), кусты/трава (не разрушаемые объекты, в которых можно прятаться. Турельки вас в кустах не видят и перестают стрелять. Из кустов можно успешно вести огонь). Плюс два вида турелек.

3 - Два вида турелей. Одни - направленные и стреляют строго прямо. Вторые - направляют башню на игрока и ведут прицельный огонь.

4 - Система бонусов. Рандомно выпадает 3 вида бонусов: взрывающий окружающие турели, увеличивающий скорость танка и увеличивающий скорострельность танка.


Что касается самого танка - он умеет крутить башней и стрелять в сторону курсора.

Управление: WASD или стрелки - движение танка.

Мышь - направление стрельбы. Стреляем на левую клавишу мыши.

Кстати. На главном экране (сцена Main) есть белый квадрат. Это как бы кнопка "Play".


Внимание! Теги! Если не дать объектам теги - вы не сможете никого убить и ничего разрушить. А поскольку стрелялки в принципе не для пацифистов - давайте исправлять.


Тег Block - требуется всем не разрушаемым объектам. Обратите внимание, что на сцене имеется объект floor и в нём четыре куба. Это ненавистные всеми игроками невидимые стены, которые в моём случае не только не дают танку свалиться с платформы, но и уничтожают объекты пуль, чтобы они не захламляли сцену и не занимали память.

Тег Bullet - вешаем на префаб Bullet (в папке Resources).

Тег Turret - вешаем на оба вида турелей (всё в той же папке).

Тег Grass - вешаем на одноимённый префаб (угадайте, где?).


И напоследок поясню назначение скриптов.

Класс AudioManager - подписывается на все события, при которых должны воспроизводиться звуки. И, соответственно, когда это событие происходит - воспроизводят соответствующий звук.

Класс BonusController - вращает объект (да, лень было возиться с анимацией, реализовал вращение из кода) и при столкновении с объектом "Player" - вызывает соответствующее событие.

Класс BonusSystem - рандомно создаёт бонусы и раскидывает их по карте.

Класс BulletController - рассчитывает баллистику толкает снаряд вперёд.

Класс DestroyableObj - даёт объектам здоровье и возможность умирать.

Класс GameManager - управляет игровым процессом.

Класс MainScreenManager - нужен исключительно для запуска игры.

Класс MapGenerator - отвечает за сборку карты. В моём случае - её генерирует.

Класс Messenger - это система событий.

Классы TankController и TurretController - управляют танком и турельками, соответственно.


На этом всё. Если будут вопросы - пишите в комментариях. Постараюсь ответить.

Ссылка на исходники: bitbucket.org/TonyKOT/tanks-demo


Подписывайтесь, чтобы не пропустить что нибудь новенькое. И не забывайте ставить плюсы, это лучшая награда для автора. Спасибо!

Показать полностью
22

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс)

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

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


Внимание!!! Длиннопост!


Для начала сделаю небольшое отступление. Я снова отстаю от графика, который вам пообещал. А всё потому, что написание поста занимает очень продолжительное время =) Для примера, на написание предыдущего я потратил 4 часа. И речь сейчас идёт не о работе в юнити, а исключительно о подготовке скринов и гифок, о написании текста и т.п. И дело в том, что всё, что мы будем сегодня рассматривать я сделал уже через день после написания предыдущего поста. ПОЭТОМУ! Я буду думать над упрощением подачи информации. Скорее всего буду дробить всё на маленькие темы, чтобы успевать давать эту информацию.

В общем, не обессудьте. Я готов делиться информацией. Но слишком мало свободного времени на это. Вероятно, я буду кодить и публиковать всё в репозитории на Bitbucket. А уже когда будет время, самое интересное из этого буду описывать здесь, на пикабу.


И так, начнём...

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

(Не ищите сакрального смысла в этой картинке, это лишь пример из интернетов.)


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


По способу размещения, интерфейс можно разделить на два вида: экранный и глобальный. И для обеих задач нам потребуются разные типы интерфейсов. Давайте начнём с самого известного - экранного. И сделаем окно, которое будет просить ввести имя пользователя. Я это реализовал вот в таком виде:

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

Но у вас это может выглядеть как угодно. Данное окошко состоит аж из семи элементов. Я не буду рассказывать обо всех, но акцентирую ваше внимание на необходимых.


Итак. Чтобы создать подложку для нашего окна - щёлкаем правой кнопкой мыши по окну иерархии и создаём UI -> Image. Давайте сразу назовём этот объект "StartWindow", чтобы потом нам было проще ориентироваться в сцене. В сцене вы, возможно, не заметите изменений. Поэтому давайте перейдём в окно Game, в котором у нас появился белый квадрат. Он и будет нашей подложкой. Сразу скажу, что верхнюю и нижнюю полосы я делал точно так же. Давайте кликнем на созданный нами объект в окне иерархии и посмотрим, что там у нас есть на нем в инспекторе и...


О боже! Где наш любимый трансформ?! А хотя нет. Вот он. Только называется он теперь Rect Transform и имеет уже несколько другой функционал. Давайте коротко его рассмотрим.

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

Первое, что бросается в глаза - непонятный квадрат слева. Спешу вас обрадовать. Это очень важный квадрат. Он позволяет задать выравнивание объекта, относительно экрана. Думаю вы уже догадались, что в отличие от нашего игрового пространства, которое везде будет выглядеть одинаково, экраны пользователей имеют ОЧЕНЬ разнящиеся параметры. Поэтому мы должны дать знать нашему элементу, как себя вести, если экран игрока будет отличаться от окна, в котором мы настраиваем положение элементов UI. В нашем случае всё просто - наше окно должно быть всегда центрировано. Поэтому тыкаем в середину.


Далее - справа от квадрата, который нам уже знаком, красуются две строки, которые тоже нам будут нужны. Первая - позволяет задать смещение элемента относительно той позиции, которую вы выбрали для него "ориентиром". Вторая - отвечает за размер окна. Поиграйтесь с этими значениями. Сделайте красиво и пойдём дальше. Начнём в нашем окне писать.


Для того, чтобы разместить надпись в нашем свеженьком окошке - жмём правую клавишу мыши и создаём UI -> Text. Не торопитесь настраивать его положение. Чуть ниже, в компоненте Text, вы сможете указать сам текст, подгрузить кастомные шрифты и даже помучать их параметры, включая цвет и размер (привет лиге веб дизайнеров, вы не одни играетесь со шрифтами). Настраиваем всё на свой вкус и только теперь задаём положение.


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

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

Обратите внимание на на пункты Horizontal Overflow и Vertical Overflow. У обоих есть выпадающие списки и если у обоих выбрать Overflow - ваша проблема решится. Теперь, с этими знаниями, сделайте так же все надписи, которые посчитаете нужными.


Поехали дальше. Давайте сделаем что-то более интерактивное, чем простой текст и создадим элемент UI -> InputField. Как можно понять из названия - это поле для ввода (ваш КЭП). Это более сложный элемент уже за счёт того, что при его создании он притянул к себе дочерними ещё аж два объекта. Все они позволяют настроить это поле так, как вы посчитаете нужным. Но я хочу обратить ваше внимание на поле OnEndEdit, которое находится в инспекторе у объекта InputField. Именно оно позволяет создать весь интерактив, но мы вернёмся к нему чуть позже. А сейчас - время кодить!


Прошло уже много времени и я не совсем помню, на чём мы остановились. Поэтому буду повествовать в режиме "что вижу, о том и пою". Для начала давайте создадим скрипт GameManager. Угадайте в какой папке =) Класс GameManager, в последующем, будет управлять игровым процессом. И не пугайтесь тому, что я пишу в коде сейчас (я в тот раз получил претензию на глупый контроллер). Мы начинаем с простого и будем двигаться к сложному. Поэтому ещё сотни раз всё будем усложнять и, как следствие, рефакторить.


И так, вот содержание класса:

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

Я не буду описывать переменные, а что делают методы - скажу. Самое первое, что у нас выполняется при старте - метод старт (хейтеры и умники, спокойнее, я имею в виду конкретный класс). В нём мы получаем компонент, управляющий нашим игроком и отключаем его. Это сделано для того, чтобы до входа в игру мы не могли крутить игроком и тем более бегать. Далее идёт публичный класс JoinGame, который принимает один параметр - строку name. Обращаю ваше внимание на то, что метод должен быть именно публичным, ибо мы будем обращаться к нему извне. Данный класс сразу же хватает переданное имя пользователя и записывает его в переменную playerName. Откуда метод её получает - пусть пока останется загадкой. Далее мы возвращаем контроль над персонажем в руки нашему пользователю и выключаем окошко авторизации. Всё, мы вошли в игру.


Теперь к вопросу об имени пользователя. Давайте вернёмся в Unity и снова тыкнем на InputField, который мы создали. Там, в инспекторе, у него есть поле On End Edit, которое я уже упоминал. Нажимаем плюсик под ним и в левое поле перетаскиваем объект GameManager из иерархии. А в выпадающем меню, из списка методов выбираем наш JoinGame.


Что же мы сейчас сделали? Всё просто. Когда пользователь завершит ввод и нажмёт Enter, наше поле для ввода самостоятельно оповестит GameManager о том, что ник введён. Сделает он это, обратившись к методу JoinGame и передав ему строку, введённую пользователем.


Чудесно. С этим разобрались. Мы научились выводить экранный интерфейс и даже передавать с его помощью данные в наш код. Но вот мы представились, а как узнать, как зовут остальных игроков? Здесь тоже всё достаточно просто. Давайте знакомиться с интерфейсом, размещаемым в мировом пространстве!


Давайте создадим объект в сцене. Простой шарик. И назовём его Opponent. Этот шарик будет символизировать какого-то другого игрока, играющего с нами по сети. Теперь создадим ещё один объект. UI-> Canvas. Этот объект является своего рода полотном, на котором отрисовываются все элементы UI. И вы можете увидеть, что один такой объект у нас уже есть. Его нам добавила Unity, когда мы создавали фон для нашего окна. Но этот нам так же необходим. Потому, что он будет отрисовывать графику не в окне, а в игровом пространстве.


Для того, чтобы иметь возможность перемещать этот объект по сцене, нам необходимо найти компонент Canvas в инспекторе и в RenderMode изменить ScreenSpace на WorldSpace. Теперь давайте сделаем ему дочерним объект UI -> Text, который будет выводить имя игрока. Теперь вам необходимо установить эти объекты в удобное для вас положение.

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

У меня это выглядит вот так. И, как только мы всё разместили, давайте сделаем из нашего Canvas-а префаб, перетащив его левой кнопкой мыши в папку Resources. Удалим его со сцены и потом создадим ещё один C# скрипт. Назовём его NetworkPlayerManager. Данный класс будет отвечать за поведение всех игроков, которыми не управляет наш пользователь. То есть за всех оппонентов, играющих с нами по сети. И что же делает наш код...

GTO-R StarterKit: Шаг 2 (Введение в графический интерфейс) Gamedev, Unity, Gto-r, Gto-r StarterKit, Длиннопост, Картинки

Для начала (21 строка) мы создаём на сцене копию префаба с Canvas-ом, который мы только что создали. И следующей строкой помещаем его дочерним к нашему интернет-игроку. Далее (24 строка) мы получаем ссылку на компонент текст, который будет выводить ник и присваиваем её переменной labelName. И далее просто ищем в сцене камеру и берём ссылку на её трансформ.


В апдейте мы задаём позицию нашего лейбла и вращаем его в сторону ПРОТИВОПОЛОЖНУЮ игроку. Почему так? Потому, что ось Z у графических элементов направлена от взгляда пользователя в глубину. И если повернуть эту ось на игрока, мы увидим обратную сторону нашего текста. Чтобы этого избежать, давайте сразу вращать правильно.


И далее. В методе FixedUpdate мы обновляем текст надписи. Зачем мы её обновляем? Ну... Пользователь может захотеть сменить ник (когда мы дадим ему такую возможность) и тогда мы не будем наблюдать старый ник до конца сессии. А вот так часто ник обновлять действительно не имеет смысла. И потом мы приурочим это дело к какому нибудь более редкому игровому событию.



Ну вот и всё! Если вы дочитали до этого места, значит вы научились работать с новым графическим интерфейсом в Unity. А так же узнали, как с помощью интерактивных элементов UI передавать параметры в игровые скрипты. В будущем это ещё не раз пригодится.


Спасибо, что дочитали этот пост. И отдельное спасибо, что остаётесь на связи. У меня уже более 1000 подписчиков и я знаю, что вы ждёте новых постов. Но... Работа не даёт публиковаться часто =) Для тех, кто хочет видеть обновления чаще - есть группа в контакте. Созданная специально для того, чтобы держать в курсе особо интересующихся. Я стараюсь делиться там всякими плюшками. А теперь, поскольку код будет опережать посты, там будет информации немного больше.


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

Показать полностью 7
73

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа)

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Привет, друзья! В прошлом посте я спрашивал, есть ли интерес к пошаговому описанию создания своей мультиплеерной игры на Unity. Вы дали добро... Поэтому - поехали =)

Ах, да. Внимание! Очень длиннопост! + гифки и картинки.

Сразу хочу сказать, что посты будут ориентированы на новичков в геймдеве и программировании. В том числе новичков в Unity. Я буду стараться пояснять многое, но пожалуйста, не ленитесь пользоваться гуглом. Иначе придётся растягивать на очень уж длиннопосты. Все исходники я буду выкладывать в опенсорс и прикреплять unitypack-и. Чуть позже, когда мы с вами прикрутим мультиплеер, сделаю и онлайн демо.


Господа опытные разработчики. Очень прошу вас. Не проходите мимо. Мы собираем OpenSource проект. Своего рода StarterKit для TPS Action. Уверен, такие штуки будут полезны очень многим разработчикам. А особенно - разработчикам начинающим. Давайте сделаем мир чуточку лучше. Давайте учиться сами и помогать учиться начинающим. Предлагайте свои доработки. Не бойтесь исправлять меня. Я сам в Unity относительно новичок.


И для затравки то, что у нас сегодня получится в итоге:

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Кто-то, возможно, заметил, что на гифке представленны ассеты из бесплатного набора Unity. Не бойтесь, я буду использовать только готовые модели. Потому, что это быстро. И потому, что это бесплатно. Весь код в проекте будет либо мой. Либо, в последствии, ваш. Я искренне верю и надеюсь, что опытных разработчиков наш скромный проект со временем заинтересует. А пока будем набирать массу, чтобы можно было чем-то удивить.


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


Когда вы уже уверенно чувствуете себя в куче каких-то непонятных окон - давайте начнём собирать сцену. Для этого нам понадобятся бесплатные ассеты от Unity Technologies. Найти их можно в Asset Store на сайте, или прямо в редакторе, по комбинации клавиш Ctrl+9.

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Там вам нужно будет найти вот этот вот демонстрационный проект (на картинке выше). И нет, мы не будем работать с VR. Просто визуально эта сцена мне показалась наиболее подходящей. Да и там есть бесплатный персонаж... Ну просто чудо, а не ассет. Качаем и распаковываем. У вас для этой демки создастся отдельная папке в окне project. Загляните в неё. По открывайте там вложенные папки. Посмотрите, где что лежит. И подумайте, почему оно так. Потому, что сейчас мы приступим к созданию собственной структуры проекта.


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


1 Animations - будет содержать анимации и контроллеры анимации. Позже мы разобьём эту папку ещё на несколько, но это будет очень не скоро. Когда наши анимашки начнут накапливаться.

2 GUI - будет содержать файлы, которыми мы будем оформлять наш интерфейс. В ней:

2.1 Fonts - шрифты. Чтобы было, с чем поиграться (да, я веб разработчик, это больное).

2.2 Images - изображения. Тут будут находиться различные барчики и иконки.

3 Models - Понятно из названия. 3D модели, текстуры и материалы. Куда будем девать шейдеры пока не решил, нам с вами до них ещё долго. В ней создайте следующие папки:

Enviorments, Players, Vehicles, Weapons и Small objects. Окружение (игровой мир), модельки персонажей (мы их чаще будем называть аватарами, хотя как пойдёт), транспорт, оружие и различные маленькие объекты, которые, возможно, не относятся к окружению и с которыми мы будем взаимодействовать. Поехали дальше.

4 Resources - здесь будут располагаться префабы. Это тоже что-то вроде моделей, но не модели. Это их экземпляры, уже имеющие какие-то компоненты и... Ай, ладно. Не забивайте голову. Более подробно о префабах я расскажу, когда мы будем делать мультиплеер. Это уже очень скоро. Главное - создайте здесь подпапки:

Players (персонажи), Points (префабы различных чекпоинтов) и Vehicles (транспорт).

5 Scenes - здесь будут находиться наши игровые сцены. Своего рода виртуальные миры. Их будет не много. А мир, так вообще один (скорее всего). Но сцены достойны иметь свой каталог, ибо к ним мы будем часто обращаться. И последнее:

6 Scripts - это наши скрипты. Здесь будет два вложенных каталога:

6.1 Controllers - контроллеры.

6.2 Managers - менеджеры.


Вот тут я немного боюсь породить небольшой холивар. Но в программировании без этого никуда. И так, Unity - компонентно-ориентированный движок, скрипты (даже это слово многим не нравится, но сам редактор предлагает создать скрипт) в котором пишутся на объектно-ориентированном языке C#. UnityScript в топку, ибо это даже не Js, это разработанный под Unity язык с Js подобным синтаксисом. Да, я морально готов к гневным комментариям =)


К чему я это всё. Мы с вами будем создавать отдельные контроллеры. Такие, как PlayerController, WeaponController и им подобные. Это и есть компоненты, которые мы будем "вешать" на наши игровые объекты и эти компоненты будут позволять нам стрелять (если это WeaponController), бегать (если это PlayerController) и так далее. А менеджеры, это какие-то общие скрипты, которые будут управлять не игровыми объектами, а целыми процессами. Например GameManager у нас будет отвечать за игровую логику. А NetworkManager позволит управлять процессами сетевого взаимодействия.


Ладно, с этим разобрались. Сильно не забивайте голову. Всё будет понятно, когда мы начнём с этим работать. Теперь у нас есть готовые ассеты, в которых вы уже ковырялись. И структура проекта. Давайте соберём сцену. На самом деле, я дам ссылку на скачивание исходников. Поэтому моё описание сборки сцены будет походить на гайды "как нарисовать кота". Ну вы поняли. Смотрим скрин ниже:

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Во первых по нему вы можете перепроверить свою структуру папок. Во вторых - посмотреть, что вы сейчас будете делать. И в третьих удостовериться, что средствами Unity у вас это сделать не получится потому, что в скачанном вами ассете есть лишняя стена, которую я убрал в Blender-e. Но всё же. Перед тем, как тупо качать unitypack с исходниками, включающими сцену - постарайтесь максимально воссоздать то же самое в ручную.


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


И так, когда у нас есть сцена - по ней уже можно бегать. Но бегать нам пока не кем. Давайте создадим условного персонажа-капсулу и научим его перемещаться. С этого момента я буду рассказывать немного подробнее. Здесь уже начинается эксклюзив. Если вы не до конца не понимаете, что происходит в следующем абзаце - не пугайтесь. Если вы вообще не понимаете, о чём я говорю - посмотрите любой русскоязычный туториал по созданию сцен из примитивов. Там дадут хорошую базу.

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Поехали. Для начала - создайте в сцене пустой (Empty) объект. Он и будет нашим игроком, но на уровне абстракции. Назовём его Player. Далее, перетащите в него объект Main Camera. Это можно сделать в инспекторе. Теперь - кликните правой кнопкой мыши по нашему объекту Player и выберите создать -> капсулу. Назовите её Avatar. Это будет телом нашего игрока. Удалите коллайдер с этого объекта. Столкновения у нас должны будут обрабатываться игроком. И теперь примените материал MazeLowMan, который можно достать из скаченного нами ассета. Замечательно! Персонаж уже на 80% готов. Выберите объект Player и посмотрите на сцену. Если вы его ещё не достали, скорее всего он у вас находится ниже уровня пола. Достаньте его за видимые контроллеры (стрелочки) и установите так, чтобы цилиндр еле касался пола.


Теперь займёмся камерой. Заходим в окно Game и в иерархии выбираем объект Main Camera.

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

Теперь нам необходимо настроить удобный вид из неё. Чтобы картинка подходила для пикабу, мне приходится снимать в окне, шириной 800px. Поэтому я не буду выставлять точные значения. Сделайте так, как вам будет удобно наблюдать за персонажем от третьего лица. Желательно, чтобы камера была смещена не только назад и вверх. Но и немного вправо. Так, в последующем, будет удобнее целиться. Кстати, если камера вначале у вас вообще не рядом с персонажем - поставьте в Transform Position все нули. Так она переместится в самый центр персонажа.


Последние 10% в настройке нашего персонажа - это сделать его твёрдым телом имеющим свою массу. Делается это путём настройки двух компонентов:

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

И так. Выделяем персонажа Player в иерархии. Добавляем компонент Physics->Capsule Collider. Далее нам необходимо только настроить высоту зелёной капсулы, которая будет являться нашей физической оболочкой. Далее добавляем компонет Rigidbody. Из того же пункта Physics. Этот компонент отвечает за обработку взаимодействия физического объекта с окружением. В нём мы добавляем вес и устанавливаем галочки во всех трёх осях Freeze Rotation.


Для чего это нужно? Риджидбади, при запуске игры, обрабатывает все столкновения и делает просчёт, как повело бы это тело при столкновении. Обратите внимание, что наша капсула (как минимум) вертикальная и с очень неустойчивым основанием. Что бы случилось с такой двухметровой капсулой, стой она у вас без опоры? Она бы рухнула. То же самое сделает и Unity. Это физически корректно, но в данном случае нам это не нужно.


Всё, персонаж готов. Всё, что нам осталось - научить его ходить. Для этого нам необходимо создать новый скрипт. Скрипт у нас будет называться Player Controller и, соответственно, создать его необходимо в папке Scripts->Controllers. Возьмите этот скрипт и перетащите мышью на объект Player. Он добавится к нему, как компонент. Это потом позволит вам управлять нашим персонажем.


Далее - скрин исходника. Огромная просьба. Если вы хотите научиться программировать - набирайте ручками. Это полезно. Если не хотите... То почему вы читаете пост про геймдев? =)

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

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


Кстати, пока не забыл. Я допустил ошибку по невнимательности. Точнее просто забыл сделать, как надо. Мы создаём переменную avatar. Это единственная переменная объекта, которую необходимо задавать в ручную. Просто захватите объект Avatar в иерархии и перетащите в поле Avatar на компоненте PlayerController. Но только после того, как мы его напишем.


И так самое интересное:

Строка 7 и 11. Такие элементы позволяют выводить заголовки для групп настроек в инспектор. Удобно, если настроек планируется много.

Строка 31. Метод поиска объекта по типу. По всей сцене мы ищем объект типа "камера". Благо он у нас такой один.

Строки 47 и 48. Методы Transform.Translate и Transform.Rotate. Давайте на секунду заглянем в юнити. Выделите в иерархии любой объект и посмотрите в инспектор. Самым первым компонентом везде (кроме элементов UI, но их у нас в сцене и нет) стоит компонент Transform. Он отвечает за положение объекта в пространстве, его размер и направление. Так вот транслейт - двигает объект. Ротейт - вращает. Они оба делают это, используя компонет трансформ.

Строка 51. Тут всё немного сложнее. Да, мы тоже вращаем объект. Но как видно из названия метода - вращаем вокруг чего-то. То, вокруг чего мы вращаем задаётся первым значением. Это позиция игрока. Вторым - ось, вокруг которой вращаем. А третьим - мы должны указать, на сколько собственно вращать.

С 55 по 60 строку мы просто получаем данные ввода. И если с осями мыши ещё понятно, то почему клавиши W A S D тоже считаются осями? Всё просто. Unity - кросплатформенный движок. Чтобы не мучать себя с программированием каждой клавиши на каждом устройстве, в PlayerSettings можно задать настройки осей управления. Оси для мышей и клавиатур работают по умолчанию.

Вот и всё. Очень простой и элегантный скрипт. Я немного поленился и не доделал ограничения по высоте наклона вверх и вниз. Точнее я удалил этот метод при дебаге и поленился восстанавливать =) Поэтому не пугайтесь, что у нас есть незадействованные переменные. Мы их обязательно используем в следующий раз. А теперь заходите в редактор, убедитесь, что вы повесили PlayerController на своего Player-a, установите следующие настройки:

GTO-R StarterKit: Шаг 1 (Собираем сцену и простой контроллер персонажа) Gto-r, Gto-r StarterKit, Gamedev, Unity, Гифка, Длиннопост

И можете побегать по нашей карте. Там есть один небольшой баг с проваливанием сквозь текстуры. Разберётесь сами, как его исправить?) Если нет - покажу в комментариях.

Спасибо, что дочитали до конца. Отдельное спасибо, если честно выполняли мои рекомендации =) Это пойдёт вам на пользу в будущем. Если вам понравилось - подписывайтесь на меня и следите за новостями. Не забывайте ставить плюсы, это лучшая благодарность для автора )


Самая актуальная информация по проектам нашей команды постится в группу в контакте: vk.com/gtogamedev. Подписывайтесь, там я выкладываю исходники ещё до публикации поста (ибо на написание поста у меня ушло 4 часа). Если есть вопросы лично ко мне - добро пожаловать! Пишите мне на vk.com/tonykotdev, буду рад видеть пикабушников)


И, конечно, ссылка на исходники на Google Drive.

Показать полностью 7
49

И снова, после долгого отсутствия...

И снова, после долгого отсутствия... Gamedev, Длиннопост, Gta vice city

Привет, друзья! Я уже успел по вам соскучиться. Правда-правда. Но не хватает времени на написание поста. Спасибо всем, кто остаётся на связи и иногда тыкает меня палочкой, чтобы удостовериться, что я ещё не умер. Да, проект всё ещё жив, и в том числе - благодаря вам!


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


И так. Как же дела с GTA Vice City?
Честно, не так радужно, как бы мне хотелось. Я растерял бОльшую часть нашей команды и именно по своей вине. Но об этом чуть позже. Времени на проект у меня лично остаётся достаточно мало, но вот с середины июля я решил все выходные (ну или большую их часть) посвещать игре. Сильно не ругайтесь. Я предупреждал, что для меня это - хобби.

Есть ли, что показать? К сожалению, нет. Я, в основном, если и кодил, то занимался скорее исследованиями в сфере создания универсального контроллера персонажа, для таких игр, как наша. С автоматическими просчётами окружения для более реалистичного взаимодействия. Но есть и хорошие новости.


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

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

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


С какими проблемами мы уже столкнулись?

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

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

Работа с командой. Добровольцы - это хорошо. Ещё раз хочу поблагодарить КАЖДОГО кто откликнулся на моё предложение принять участие в проекте. Но чем больше людей работает над проектом, тем меньше времени остаётся на разработку лично у меня. Это не помешает всяким там там "идейным вдохновителям", но для меня это было и остаётся проблемой. Ставить задачи, принимать участие в обсуждениях... При большой занятости (я фрилансер, у меня не нормированный рабочий день) - это съедает львиную долю времени.

Отсутствие профессионалов. Опытный человек вряд ли будет тратить время на такую ерунду. В конце концов, если ты на работе, допустим, делаешь модели - делать то же самое дома, да ещё и бесплатно, вряд ли будет интересно. Поэтому... Мало, у кого можно спросить совета. Но всё же могу выразить отдельную и огромную благодарность Саше. Не буду называть его фамилию, но Саша активно помогал нам советами. Делился своим опытом и дал много ценного команде.

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


Что-то ещё? Да, конечно. Но это, наверное, основное.


Покажи хоть что нибудь!

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

И снова, после долгого отсутствия... Gamedev, Длиннопост, Gta vice city

Для тех кто не помнит (или даже не знает) - это остров морской звезды. На скрине просто экспортированная из оригинальной игры моделька. Её мы и переделываем.

И снова, после долгого отсутствия... Gamedev, Длиннопост, Gta vice city

Так на данный момент выглядит мультиплеер. Специально "для друзей" могу сказать, что это бесплатная моделька из Unity Asset Store и используется она исключительно в демонстрационных целях. Кстати. Мультиплеер, пока что, строится на фотоне. Потому, что нет времени писать ещё и серверную часть... Так, что, как бы печально это не звучало, мы можем поднять не более 20 человек одновременного онлайна. Ограничения Free версии.

И снова, после долгого отсутствия... Gamedev, Длиннопост, Gta vice city

Вот так вот мы проектируем дома. Они почти полностью похожи на оригинальные. Единственное отличие - мы стараемся сделать архитектуру реалистичнее. Это, кстати, промежуточный результат. Модель ещё не оптимизирована и содержит родные текстуры.

На этом пока всё. Следите за новостями =)



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


P.S. Ещё раз прошу написать в комментариях, нужно ли поэтапно расписывать создание игры? Показывать ли, как самим с нуля написать то, что мы делаем?

Показать полностью 3
190

Мы сделаем свою GTA! Ответы на вопросы.

Мы сделаем свою GTA! Ответы на вопросы. GTA, GTA Vice City, Gamedev, Длиннопост

Привет, пикабу! Пишу вам под впечатлением от реакции сообщества на предыдущий пост =)
Хочу сказать спасибо всем, кому понравилась наша идея. Не ожидал на данном этапе привлечь внимание такого количества людей! А так же огромное спасибо всем тем, кто откликнулся на моё скромное предложение и захотел принять участие в проекте. Ребята (и девчата), вы разбудили во мне веру в человечество! ))

Честно, не ожидал, что столько хороших людей согласится тратить своё личное время на достаточно тяжёлую работу. Я до сих пор не успел всем ответить, на данный момент у меня висит 20 непрочитанных. Не обижайтесь, ребят, я всем отвечу!


Но пост этот я решил выпустить совершенно по другой причине. Как в комментариях, так и в личных сообщениях, приходит очень много однотипных вопросов о том, что мы делаем и главное, зачем мы это делаем, если GTA Vice City уже есть и всеми пройдена.

Расскажу, к чему мы стремимся...

Мы сделаем свою GTA! Ответы на вопросы. GTA, GTA Vice City, Gamedev, Длиннопост

Сумасшедший мультиплеер в родном сеттинге Vice City.
Игра разрабатывается с целью игры в мультиплеере. Исключительно онлайн. Не будет старых миссий, не будет новых миссий. Будет абсолютно новый геймплей с множеством развлечений.

Всё я тут не перечислю, но опишу основные онлайновые фишки:

1 - Банды. Собирайте с друзьями (и не только) банды и принимайте участие в погонях, перестрелках и войнах кланов за территории.
2 - Гонки. Каждый перекрёсток - старт для одной из гонок на сервере. Делайте ставки, господа, банк сорвёт быстрейший! И, да... Помните... Никаких правил.
3 - Дезматчи. У вас есть неограниченное количество жизней и оружия. Цель - уничтожить как можно большее количество противников и постараться не умереть!
4 - Разнообразные мини миссии. Ну как мини? Представьте себе ограбление колонны инкассаторов, принадлежащих фракции федералов, ордой игроков с сервера? Чей клан сможет доставить груз до своего дома - тот и сорвёт куш! А может быть победит одиночка?))

А так же множество приятностей в виде покупки недвижимости, бизнеса, эксклюзивного транспорта и широких возможностей кастомизации персонажа (одежда, цвета) и транспорта (цвета, узоры, логотипы).

Теперь интереснее?) Ну и да. Главное - никакого доната!

Мы сделаем свою GTA! Ответы на вопросы. GTA, GTA Vice City, Gamedev, Длиннопост

Абсолютно новая графика. И когда я говорю абсолютно новая, я имею ввиду - никаких старых квадратных машин и персонажей. Никаких серых улиц и блёклых текстур. Да, теперь у нас 100% есть такая возможность. Спасибо за это всем пикабушникам, кто откликнулся на моё предложение!
Но тут стоит предупредить. Не ждите GTA V. Мы - не профессионалы. И если сделаем игру такого качества, попросту не сможем её оптимизировать. Но да! Мы постараемся выжать из движка максимум, на что он способен =)

Мы сделаем свою GTA! Ответы на вопросы. GTA, GTA Vice City, Gamedev, Длиннопост

В общем... Игра задумывается как хорошая возможность отдохнуть вечером с друзьями в мультиплеере. Мы будем всеми силами стараться не испортить атмосферу оригинала, но привнести в неё всё лучшее из современных игр. Получится ли у нас это? Не сомневайтесь =) Единственное, я не устаю повторять - проект это потенциальный долгострой. Возможно, через года полтора мы с вами сможем поиграть в какую нибудь сырую бета версию. Но когда игра дойдёт до релиза - этого вам не скажет никто

У нас впереди очень много работы, но теперь нас больше! Ещё раз спасибо всем, кто уже откликнулся на моё предложение! И по прежнему мы будем рады видеть в наших рядах добровольцев! Контакты я выложу в комментарии под постом.

Спасибо, что следите за обновлениями!

Показать полностью 2
1412

Мы сделаем свою GTA... [продолжение, после ОГРОМНОЙ паузы]

Привет, пикабу! Я уже очень давно публиковал информацию о том, что начал разработку GTA VC на движке Unity. И не один, а с небольшой командой. К нам постепенно присоединялись пикабушники... Но по моей вине многие ушли. 


Ребята, я публично прошу прощения за долгое отсутствие. Очень много работы, я часто работаю до пяти утра, потом встаю в 10 и снова за работу. Но проект я не забыл. Более того, есть ребята, которые проект не бросили и успешно работают. В этом посте я покажу, что за это время было сделано. Увы, без меня.


Начнём с самого главного. Пикабушник с ником @Sarokuzo, в одного (!!!) всё это время собирает карту. Всё начиналось с экспорта родных моделей из VC. Сейчас мы уже готовим всё это дело к использованию в движке Unity. @Sarokuzo, спасибо тебе большое за то, что откликнулся на моё скромное предложение и со всей ответственностью подошел к делу.

Мы сделаем свою GTA... [продолжение, после ОГРОМНОЙ паузы] Gamedev, Unity, Gta, GTA Vice City, Длиннопост

Так же огромное спасибо пикабушнику @MichanIV. Он помогает делать красиво =) Благодаря ему у нас потихоньку появляется пользовательский интерфейс (фоновая картинка найдена в интернетах, у нас, пока ещё, не так красиво).

Мы сделаем свою GTA... [продолжение, после ОГРОМНОЙ паузы] Gamedev, Unity, Gta, GTA Vice City, Длиннопост

Ещё, некоторое время, с нами работал пикабушник по имени Юра. Я не брал разрешения на деанонимизацию его профиля, поэтому будет просто имя. Главное, чтобы он себя узнал =)
Благодаря Юре я сильно продвинулся в понимании работы с анимацией в Unity. Точнее говоря с конвертацией анимации из GTA IV в Unity. Поверьте мне, это очень непростой процесс и до конца мы разобраться так и не смогли, но без него я бы так не продвинулся.


В общем... Ребят, огромное спасибо всем, кто откликался на моё приглашение к сотрудничеству. Вы взяли на себя смелость помочь в создании такого непростого долгостроя =) И ещё раз прошу прощения. Особенно у программистов. Они так и не начали работать из-за того, что я так и не подготовил базовые классы.


А тем, кто меня читает и хочет попрактиковаться в работе с 3D (или 2D) графикой - я буду рад видеть вас в команде разработчиков нашей GTA! Благодаря пикабу мы доведём проект до конца. Я вам обещаю =) А напоследок - мейн скрин:

Мы сделаем свою GTA... [продолжение, после ОГРОМНОЙ паузы] Gamedev, Unity, Gta, GTA Vice City, Длиннопост
Показать полностью 2
105

Разработка 2D игры на Unity (5/5) "Сборка проекта"

Разработка 2D игры на Unity (5/5) "Сборка проекта" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст

Привет, пикабу! Спасибо, что проявляете интерес к моему далеко не профессиональному творчеству =) И спасибо знатокам - за замечания строго по делу. Этот пост будет крайним в этой серии, но если вам будет интересно узнать, как портировать проект на мобильные устройства - я напишу ещё один, бонусный пост по этой игре.


Хронология постов:

1 - Знакомство с редактором.

2 - Подготовка сцены.

3 - Основы скриптинга в Unity.

4 - Логика игры. И продолжение поста о логике.

А так же ссылка на исходники, расположенные на гуглодиске. По прежнему без кода.


Начать хотелось бы с того, что я вспомнил об одной ошибке. Я забыл добавить в пост проверку нажатия клавиши пробел. Как следствие - игра бы не запускалась =) Но это даже хорошо. Будет возможность сразу столкнуться с ежедневной рутинной задачей программиста - поиском багов. Будем считать, что эта ложка дёгтя для того, чтобы не очаровываться.

Но, всё равно прошу у вас прощения за допущенную оплошность.


В этом посте я расскажу, как делается сборка проекта под ОС Windows. Задача эта неимоверно проста, поэтому букв тут будет не так много. Для начала, открываем меню File, выбираем пункт Build Settings, и в открывшемся окошке (в самом низу) ищем кнопочку Player 

Settings. Нажимаем её, и нам откроется вот такой чудесный вид:

Разработка 2D игры на Unity (5/5) "Сборка проекта" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст

Сегодня всё, что нам понадобится - поместилось на одном скрине. Но, обо всём по порядку.


Окно Build Settings содержит в себе минимальные настройки, необходимые для сборки проекта. Первое, что необходимо сделать - добавить в проект нашу сцену. Делается это одним из двух способов, либо нажимаем кнопочку Ad Current, либо перетаскиваем файл сцены из окна проекта и бросаем его в поле Scenes In Build.


Обратите внимание на цифру ноль, справа от названия файла сцены. Это её порядковый номер. Если сцен в вашем проекте несколько - помните. Та сцена, что должна будет грузиться первой - должна получить идентификатор ноль. Иначе - случится ужасное. Unity автоматически подгрузит вместо вашего чудесного вступительного ролика - сцену, что случайно получила главный идентификатор.


Далее - нам необходимо выбрать, под какую платформу мы будем делать сборку. Тут сразу оговорюсь, что для сборки под Android, вам необходимо будет установить дополнительное ПО. Самое важное - Android SDK. Без него Unity откажется производить сборку. А без остального софта - откажется вставать сама SDK. Поэтому закатываем губу и выбираем пункт PC, Mac & Linux Standalone. Справа - выбираем платформу Windows и поддерживаемую архитектуру. Фактически - готово. Чтобы показать игру маме и бабушке - нам достаточно того, что мы уже сделали и можно смело нажимать кнопочку Build And Run.

Ну а для тех, кто всё таки хочет учиться - расскажу ещё о нескольких настройках, необходимых для того, чтобы сборка выглядела прилично. Обратите внимание на инспектор. Если там ничего нет, ещё раз нажмите кнопочку Player Settings в окне сборки.


Здесь нам понадобится всего несколько пунктов:

Поля Company Name и Product Name - позволят указать название игры и разработчика.

Default Icon - это иконка нашей игры. Можете нарисовать что нибудь более красивое, я просто поставил один из спрайтов нашего волка.

В окне Resolution & Presentation в пункте Resolution снимаем галочку с Default Is Full Screen. Во первых потому, что графика игры - не торт. А во вторых, чтобы избежать конфуза с выдёргиванием компьютера из розетки, ибо мы с вами не предусмотрели кнопку выхода.

В той же вкладке, но в пункте Stanalone Player Options, необходимо выбрать Disabled в пункте Display Resolution Dialog. Этот пункт позволяет отключить окошко, выводящее настройки управления в игре, перед запуском приложения.


Ну вот и всё. Теперь можно нажать Build And Run в окне сборки и наслаждаться игрой. Напомню, что моя цель - не научить вас, как НАДО делать игры. А помочь сделать первые шаги в сторону игровой индустрии. Поэтому, у вас остался простор для доработки игры. Сделайте увеличение скорости игры, по мере её прохождения. Выводите экран победы или поражения. Экспериментируйте, друзья! Это интересно!


Спасибо, что дочитали серею до конца. Огромное спасибо всем, кто на меня подписался. Очень надеюсь, что вам было интересно. Пожалуйста, напишите в комментариях, будет ли вам интересна серия постов по созданию трёхмерной игры? Это будет шутер от третьего лица, наподобие игры Alien Shooter. А главным героем станет - Марио =)


Не забывайте ставить плюсы, чтобы поблагодарить автора. Это лучшая мотивация, чтобы сидеть ночью и писать. А так же подписывайтесь, чтобы не пропустить новые посты! ;)

Показать полностью 1
209

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)"

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Привет, пикабу! Да-да, в заголовке не ошибка. Это пост под номером четыре с половиной и является продолжением предыдущего поста. Прошу прощения, что пришлось делить посты.

И, как обычно. Внимание! Очень длиннопост!

Хронология постов:

1 - Знакомство с редактором.

2 - Подготовка сцены.

3 - Основы скриптинга в Unity.

4 - Игровая логика.

Ссылка на ассеты (гуглодиск). Там до сих пор всё, кроме скриптов.


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

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Снова перейдём к скрипту Game. Нам осталось совсем немного его дополнить.
Для начала - нужно создать функции запуска (StartGame, 173 строка) и остановки игры (StopGame, 202 строка). Тут не происходит ничего нового и пояснений потребуют всего три строки, поэтому я не буду описывать работу построчно, а обрисую всё в общих чертах. Итак:


Функция StartGame переключает флаг состояния игры в true и скрывает надпись, предлагающую нажать "Пробел", чтобы начать. После чего активируется спрайт первого положения волка и, соответственно, переменная playerPos, получает значение "1". Обнуляем счётчики, скрываем иконки разбитых яиц и запускаем корутин Timer.


Функция StopGame переключает флаг состояния игры в false и останавливает корутины. Далее, отключаем все объекты яиц в массивах, а так же скрываем со сцены игрока. После чего - выводим надпись "Нажмите...".  Далее ищем все созданные нами сущности и удаляем.


Что тут есть интересного? Во первых - функция StopAllCorutines, которая останавливает все корутины из этого скрипта. Во вторых - процесс удаления сущностей наших яиц. В принципе - ничего необычного. Мы создаём массив из всех объектов, имеющих тег "zero", а затем проходимся циклом и удаляем все объекты, кроме того, с которого делаем копии. В этом нам поможет приписка "(Clone)", любезно добавляемая юнити к каждому копируемому объекту.

Заметьте, если бы мы создавали объект из префаба, а не копировали его со сцены, мы могли бы избежать проверки имени перед удалением. Необходимость упомянуть процесс создания копии объекта со сцены, я уже озвучивал. А вы, если хотите, можете самостоятельно усовершенствовать код, копируя префаб и убрав проверку имени перед удалением.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

На анимашке выше показано - как добавить тег к объекту. Он нам будет необходим.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Далее, давайте создадим ещё три простых функции:


Функция Step (150 строка) - будет только лишь воспроизводить звук "шага". Делается это вызовом функции Play у переменной, содержащей соответствующий звук.


Функция Count (151 строка). Каждый раз, при её вызове, будет добавлять по единичке к счётчику пойманных яиц (строка 153), передавать обновлённое значение на элемент интерфейса, выводящего счётчик, помещая в его поле text - текущее значение счётчика, конвертированное в строковой формат (строка 155) и воспроизводить звук "поймал".


Функция Crash (159 строка) будет вызываться каждый раз, когда игрок не поймает яйцо, добавляя к счётчику потерянных яиц единичку (строка 161) и воспроизводя звук "уронил". А далее, в зависимости от количества потерянных яиц, мы либо включаем отображение следующей иконки, либо останавливаем игру, выполняя функцию StopGame (165 - 169 стр).


Мои поздравления! Мы закончили с функцией Game! Давайте перейдём к написанию Egg.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Все типы переменных нам уже известны. Зачем они нужны - написано в комментариях.
В функции старт - уже известная нам функция, запускающая корутин. Тоже не интересно.

А вот в функции апдейт уже есть небольшая логическая часть. Единственное условие, проверяющее: если номер шага равен пяти (состояние свободно падающего яйца), и положение игрока соответствует числовому значению спавна данного яйца (19 строка)...

... то мы вызываем функцию Count из скрипта Game (строка 20), деактивируем текущее яйцо (оно пятое по счёту, но расположено в 4 ячейке т.к. заполняли мы их начиная с нуля) и после этого удаляем игровой объект, к которому прикреплён текущий скрипт (строка 25).

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Теперь давайте создадим новый корутин. Назовём его Steps. Суть функции проста - включать последующее яйцо, каждый "шаг" и отключать предыдущее. Но мы знаем, что у первого яйца - нет предыдущего, а у последнего - следующего. Поэтому, создадим условие:


Если шаг равен нулю - активируем яйцо, соответствующее текущему шагу.


Если шаг равен 10 - удаляем игровой объект, к которому прикреплен текущий скрипт.


Иначе - включаем яйцо соответствующее текущему шагу, отключаем яйцо, соответствующее текущий шаг минус один (предыдущее) и далее делаем ещё одну проверку. Если шаг равен пяти - выполняем функцию Crash из скрипта Game. Иначе - выполняем Step оттуда же.


Но, не смотря на то, какой сейчас шаг - прибавляем к нашему счётчику шагов единицу, ожидаем... И перезапускаем корутин.

На этом создание скриптов закончено. Да, всё так просто =) Проверьте работоспособность и, если что-то не так (ну вдруг, я пишу посты по ночам и с большими перерывами между выпусками) - пишите в комментариях. Я отвечу, как исправить ошибки.


В следующем посте мы поговорим о сборке нашего проекта под платформу PC. А если вам будет интересно - я сделаю бонусный, шестой пост, о том, как сделать сборку под Android.

Если вам понравился пост - не забывайте ставить плюсы (это лучшая благодарность для автора), а так же подписывайтесь, чтобы не пропустить новые посты ;)

Показать полностью 4
23

Разработка 2D игры на Unity (4/5) "Игровая логика"

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Привет, пикабу! По итогам вчерашнего поста на меня подписались ещё 52 человека. Спасибо вам, друзья, что проявили интерес. Буду стараться не разочаровать. Поэтому сегодня я снова не лёг спать, а сел пилить для вас очередной пост =)

Внимание! Очень-очень длиннопост!


Хронология постов:

1 - Знакомство с редактором.

2 - Подготовка сцены.

3 - Основы скриптинга в Unity.

И по вашей просьбе - ссылка на ассеты (гуглодиск). Там все исходники, кроме скриптов.


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

А начнём мы с перемещения персонажа. Для начала, давайте договоримся, что в управлении будут принимать участие четыре клавиши. Левый шифт, правый шифт, левый контрол и правый контрол. Чуть позже мы задействуем пробел, но я вам этого не говорил =)

Теперь запустим Unity и снова откроем для редактирования наш скрипт Game.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Оставим в покое функцию Start, которую мы заполняли в прошлом посте и перейдём к функции Update. Напомню, что она вызывается каждый раз перед обновлением кадра. А это значит, что производить смену положения игрока нам нужно именно здесь.

За перехват событий ввода, в Unity, отвечает класс Input. Поэтому - пишем условие, в свойствах которого укажем, когда игрок нажимает на кнопку Left Shift, нам необходимо...


Тут сразу оговорюсь. Мы можем перехватывать аж три события ввода. Игрок нажал клавишу (GetKeyDown) - вернёт true в тот момент, когда клавиша будет нажата. Игрок отпустил клавишу (GetKeyUp) - вернёт true в тот момент, когда клавиша будет отпущена. И состояние клавиши (GetKey) - будет возвращать true, пока клавиша нажата и false, если игрок эту клавишу не трогает. В нашем случае производится однократное действие и было бы удобнее, если бы оно производилось именно по нажатию на кнопку.


Итак. Свойства условия (строка 91) мы заполнили. Давайте перейдём к его телу. Давайте рассуждать логически. Во первых нам необходимо сообщить скрипту, какое положение сейчас занимает игрок. Хорошо, присвоим переменной playerPos единицу. Далее нам необходимо включить спрайт, соответствующий данному положению. Ставим флаг активности объекта player1 в состояние true. А оставшиеся спрайты нам необходимо отключить. Вдруг, до этого мы занимали другое положение. Деактивируем объекты player2, player3 и player4.


Строки с 90 по 99 - заполнены. Все остальные положения мы меняем по тому же принципу. Не забывая менять названия клавиш и вспоминать, где какой объект расположен.


С перемещением персонажа разобрались. Пришло время научить вас плохому слову. А слово это - КОРУТИН. На хабре видел спор, что это девочка (женский род). Но я, со своим знанием английского на уровне пятого класса, слово Corutine читаю как корутин. Можете меня побить.

Так что же такое корутины? Корутинами называют сопрограммы. То есть функции, которые выполняются параллельно основному потоку и позволяют делать временные задержки, не прерываясь и не мешая выполнению функции Update. А теперь я вас окончательно запутаю и скажу, что выполняются они всё таки НЕ параллельно, но вы это можете забыть, так как пишу я это для знатоков, которые уже приготовились плеваться в комментариях. Если интересно, как работают сопрограммы - гуглите. Нас интересует только одно её свойство. Задержка.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Итак. Суть нашей игры в том, что через какие-то промежутки времени, на сцене появляется новое яйцо. И через те же самые промежутки времени эти яйца "падают", то есть перемещаются вперёд на одну позицию. Как это организовать? Если спавнить яйца в функции апдейт, мы просто не успеем их ловить... И тут нам поможет магическая функция - корутин.


Обратите внимание, для того, чтобы корректно создать корутин, необходимо выполнить два условия: первое - функция должна начинаться с надписи IEnumerator (129 строка). Второе - функция должна возвращать yield (144 строка).


Давайте создадим корутин с названием Timer. Он, через равные промежутки времени, будет создавать на сцене новый игровой объект. Делается это функцией Instantiate. А образом и подобием ему станет объект, закреплённый за переменной zero. Дадим имя egg создаваемому объекту, чтобы было удобно с ним работать далее (131 строка).

Далее, нам необходимо повесить на него скрипт Egg, так как он будет отвечать за созданную сущность. Каждый прикреплённый к объекту скрипт называется компонентом. Поэтому создаём переменную comp и указываем, что она будет создавать компонент Egg на объекте, хранящемся в переменной egg (133 строка).

Теперь, в созданный нами компонент, необходимо передать несколько параметров. Для начала - присвоим ссылку на текущий скрипт (Game) в переменную comp.game (135 строка). Далее, нам необходимо определить, в каком месте появится яйцо. В этом нам поможет рандом. Запишем в переменную comp.spawn рандомное значение от 1 ДО 5 (137 строка). Пять не включается. Ну и, в зависимости от того, какой нам выпал спавн - записываем соответствующий массив яиц в переменную comp.egg (строки 139 - 142).


Вся логика корутина готова. Теперь нам необходимо задать паузу. Чтобы это сделать, нам необходимо вернуть yield с функцией WaitForSeconds, в свойствах которой указать время задержки. В нашем случае - это переменная time (144 строка). Как понятно из названия, эта функция ожидает, в течение указанного в свойствах времени (в секундах). После чего продолжает выполнение корутина. Но нам, после паузы, необходимо повторить все те же действия, поэтому мы просто перезапускаем корутин. Запуск корутина осуществляется функцией StartCoroutine, с указанием корутина в её свойствах (146 строка).


Уфф... Я вас поздравляю, вы прочитали уже очень много букв. Отдохните от текста и скачайте с гуглодиска исходники. Там лежат звуки и шрифт. Сейчас они нам пригодятся.

Лучший отдых - это смена вида деятельности =) Поэтому переходим в редактор Unity и импортируем загруженный пак в проект. Делается это в меню Assets -> Import Package -> Custom Package. Выглядит это вот так:

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Возможно, вам не нужны все исходники, которыми я с вами делюсь. В открывшемся окне можете просто снять галочки с тех, что вам не нужны. Далее нажимаем Import и все файлы появятся в вашем окне Project. Нас интересует папка Sounds и шрифт Electron.


Возвращаемся к редактированию скрипта Game и добавим ещё несколько переменных.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Переменная типа TextMesh с именем counter - будет хранить счётчик пойманных яиц.

Три переменные типа GameObject с именами hp1, hp2 и hp3 - будут хранить иконки "штрафных очков", то есть индикаторы тех яиц, что игрок уронил.


Переменная типа GameObject с именем pressStart будет хранить объект надписи "нажмите такую-то кнопку, чтобы начать".


Три переменные типа AudioSource c именами soundStep, soundCrash и soundCount будут хранить звуковые файлы, которые мы будем воспроизводить каждый "шаг", при разбитии и при поимке яйца, соответственно.


Булевая переменная со странным именем isPlaying будет сообщать нам, воспроизведена ли сейчас игра. По умолчанию присвоим ей значение false.


Готово. Переменные есть, давайте вернёмся в редактор и поместим на сцену новые объекты. Создадим два пустых объекта и назовём их GUI и Sounds.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Перетащим звуки на сцену, сделаем их дочерними объекту Sounds и перетащим звуки в соответствующие переменные скрипта Game на объекте Main Camera.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Теперь графические элементы (GUI от "графический юзер интерфейс").

Идём в папку со спрайтами и ищем картинку разбитого яйца с цыплёнком. Помещаем его на сцену. Трижды. Далее в инспекторе - необходимо выставить их положение.

Теперь давайте создадим два объекта с текстом. Нажимаем правой клавишей мыши, 3D Object -> 3D Text. Один назовём Counter, а другой Press Start. После того, как объекты созданы - перетащите их в соответствующие поля скрипта Game на объекте Main Camera.

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Ну и давайте настроим наши надписи. Начнём со счётчика. Выбираем объект Counter и идём в инспектор. Изменим позицию, чтобы шрифт было чётко видно (отдалив его по оси Z) и разместим надпись в правом верхнем углу экрана. Изменим текст на "0", размер шрифта поставим 50, а сам шрифт перетащим из окна проект. Цвет выберем пипеткой. Готово. 

Разработка 2D игры на Unity (4/5) "Игровая логика" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Прошу прощения за обрезанную гифку. Сайт просит не больше 800px.

По тому же примеру, размещаем надпись "Press Start" в центре. Только не меняя шрифт. Напишем текст "Нажмите пробел, чтобы начать". Теперь наша сцена полностью готова.


На этом на сегодня я закончу. Так как пост уже набирается слишком длинный, чтобы его осилить за раз. Во второй части мы закончим скрипт Game и напишем скрипт Egg.


Спасибо, что прочитали до конца и подписывайтесь, чтобы не пропустить следующий пост ;)

Показать полностью 7
Отличная работа, все прочитано!