Необходимо войти или зарегистрироваться

Авторизация

Введите логин, email или номер телефона, начинающийся с символа «+»
Забыли пароль? Регистрация

Новый пароль

Авторизация

Восстановление пароля

Авторизация

Регистрация

Выберите, пожалуйста, ник на пикабу
Номер будет виден только вам.
Отправка смс бесплатна
У меня уже есть аккаунт с ником Отменить привязку?

Регистрация

Номер будет виден только вам.
Отправка смс бесплатна
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
Авторизация

Профиль

Профиль

TheodorTalion

TheodorTalion

Пикабушник
16 727 рейтинг
4852 комментария
7 постов
0 в "горячем"
Показать полную информацию

Валянный Пикачу

TheodorTalion в Рукодельники

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

Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост

Если смотреть на него сверху, то он явно недоволен :D

Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост

И несколько забавных фото до набивания глаз и удаление лишних волосков:

Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Валянный Пикачу Рукоделие без процесса, Сухое валяние, Пикачу, Покемоны, Длиннопост
Показать полностью 9

Заложники одной темы : предложение по улучшению сайта

TheodorTalion в Предложения по Пикабу

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

Пример:
Человек создал серию постов, которые освещают какое-то общественное событие, к нему набились десятки тысяч подписчиков, но тема себя исчерпала в связи с завершенностью. После этого, через какое-то время, человек постит какие-то другие посты, связанные с своим хобби (а может у человека несколько хобби) и 99% подписчиков удивлены - откуда у меня в ленте не интересующий меня контент? Подписчикам нужно отписаться, постер видит что люди отписываются, ставят ему минусы, потому что контент не интересен и тд.

Решение:
Ввести спец. топики (либо не индексируемые теги) для каждого пользователя.
Например, постишь с тегом "воры в музее" (предварительно выбрав это как личный тег) и люди подписываются на твои посты с этим тегом. (*1 сноска с пояснением)
Потом постишь с тегом "как я ворую в музее" и люди, подписавшиеся на первый тег не видят эти посты у себя в ленте, т.к. она для них не актуальна.

Пояснение:
*1: Подписываемся имеется ввиду не на тег, а на пользователя, перейдя к нему в профиль и после нажатия кнопки "подписаться" выбрать нужный личный тег пользователя под которым он уже запостил какие-то посты (либо дать возможность создавать теги заранее, даже пока постов не было).

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

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

Как разрулить ситуацию с текущими постами без таких тегов и подписками:
Пусть изначально у каждого человека будет топик "Общий" (название такого можно не показывать) и пусть считается, что все люди, подписавшиеся на человека подписались на этот топик (дать ему просто id = 0) и сам постер может изменить название топика под id = 0, т.к. в настоящее время многие все же стараются постить одинаковые темы, а для новых тем создают новые аккаунты.


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

Отчет о разработке #1

TheodorTalion в Лига Разработчиков Видеоигр

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

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

В целом, за всю неделю я сделал следующее:

-------------------------------------------------------1. Персонаж--------------------------------------------------------
Набросал общий вид персонажа, включающий в себя все характеристики, которых всего 13 (это только общедоступные, т.е. те, которые будет видеть игрок); Вот список характеристик и то, на что они влияют:
- сила - урон от ударов, дальность физических толчков, незначительно влияет на защиту персонажа;

- ловкость - шанс критического урона, восстановление выносливости, незначительно влияет на защиту;

- виталити - кол-во хп;

- выносливость - кол-во выносливость, которая тратиться на использование физ. умений;

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

- маг. сила - урон от заклинаний, дальность маг. толчков\притяжений, незначительно влияет на маг. защиту;

- маг. выносливость - кол-во мп;

- кол-во ходов - количество очков, которое может быть потрачено на действия в одном ходу;

- красноречие - для не боевых событий и влияет на стоимость предметов при торговле;

- физ-армор (временный), физ-армор (постоянный) ну и такие же маг арморы. Временный - значит что армор заменяет хп, а постоянный, что от каждой атаки отнимает значение.

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

