Популярное
Свежее
Моя лента
Сообщения
Рейтинг
Пополнить Steam
Низкая комиссия
Темы
Гайды
Игры
Офтоп
Кино и сериалы
Вопросы
Ночной музпостинг
Музыка
Творчество
Видео
Инди
Показать все
DTF
О проекте
Правила
Реклама
Приложения
Аккаунт удален
Инди
09.08.2022

Статья удалена

Статья удалена

Предыстория

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

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

И я тоже перед собой поставил такую цель. Год назад... Именно тогда я купил книгу, которая станет краеугольным каменем моего девлога. После чего я открыл её, прочитал вступление, и забросил. Ошибкой которую я совершил тогда была покупка нескольких книг сразу. Ведь я автоматически отбросил эту «до лучших времён». Лучшие времена не особо хотели наставать. Я упорно и усердно учился, работал, ещё больше учился и ещё больше работал.

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

Здесь уютно и круто. Правда здесь два дивана, которые занимают слишком много места, но я с этим уживаюсь.

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

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

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

Зачем здесь собственно этот девлог? Вряд ли вам всем интересно, но я хочу в первую очередь делать это для себя. Я считаю, что ведение девлога поможет мне научиться управлять своим временем и приоритетами. Так же, я планирую с каждого из вас изъять по 5к (прости, Тимур) . А ещё, это просто удобный способ структурировать свой мысли и следить за своим прогрессом.

Книга называеться Unity и C# «Практика Программирования Игр" от J.Ross»а.

В ней используется методология спринтов, а сама игра создаётся как 3д-симулятор-гербалист.

Начнём: )

Создание проекта

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

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

Скажу честно, я не из тех кто долго выбирал между Юнити и УЕ. Всё-таки, я считаю что при должном желании и умениях можно перекатиться практически без потерь. А поскольку Юнити, как и собственно Шарп проще в обучении, мой выбор сразу пал на него.

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

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

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

Пролистав пару страниц кода, и не заметив ничего, чего я не понимал (это я просто не дошёл к делегатам) я рванулся создавать проект в самом Юнити.

В принципе, это не очень да и сложно было. В целом я тыкал туда сюда, пытался понять что делают кнопочки, зачем они это делают, и как часто мне придётся их тыкать.

Быстренько накинул структуру проекта папками, скачал дефолтные ассеты и запустил Райдер.

Создание первой модели

Я пропустил этот шаг. Простите. Я слишком плох во всяких художественных делах, по этому я просто пропустил это, даже не попытавшись создать тестовый «домик». Но я обязательно вернусь!

Теория о Enum’ах

Дальше по списку шли стартовые структуры данных. Автор рассказывал об энамах. В принципе, ничего нового для меня. Даже атрибут [Flags]. Да, я до сих пор не до конца понимаю как он работает с | и ||, но я знаю что он существует, и примерно понимаю зачем.

Не думаю, что здесь есть ещё о чём рассказать.

Нужные структуры данных

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

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

Впрочем, здесь обычный скучный код Шарпа, в котором нет ничего такого вау. Единственное, с чем я столкнулся, это то, что при обращении к делегату под ифом, Райдер на всё лицо мне светил ошибкой invalid embedded statement.

Я честно, говоря, так и не понял на 100 процентов что это такое, по этому если кто-то выкупает и хочет объяснить - буду премного благодарен.

Статья удалена

XML конфиги

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

Менеджеры и синглтон

-Мне пожалуйста одну инстанцию, и мне моему сыну тоже

-throw new Exception("Can't create new ObjectName copy");


Я

Именно так бы мне хотелось начать этот абзац.

Поскольку я всё-таки работаю разработчиком, я знаю что такое паттерн синглтон. Или антипаттерн. Решать вам.

Я знаю как его использовать, и буду его использовать. А плохо ли это, не вам судить. Не судите - и не судимы будете.

А ещё некоторые классы называются GameManager и чтототамещёManager.

Насколько я знаю, это плохая практика, но я обязательно это перепишу.

Глобальный компонент для НПС

Здесь автор очень коротко объясняет про наследования. Так же здесь мы выносим логику конкретного НПС которая связана с юнити от общей логики остальных НПС которая не связана с юнити.

Как по мне, очень офигенная часть. Обязательно к ней вернусь, дабы перечитать и понять ещё раз.

Система дня и ночи

Самая интересная часть в этом спринте.

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

using System; using UnityEngine; namespace Engine { public delegate void DelegateChangeTime(int currentValue); public class DayNightSystem: MonoBehaviour { public static DayNightSystem Instance { get; private set; } public Light Sun; public int DayDuration = 6; public int NightDuration = 6; public float VirtualTime = 12; private float _secondCounter; private const float _computationInterval = 0.05f; //in seconds public bool IsDay { get { return VirtualTime >= 7 && VirtualTime < 19; } } public int Hour { get { return (int) VirtualTime; } } public int Minute { get { return (int) ((VirtualTime - Hour) * 60); } } public event DelegateChangeTime ChangeMinute; public event DelegateChangeTime ChangeHour; private void Awake() { if (Instance != null && Instance != this) throw new Exception("Not allowed creating new DayNightSystem copy"); Instance = this; } void Start() { if (Sun == null) Debug.LogError("Field Sun in DayNightSystem is null"); _secondCounter = 0; } void Update() { _secondCounter -= Time.deltaTime; if (_secondCounter < 0) { _secondCounter = _computationInterval; TimeLapse(); } } private void TimeLapse() { int oldHour = Hour; int oldMinute = Minute; if (IsDay) VirtualTime += 1f / (DayDuration * 60 / (_computationInterval * 12)); else VirtualTime += 1f / (NightDuration * 60 / (_computationInterval * 12)); if (VirtualTime >= 24) VirtualTime -= 24; if (oldMinute != Minute) MinuteLapse(); if (oldHour != Hour) HourLapse(); float dayPart = (VirtualTime - 7) / 24; float sunAngle = dayPart * 360; Vector3 intermediatePoint = new Vector3(0, 0, 0); Sun.transform.position = intermediatePoint + Quaternion.Euler(0, 0, sunAngle) * (10 * Vector3.right); Sun.transform.LookAt(intermediatePoint); } private void MinuteLapse() { ChangeMinute?.Invoke(Minute); } private void HourLapse() { ChangeHour?.Invoke(Hour); } } }

Скорее всего выше много, что можно было бы сделать в разы лучше. И я обязательно сделаю.

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

Советую ознакомиться всем!

Статья удалена

Префаб

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

Имплементация логики НПС

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

В целом, здесь я баловался с конфигами и временем.

Какая работа проделана?

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

Хихихи, на самом деле что-то около недели.

За это время я:

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

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

Но я это не хвастаюсь своими навыками или своей гениальностью.

Я просто рассказываю о том, как я создаю игру, и получаю от этого удовольствие.

Всем добра и счастья :)