Дневник разработки

Привет DTF! Решил начать вести дневник разработки, дабы узнать мнение людей о моей игре, рассказать с какими трудностями столкнулся, ибо я в программировании знаю лишь азы, но игру мечты-то каждый разработать хочет), расскажу как и что я сделал, может кто и со мной своими мыслями поделится, а кому-то мои наработки окажутся полезными. Игра будет на Unity. И так, начнём.

Скриншот ранней версии
Скриншот ранней версии

Замысел

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

Начало

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

Выглядит это вот так
Выглядит это вот так

Затем, в скрипте сделал пару bool'ов, которые проверяли, делать для этого NPC рандомный лут или нет. Несколько глупо это сделал, да и кот убог, но повторю, в программировании я не силён и одна из причин почему выставляю всё это на обозрение - я надеюсь на ваш совет.

void Start () { if (RandomEqup) { if (!Hair) { for (int a = 0; a < Hairs.Length; a++) Hairs[a].SetActive(false); Hair = Hairs[Random.Range(0, Hairs.Length)]; Hair.SetActive(true); } if (!Bag) { for (int a = 0; a < Bags.Length; a++) Bags[a].SetActive(false); Bag = Bags[Random.Range(0, Bags.Length)]; Bag.SetActive(true); } if (!Body) { for (int a = 0; a < Bodys.Length; a++) Bodys[a].SetActive(false); Body = Bodys[Random.Range(0, Bodys.Length)]; Body.SetActive(true); } } }

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

Инвентарь

Как обычно, скриншот ранней версии, всё может измениться
Как обычно, скриншот ранней версии, всё может измениться

Инвентарь я реализовал довольно просто. Для начала создал скрипт для компонента инвентаря, туда поместил значок предмета, название и небольшое описание.

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class InvComponent : MonoBehaviour { public string Name, Description; public Sprite Icon; public bool InList; }

bool InTheList пригодится мне чуть позже, когда я буду проверять - есть предмет в списке "Предметы поблизости" или нет. После я создал скрипт PlayerInventory, думаю понятно за что он отвечает. В нём я создал массивы, которые хранят: все предметы игрока; предметы, которые игрок может подобрать; и два массива для слотов в UI, которые будут созданы (Массив слотов для объектов в инвентаре и массив для слотов объектов, которые можно подобрать).

Речь идёт об этих слотах
Речь идёт об этих слотах

Сами эти слоты я создал заранее, так выглядит пустой слот.

Дневник разработки

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

Массив, хранящий предметы у игрока, находится несколько в ином месте, но это не столь важно. Предметов столько же, сколько и слотов - 4 шт. 
Массив, хранящий предметы у игрока, находится несколько в ином месте, но это не столь важно. Предметов столько же, сколько и слотов - 4 шт. 

Получается что кейс и объект, который игрок может подобрать оказываются на одинаковых местах в своих массивах. Тогда объект узнаёт на каком месте он стоит и обращается к кейсу, который находится на том же месте. Ему он передаёт свои данные - Название предмета, небольшое описание и иконку. Теперь о булле InList. При попадании игрока в триггер объекта, объект приравнивает InList = true. А при выходе - False, сделал я это, уже сам не знаю зачем, но пусть будет)).

Код, который срабатывает при выходе из триггера объекта(Т.е. игрок не может его подобрать)
Код, который срабатывает при выходе из триггера объекта(Т.е. игрок не может его подобрать)

На сегодня всё. Я удивлюсь если это кто-то прочитает. Извиняюсь за безграмотность, я же школьник, мне простительно, так ведь?). Пожалуйста, пишите пожелания, ибо это моя первая статья вообще. Очень жду комментариев, если кто-то всё же прочтёт статью)
Если кому-то будет интересно, напишу следующую статью, о том как реализовал подъем/выбрасывание лута.

Вот такой первый опыт в ведении дневника)

P.S если кого-то заинтересует игра:

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

1818
20 комментариев

Вопрос: хочу научиться писать на Unity хотя бы на базовом уровне. Вот лично ты где научился? Курсы? Ролики на Ютубе? И стоит ли учить просто C#, а потом переходить на изучение под Unity, или всё же учить сразу под Unity по гайдам?

4

Могу про свой опыт рассказать. Самые основы узнал из приложения SoloLearn (но они там реально очень поверхностные) и осилил несколько первых глав из учебника Стивена Праты по C++. Этого хватило, чтобы перейти к официальным туториалам от Юнити (https://unity3d.com/ru/learn/tutorials): сначала "Roll-a-Ball", потом "Space Shooter tutorial". Там в конце каждого урока даются дополнительные ссылки, по ним желательно тоже все посмотреть.

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

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

2

Там всё легко, в этой теме в комменте я писал простой пример с пояснением.
https://dtf.ru/ask/28660-naskolko-umestno-budet-publikovat-seriyu-urokov-po-razrabotke-igr-zdes

Есть куча платных и бесплатных курсов на Юдеми.
Как пример: https://www.udemy.com/unitycourse/
Очень качественно и здорово, но платно (если очень очень очень захотеть можно и своровать)
У этих же авторов есть курс для 3д игр. Юдеми кстати в целом любит закидывать скидками, по моему если возвращаешься на сайт на следующий день он автоматом предлагает скинуть еще процентов 20 на 2 дня эксклюзивно для тебя. То есть например тот, что я кинул будет стоить в районе 900 рублей вместо 3к.

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

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

Далее я тебя предостерегаю от боли.

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

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

Лучше вообще начинать с простейших игр.

1

Вообще он Viable. Minimum Viable Product. Не Valuable)

1

Прочитаное напомнило анально-донатную дрочильню Last Day on Earth.

1