------------------------------------------------------2. Способности-----------------------------------------------------

Добавил несколько способностей разных типов, чтобы представлять какие у меня будут типы ударов, движений и тд. Я лучше просто опишу способности, которые я реализовал сейчас. Думаю, на опыте поймете что к чему.
-----------Общие:
- Движение вперед-назад;

-----------Физические:

- Атака - простой удар перед собой;

- Разбег (Charge) - быстрое передвижение на n кол-во клеток и, если на пути есть враг, то атака его;

- Физ. толчок - если перед вами стоит враг, то оттолкнуть его на n клеток назад;

- Стан - не дает произвести следующее действие противнику (только одно);

-----------Магические:
- Огненный шар - простое направленное заклинание;

- Маг. толчок - толчок врага на отдалении;

- Вызов преграды - создание преграды перед персонажем, через которую нельзя пройти;


Я просто сделал по одному примерному типу действий, которые потом будут несколько мутировать, изменяя свои характеристики и тд., но в целом будут выполнять такие же функции.


К слову, с магией у меня возникали концептуальные вопросы. Изначально я думал колдовать магию по 3-м линиям и двигать её не мгновенно (как сейчас), а чтобы она летела с определенной скоростью (n кол-во клеток каждое действие), но про линии передумал, ибо это лишнее усложнение, скорее всего, а про определенную скорость не уверен. Как вы считаете, стоит двигать заклинания мгновенно, как сейчас или лучше с определенной скоростью на ход, как описано выше? (также, скорее всего, будет добавлена дальность на которой заклы летят)

-----------------------------------------------------------3. Битва---------------------------------------------------------

Изначально я слабо представлял как вообще будет выглядеть битва, но вышло так, что...эм...жанр сражения получился...эм...пошаговый файтинг штолэ? (Там дальше видос будет примером).

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

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

Ну, в целом, это все что я сделал за неделю. Вроде бы не так и много на словах, но на деле добрую 1000 строк я написал (хотя проблема была прежде всего в том, что я не представлял себе что я вообще хочу видеть). Однако, после рефакторинга останется строк 300-500, скорее всего.

Следующий пост будет через 4-7 дней и будут сделаны следующие действия:
1-2. Рефакторинг способностей и битвы до финального (пока что) состояния;

3. Создание меню наград (и мб еще что-то по мелочи);
4-5. Добавление модуля предметов персонажей, создание первых экземпляров предметов;

6-7. Модуль магазина и торговли.

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

Всем спасибо за внимание!

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

Кодовый парусный корабль #4

TheodorTalion в Лига Разработчиков Видеоигр

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

Предыдущий пост: https://m.pikabu.ru/story/kodovyiy_parusnyiy_korabl_3_509471...
Гит для тех, кому лень читать: https://gitlab.com/open_sourse/pirate

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

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Рассмотрим дополненный спрайт пули. Теперь он умеет взаимодействовать с объектам. Особенность в том, что данный способ взаимодействия отличается от тех способов, которые обычно приводятся в уроках. Зачастую в уроках делают проверку на тэг объекта, либо имя и тд.(но это жесть, ибо если будут добавлять новые объекты, то нужно будет прописывать взаимодействие), а тут мы проверяем есть ли у объекта компонент UniApp.General.Effects - это общий компонент для всех объектов, которые в принципе могут взаимодействовать с другими объектами. Т.е. у корабля есть такой компонент, у препятствия...ну, короче, у всех типов объектов на карте с которым можно будет взаимодействовать.

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Вот сам вид эффекта. Тут есть делегат и экземпляр делегата. Сейчас он принимает аргумент пули, однако, в дальнейшем он будет принимать какой-то общий класс для всех классов, которые могут нанести урон.

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Для дальнейшего рассмотрения обсудим абстрактные размышления о том как умирает корабль, ему наноситься урон и тд.
У каждого объекта класса есть HP, Wearout, armorValue и ArmorCount (вот снизу переработанный класс item, чтобы было более понятно).

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Когда кораблю наносят урон, то отдельные части корабля получают урон HP и Wearout (это износ). Зачастую Wearout у корабля гораздо больше, чем HP, потому что HP можно восстановить до посещение порта, а Wearout - нет. И когда у корабля заканчивается хп в бою, то по Wearout отдельной части корабля наноситься двойной урон.

