TheodorTalion

TheodorTalion

На Пикабу
поставил 1081 плюс и 3070 минусов
отредактировал 4 поста
проголосовал за 7 редактирований
Награды:
5 лет на Пикабу
23К рейтинг 76 подписчиков 56 подписок 12 постов 0 в горячем

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

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

Предыдущий пост: http://pikabu.ru/story/kodovyiy_parusnyiy_korabl_3_5094712
Гит для тех, кому лень читать: 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 дней, но уже без кода, ибо код, думаю, не особо интересен людям (потому что ничего гениального не делает).


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

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

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

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

Предыдущий пост: http://pikabu.ru/story/kodovyiy_parusnyiy_korabl_2_5089935
Если нет желания читать, самые актуальные файлы тут: 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

Всем привет, мой предыдущий по этой теме не был оценен сообществом, потому что он в нем даже не появился. Чтобы понять о чем будет идти речь в этом посте рекомендую сначала ознакомиться с первым: http://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

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

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

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

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

Кодовый парусный корабль Код, Программирование, 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, Длиннопост

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

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