Однако, если у всех частей хп полностью заканчивается хп (а износ еще остается), то корабль считается уничтоженным. Также, если у корабля осталось хп, но кончилось Wearout, то он тоже считается уничтоженным (хотя тут это не видно, потому что я забыл это добавить).


Таким образом весь класс ShipEffect занимается принятием в себя урона, первую часть можно увидеть до обсуждения, а вторая вот:

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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


Так вот, расскажу немного об основной задумке, которую я во многом реализую за следующие 2 недели:
т.е. игра-то по сути не про корабли будет, потому что игры про баталии кораблей - это унылость, по моему мнению. Корабли - это просто основное средство передвижения в игре и игровой процесс в принципе не будет поощрять уничтожения кораблей противника, потому что гораздо выгоднее взять корабль на абордаж, проведя сражение на корабле (это отдельный модуль), чтобы набрать побольше лута и захватить рабов. Однако, будут отдельные корабли, которые особо не приносят лута (сопровождение жирных кораблей) - их как раз можно расстреливать без особых потерь.


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

Кодовый парусный корабль #4 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Скорее всего, я буду сообщать о успехах разработки примерно раз в 4-7 дней, но уже без кода, ибо код, думаю, не особо интересен людям (потому что ничего гениального не делает).


Всем спасибо за внимание!

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

Кодовый парусный корабль #3

TheodorTalion в Лига Разработчиков Видеоигр

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

Предыдущий пост: https://m.pikabu.ru/story/kodovyiy_parusnyiy_korabl_2_508993...
Если нет желания читать, самые актуальные файлы тут: https://gitlab.com/open_sourse/pirate

Начну с краткого пояснения:
1) Я решил отойти от модели проектирования, когда сначала писался класс на чистом языке и тд. (совет @DDeni). Изначально мне казалось что более удобно хранить информацию в виде чистых классов, потому что так просто организовать магазин, но потом подумал еще раз и понял, что мне так или иначе нужно будет хранить спрайты, иконки и прочее для организации магазина.

2) Я убрал лишние методы Instantiate() в пользу использования пула объектов (совет @HartMagic), однако, сам пул объектов не добавляю в список файлов, ибо он достаточно топорный (один класс, 2 метода, 2 переменные на все возможные объекты) и не имеет прямого отношения к теме постов (конечно, без него не получиться запустить проект просто скопировав его, но, думаю, этим никто не занимается, но при желание можно заменить метод Pop на Instantiate(), а Push на Destroy()). Сначала я думал над тем, чтобы купить уже готовый пул, но посмотрев количество файлов и скриптов в продающихся пакетах передумал.

3) Переделана модель стрельбы и пушек (совет @fon.prima). Данный раздел также затрагивает и пункт 1.


Ладно, предисловие закончилось. Начнем с рассмотрения основного класса корабля:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Изменений визуально немного. Добавлены два скрипта - shipControll, содержащий методы управления кораблем и ShipInfo, содержащий просто данные о корабле, которые ранее были вынесены в класс App.Items.Ship.Ship, ныне канувший в лета. Также лист для пуль теперь один, причины изменения в подходе к стрельбе - о ней позже.

Сразу обращу ваше внимание: все объекты, которые могут умереть (в принципе), включают в себя атрибут, который добавляет класс Shape (элемент для объектного пула). Он нужен для возврата объекта в пул и выглядит так:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Итак, рассмотрим класс управления кораблем:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Метод Move: управляет кораблем. По кнопкам W и S паруса поднимаются и опускаются (если подняты, то набор скорости идет, если нет - то убывание скорости). Также я добавил проверку на то, что если скорость больше 10 (цифра от балды), то только тогда корабль может делать повороты, ибо по логике корабль не умеет поворачивать с минимальной скоростью. Таким образом, я убрал зависимость порядка исполнения Move и Rotation, которая была в предыдущем посте.

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

Метод Fire: тут мы по кнопке для каждой пушке в одном из листов запускаем метод Fire. Более подробно будет рассмотрено в классе Cannon.

Метод Rotation: без изменений (убрал только изменения булевой переменной moving, но об этом сказано выше).

Вот так теперь выглядит наш корабль с пушками (белые зефирки - это пушки).

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

А вот так выглядит движение:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Это первая часть класса, весь не влез.

Переменная power отвечает за силу пушки и начальный импульс снаряда.

Метод Loaded: ранее этот метод был в похожем классе, но другом. Изменения: метод стал возвращать bool ииии...все! В остальном все так же. 26 строка - берем снаряд из пула, так что не смущайтесь её внешнего вида.

Метод Fire: если пушка не заряжена, то ничего не делает. Иначе, запускает метод FireProcess и корутину перезарядки. Вот насчет правильности выбора корутины я не уверен, ибо, возможно, есть менее затратные по ресурсам методы, но в голову ничего не пришло подходящего. Если есть идея - сообщайте в комментарии, буду благодарен.

Метод FireProcess: задает полученному снаряду начальную точку, наполняет полями и дает импульс для полета. Также тут мы записываем в переменную lastFire время выстрела (нужно для перезарядки с помощью следующего метода). По поводу пули и её импульса поговорим чуть позже.

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Метод Recharging: словами делает следующее: если текущее время больше времени последнего выстрела и скорость огня, то перезарядить. К слову, по профайлеру, вызов этой корутины занимает относительно много ресурсов всего 1 раз - в момент вызова.

Рассмотрим результат стрельбы из разнообразных пушек:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

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

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

А вот так стрельба выглядит в динамике.

Итак, перейдем к классу снаряда:

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

Класс снаряда: Мы сюда внесли понятие импульса, времени "пробуждения", что по сути время появления и времени жизни.

На каждый кадр пуля пересчитывает свою позицию. Отмечу, что был изменен способ изменения позиции с transform.Translate(), потому что этот метод тут не походит, так как он может изменять позицию объекта по Y, что для нашего 2д пространства недопустимо.

Также тут мы добавляем к текущей скорости импульс, умноженный на дельту времени, что является способом ускорения снаряда.

Остаток класса проверяет не закончилось ли время жизни пули и если закончилось, то возвращает её в пул.


Теперь проект имеет следующую структуру (но в гит не положил файлы, которые не имеют отношения к кораблю).

Кодовый парусный корабль #3 Код, Программирование, Unity, Gamedev, Разработка игр, Гифка, Длиннопост

На этом все. В следующем посту мы добавим такие механики:
1) получение урона кораблем;
2) нанесение урона снарядами;
3) возможность уничтожения корабля;

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

Всем спасибо за внимание!

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

Кодовый парусный корабль #2

TheodorTalion в Лига Разработчиков Видеоигр

Всем привет, мой предыдущий по этой теме не был оценен сообществом, потому что он в нем даже не появился. Чтобы понять о чем будет идти речь в этом посте рекомендую сначала ознакомиться с первым: https://m.pikabu.ru/story/kodovyiy_parusnyiy_korabl_5082490


Сразу ссылка в гит с самыми актуальными файлами для тех, кому не интересны пояснения: https://gitlab.com/open_sourse/pirate (надеюсь, ссылка будет работать)

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

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Первое: мы добавили булевую переменную charged, что в переводе означает "заряжено". Тут все просто, если пушка заряжена, то мы можем стрелять, а если нет - нет. Также можно увидеть пример конструкторов, которые я забыл добавить в предыдущем посте. Помимо этого были добавлены некоторые новые переменные в класс Ship, но их можно найти в гит и посмотреть.

Рассмотрим метод Fire, который возвращает класс Bullet (пуля, ядро - рассмотрим ниже). Опишем его простыми словами: если пушка не заряжена, то не возвращать ничего, а если пушка заряжена, то зарядить её и отдать экземпляр класса Bullet, передав в него урон пушки.

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Вот класс нашего ядра. Тут есть поле урона и скорости (скорость полета пока статична). Ну и конструктор. Ничего интересного, в целом.

Итак, перейдем к нашему основному классу, на который мы потратим большинство содержания поста. К слову, класс называется Ship, однако, как вы уже могли заметить ранее, такой класс уже есть, но это совершенно разные классы, ибо путь к ним выглядит так:
1) App.Items.Ship.Ship
2) UniApp.Items.Ship.Ship

Ниже мы рассмотрим второй вариант (тут сразу добавлен вид скрипта в инспекторе):

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост
Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Первое что мы видим, что данный класс имеет в себе поле App.Items.Ship.Ship, т.е. данный корабль должен принимать в себя общий класс корабля.


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


Дальше идут листы с пулями - для чего они нужны увидите позже. Также есть экземпляр пули из которого будут скопированы остальные пули (в инспекторе просто добавлено в это поле префаб пули). И булевая переменная moving, т.е. - движение. Также увидите позже для чего он нужен.


(ВНИМАНИЕ, это абзац, как и все сущности в нем созданы для отладки и потому будут удалены) Итак, первое что мы делаем при старте игры собираем наш корабль из его составных частей. В предыдущем посте, наверное, была написана суть этого действия, но это не точно.


Также мы добавляем 3 пушки на правую сторону корабля и 5 пушек на левую (для показательности).

Итак, перейдем к основному, что мы должны рассмотреть в данном после - методы.

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

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

Итак, метод разделен на две части: одна срабатывает если нажата кнопка Е, вторая - если Q. Почему так? Один вариант стреляет с левой...мачты...или как это вообще называется? С левой стороны, короче. А второй с правой, потому что пушки у корабля с разных сторон.

Если нажали E, то для каждого элемента листа с правыми пушками, объявленному выше, мы включаем функцию FirePreprocess. FirePreprocess делает следующее: для пушки запускаем метод Fire (App.Items.Ship.Cannon) и если метод возвращает null (а как мы помним, он возвращает null только когда пушка не заряжена), то ничего не делаем, а если возвращает что-то другое (App.Items.Ship.Bullet), то добавляем его в лист ядер, которые мы принимаем из аргументов функции.

Если переменная в методе начинается с _ (нижнего подчеркивание), то это значит, что данная переменная получается из аргументов функции.


Ну что же идем дальше, надеюсь, уже не забыли о чем мы говорили выше, ибо мне пришлось перечитывать, чтобы продолжить рассказ. Итак, когда мы для каждой пушки запустили метод FIrePreprocess, то дальше запускается метод FireProcess, которые берет нужный список ядер и просто создает новое ядро из префаба, объявленного в полях класса и рассматриваемого выше. Рассмотрим метод по строкам, ибо некоторые действия могут быть непонятны:
57. Создаем из префаба ядро, задав в качестве стартовой позиции позицию пушки, которую мы берем из листа позиций пушек.

58. Задаем новому ядру родительский объект, который является нашим кораблем. (это делается для того, чтобы ядро перешло в локальную систему координат нашего корабля).
59. Получаем компонент Bullet у нового объекта (к слову, это не тот Bullet, который был описан выше. Код этого Bullet будет ниже) и устанавливаем ему направление, которое мы принимаем из аргумента функции (там вправо или влево, в зависимости от того из каких пушек мы стреляем).

60. передаем класс App.Items.Ship.Bullet в UniApp.Items.Ship.Bullet.

61. И теперь самое интересное: мы убираем родителя у нового объекта. Логичный вопрос: а на кой черт мы его до этого назначали, а теперь убираем при чем в том же методе? Суть в том, чтобы сначала перевести объект в локальные координаты родителя и назначить ему вектор движения в зависимости от текущего местоположения корабля, а потом убрать привязку к координатам, чтобы движение корабля не влияло на местоположение ядра и, в целом, стало независимо ни от кого.
64. Очищаем лист, ибо мы уже создали все нужные объекты из него.

Фух, жуть, казалось такие простые методы, но объяснить их не так-то и просто, как кажется.
Ах да, обещанный скрин класса UniApp.Items.Ship.Bullet:

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Тут есть два поля, которые мы обсудили выше и в функции Update(которая вызывается каждый кадр). Если пуля не назначена в классе, то мы ничего не делаем, а если назначена, то двигаем объект. Зачем нужна проверка на null Bullet-а? Все дело в том, что если класс наследуется от MonoBehaviur, то мы не можем создавать его экземпляры с помощью ключевого слова null, поэтому мы не можем создавать конструктор класса, чтобы гарантировать то, что данное поле будет назначено точно при создании.

Итак, к самому методу. Как вы можете видеть, мы берем направление (только X координату, ибо нам нужно перемещать объект только по X. Там в целом, есть еще свои причины почему сделано так, но не буду распыляться, ибо пост довольно большой выходит. Если интересно отвечу в комментах) умножаем его на скорость и дельта переменную времени, чтобы все было плавно.

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


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

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост
Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

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

Рассмотрим методы движения:

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Первый метод Move двигает наш корабль ровно прямо на максимальной скорости (позже будет добавлен разгон) и изменяем переменную moving на true. Это сделано для того, чтобы в дальнейшем можно было поворачивать корабль только когда мы двигаемся...ну, мне кажется именно так ходят корабля, т.е. не могут вращаться на месте(если корабль не весловой))


Второй метод Rotation: суть первой строки только что описали, дальше если нажата A, то вращаем корабль по своей оси в одну сторону, а если D, то в другую. И в конце переключаем moving в false. Таким образом у нас в любом случае moving не останется true, ибо данные методы в Update стоят так:

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Тут Fire где угодно можно поставить, а вот Move и Rotation только в таком порядке, по описанным выше причинам.


Вот, к слову, как выглядит наше передвижение:

Кодовый парусный корабль #2 Код, Программирование, Unity, Гифка, Длиннопост

Ну на этом наши полномочия все. В следующем посте (если этот не соберет гору минусов), мы добавим:

1) Ограничение количества пушек на одной стороне корабля

2) Вылет снарядов с разной скоростью

3) Разгон снарядов при полете

4) Разгон корабля при движении

Ну и может что-то еще

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

Кодовый парусный корабль

TheodorTalion в Лига Разработчиков Видеоигр

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

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

Начнем с первого класса для нашего корабля, определяющего общие параметры для каждой составной части:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

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

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

Как мы можем заметить, основных частей у корабля всего 4 (запоминайте цифры): корпус, рангоут, такелаж и паруса. Также мы можем заметить, что скриншот из википедии единственный содержит красочные картинки во всем посте. Что это значит? Ничего. Начнем с описания такелажа:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

Первое, что можно заметить, все составные части наследуются от Item, описанного выше. Значит, они содержат в себе все поля из класса Item, а сам такелаж содержит в себе скорость поворота. Итак, следующий предмет - рангоут:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

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

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

Они влияют на максимальную скорость корабля и разгон. Следующий класс - тело:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

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

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

Как вы могли заметить тут расположены все экземпляры классов, которые были предоставлены вашему вниманию выше. Помимо этого, корабль можно создать только имея все его составные части - об этом говорит единственный конструктор класса(от 13-ой до 19-ой строки), принимающий в себя 4-ре аргумента. 4-ре аргумента у конструктора класса и 4 составные части корабля на Википедии - совпадение? Не думаю.
(к слову, я забыл создать конструкторы для каждой составной части, но там конструкторы будут выглядеть по типу: задайте все поля, чтобы создать - если нужно кому-то, то скину пример). Итак, перейдем ко второй части корабля, которая, по моему мнению, будет самой любопытной для начинающих:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

Это наши поля класса Ship. Первым полем является имя корабля (я думал его добавить в конструктор, но подумал что имя, все же, лучше задавать отдельно, ведь корабль сначала создают, а потом называют, наверное...может да, а может и нет, но к чему это я? Неважно.)
Как можно увидеть, что все поля возвращают значения, полученные из составных частей корабля, таким образом, напрямую влиять на эти значения нельзя.

Следующие три поля отвечают за способность нашего корабля к передвижению. Например, возьмем поле maxSpeed. Максимальная скорость складывается из - максимальной, которую может развить корпус и максимальной скорости, которую могут развить паруса деленную на количество переменных (т.е. на 2). Правильно это или нет с точки зрения реальности неизвестно, но ведь игры существуют в допущении, поэтому не суть. Например, скорость вращения состоит из 3-х аргументов и поэтому общий результат делиться на 3-и. Думаю, с этим понятно. Перейдем к следующей тройке полей:

Количество хп - это, думаю, понятно. Можно было бы его привести к процентам, но я не стал (пример привода к процентам находится ниже). Также у нас есть два типа защиты. Одна - отнимает количество урона от каждой атаки по кораблю, а вторая - отнимается вместо хп, пока не равна нулю.

Пропустим самое скучное и перейдем к износу. Тут я привел износ к процентам и для этого мне тоже пришлой выйти в интернет (что демонстрирует насколько высокий уровень знания математики нужен для программирования). Мы берем количество процентов (100), умножаем его на текущее состояние всех элементов, деленное на их максимальное состояние.


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

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

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

Напоследок привожу общий код класса Ship:

Кодовый парусный корабль Код, Программирование, Unity, Длиннопост

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

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

18 вещей, которые оценят спортивные и активные (а может, и не только они)

promo спoнсорский пост

Летом жизнь становится активнее: можно пойти в поход, устроить пикник в парке, тренироваться на улице и ездить на работу на самокате. Мы выбрали товары для спорта и отдыха, чтобы поход стал комфортнее, а тренировки — эффективнее. Самокат в подборке есть тоже ;) Все эти вещи можно купить в интернет-магазине JD.ru,где с 18 июня на множество товаров будут огромные скидки в честь дня рождения компании!


1. Фитнес-браслет


Xiaomi выпустила новый фитнес-браслет. У Mi Band 4 есть датчик частоты сердечного ритма, бесконтактная зарядка и цветной сенсорный дисплей. Батареи хватает на 20 часов в режиме ожидания. Браслет умеет выводить на экран уведомления, показывать погоду и различать активности в разделе Workout: плавание, бег на улице, бег в помещении, ходьба, упражнения и езда на велосипеде.


Зачем это туристу или ЗОЖнику. Заветная цель 10 000 шагов в день мотивирует двигаться больше.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

2. Портативный блендер


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


Зачем это туристу или ЗОЖнику. Попивать смузи у себя в квартале, брать с собой на тренировку, в офис или поход.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

3-4. Рюкзак OIWAS и Xiaomi


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


Зачем это туристу или ЗОЖнику. Все свое носить с собой: ноутбук, спортивную форму, бутылку воды.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

5. Противомоскитная лампа


Противомоскитная USB-лампа работает 20 дней без подзарядки. Работает бесшумно и выглядит симпатично. Внутри устройства есть сетка, куда попадают комары, ее легко доставать и чистить. Можно носить с собой на вечерние уличные тренировки или в поход.


Зачем это туристу или ЗОЖнику. Не пользоваться спреем от комаров и не разрушать озоновый слой.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

6. Экшн-камера


Камера FUJIFILM XP140 записывает видео с разрешением 4К, автоматически фокусируется на глазах, снимает портреты и подключается к гаджетам по Bluetooth. Камера создана для экстремальных видов спорта, например, дайвинга или сноуборда.


Зачем это туристу или ЗОЖнику. Снимать эпичные трюки, чтобы друзья не думали, что вы умеете делать сальто, только когда пока они отворачиваются.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

7-8. Кроссовки


Сетчатые кроссовки для летних прогулок. Производитель заверяет, что модель унисекс, но линейка начинается с 39 размера. Перед покупкой лучше измерить стопу и сравнить данные с таблицей, которая есть в описании модели, чтобы обошлось без сюрпризов. Для любителей спокойных расцветок есть модель Xiaomi Freetie Mijia: кроссовки стоят дороже, но и положительных отзывов на них больше.


Зачем это туристу или ЗОЖнику. Исследовать города в путешествиях или свои возможности в спортивном зале.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

9. Сумка для поездки


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


Зачем это туристу или ЗОЖнику. Сумку удобно брать в путешествие, чтобы не покупать в отпуске второй чемодан для сувениров, новой одежды или «запрещенки».

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

10. Электрический самокат


Компактный электрический скутер весит 12,5 кг, проезжает без подзарядки 30 км и синхронизируется со смартфоном. Мобильные приложение показывает на сколько километров еще хватит зарядки и мониторит его текущее состояние.


Зачем это туристу или ЗОЖнику. Самокат — спасение после активных тренировок. Ноги не шевелятся после занятий? Самокат подвезет!

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

11. Смартфон One Plus


У OnePlus 7 AMOLED дисплей с противоударным стеклом, двойная камера, защита от влаги. Это игровой смартфон, который быстро работает и знает хозяина в лицо. На сайте представлена китайская версия, международную тоже можно установить — достаточно пройти по ссылке в описании.


Зачем это туристу или ЗОЖнику. Установить на него приложения для домашних тренировок или фотографировать прогресс от занятий спортом.

Сейчас на JD.ru действует промокоды:
Oplus7jd618 – One Plus 7 черного цвета (скидка 50$)
OPlus7Rjd618 – One Plus 7 красного цвета (скидка 50$)
OplusP7BEjd618 – One Plus 7 PRO синего цвета (скидка 60$)
OplusP7BKjd618 – One Plus 7 PRO черного цвета (скидка 60$)
Op6TNewjd618 – One Plus 6T (скидка 100$)
18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

12. Спальный мешок


Спальный мешок, наполненный гусиным пухом. В комплекте идут две сумки: одна для сжатия, вторая для хранения. Идеальная температура для комфортного сна в мешке от +6 до +11.


Зачем это туристу или ЗОЖнику. Если друзья внезапно позовут уехать на выходные за город с палатками, не придется думать: «У кого бы одолжить спальный мешок?».

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

13. Секретная палатка


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


Зачем это туристу или ЗОЖнику. Использовать как контраргумент в спорах о том, что отдых с палатками не может быть комфортным.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

14. Скакалка


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


Зачем это туристу или ЗОЖнику. 10 минут на скакалке заменяют 30-40 минут бега.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

15. Ролик для пресса


Четырехколесных ролик устойчивее своего родственника на двух колесах. На колесики нанесен противоскользящий узор, чтобы тренировка была безопаснее (и нос останется в целости и сохранности). В комплекте с роликом получите мягкий коврик для занятий


Зачем это туристу или ЗОЖнику. Щеголять по пляжу и хвастаться кубиками на животе.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

16. Набор посуды для кемпинга


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


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

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

17. Палатка с воздушным насосом


Установка занимает пять минут: ее нужно надуть и прибить колышками к земле. Палатка вентилируются с четырех сторон, значит спать в ней не жарко. Производитель укомплектовал «туристическую квартиру» двумя чехлами от дождя и сумкой-переноской.


Зачем это туристу или ЗОЖнику. Забыть, как страшный сон, установку палатки с дугами.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост

18. Коврик для пикника


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


Зачем это туристу или ЗОЖнику. Во-первых, это красиво.

18 вещей, которые оценят спортивные и активные (а может, и не только они) Длиннопост
Распродажа JD.ru закончится 1 июля 2019-го. До этого времени в магазине будут действовать разные акции. Например, если оплатить заказ через PayPal — получите бонусом купон на скидку. Для пикабушников есть свой промокод Pikabu0618 — скидка при заказе на сумму от 20$. Воспользоваться им можно до 20 июня, поэтому слишком долго не раздумывайте! И заглядывайте на главную страницу магазина, чтобы не пропустить специальные акции, или подписывайтесь на группы в Инстаграме или «ВКонтакте».
Показать полностью 15
Отличная работа, все прочитано!