Ответы пользователя по тегу Разработка игр
  • Как создать систему заданий в игре?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Хороший ответ Yegor, добавлю ещё другую таблицу: условия появления заданий - какая задача появляется после какой. Туда же можно добавить другие условия: время, уровень, наличие предметов или наоборот отсутствие (исчез важный предмет - добавить необязательное задание для получения этого предмета заново).
    Ответ написан
  • Чем реально полезным можно заняться школьнику знающему программирование?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    >Хорошо знаю Си-Шарп и Юнити.
    Ну так в чём дело? Сделайте отличную игру (или не отличную, но свою). Все школьники (и не только школьники) мечтают об этом. Я не шучу, это может стать полезным, (частично) приятным и (есть шанс) прибыльным. А раз вы школьник, то у вас полно свободного времени (не нужно зарабатывать на хлеб).
    Но главное - решить дойти до конца, до релиза, до победы. Например, возьмите любую любимую игру (небольшую) и сделаете клон (возможно, доработать под себя).
    Либо найдите команду разработчиков, которые ищут программиста (вагон таких предложений). Но нужно выбрать хорошую команду (чтобы была похожа на серьёзную).

    Или другой вариант предложил Александр Тер - сделать что-нибудь полезное для общества. Как пример, был подобный случай несколько лет назад.
    Ответ написан
  • Какие архитектурные подходы выбрать для разработки клиент-серверной игры?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    так и не осознал, что хранится в БД, а что - в RAM ... автоматические системы кеширования/сброса в БД?

    В БД хранится вся информация мира, в текущий момент. Представьте, что сервер внезапно "умер", вся инфа в памяти исчезла, и теперь доступна только та инфа, которая сейчас в БД. Но получить инфу довольно долго, поэтому, используются кэши, иногда - многоуровневые. Если бы БД имела бесконечную скорость работы, то кэш был бы не нужен. Но, к сожалению, кэш необходим. В идеале, в кэше находится вся та же инфа, что и в БД. Но сложнейшая задача - инвалидация кэша (в БД инфа уже изменилась, а в кэше - нет, ещё хуже - в одном кэше тоже изменилась, а в другом - нет). Для того, чтобы потом не собирать баги лопатами, то придётся создавать автоматические системы кеширования/сброса.
    Почитайте статьи "Архитектура высоконагруженных приложений. Масштабирование распределенных систем" (части 1 2) от Badoo.

    Как, собственно, производить синхронизацию клиента и сервера?

    Весь мир только на сервере, у клиента нужны только доступные (видимые) игроку объекты, иначе игроки узнают "лишнюю" инфу (например, в World of Tanks есть способы узнать "невидимые" танки). Но, к сожалению, так обычно не получается. Клиенту приходится знать чуть о большем количестве объектов, для того, чтобы прогнозировать их поведение. Но в космических играх попытаться можно сделать видимость объектов. Вы сказали про сенсоры корабля, эта очень хорошая мысль - объект исчез из сенсора, то пусть клиент удаляет этот объект. Если в дальнейшем объект становится в сенсоре, то пусть об этом сервер сообщит клиенту (или не сообщит, например, корабль включил маскировку, тогда клиент вообще не знает, что "кто-то" есть). Это можно добавить в геймдизайн - если объект попадает в зону сенсора, то сенсор увидит не в тот же миг, а через некоторе время, в зависимости от харакетристик сенсора (но не меньше пинга, хе-хе).
    Почитайте серию статей "Сетевое программирование для разработчиков игр" (части 1 2 3), а также блог 0fps.net (на английском, нет нормального содержания, но есть сильные статьи). Ещё полезнейшая статья "Борьба с читерами в онлайн-играх: 22 «нужно» и «нельзя»".

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

    На клиенте создавать серверный мир не нужно, но и полностью отделяться тоже не стоит. Часть кода между сервером и клиентом будет общим. И чем больше, тем легче потом разрабатывать и клиент, и сервер. Помните про наследование с полиморфизмом, про общие проекты в решении.
    Сервер не должен ничего знать про Unity3d, да и клиент игровую логику должен делать без использования инструментов Unity (про это ещё говорит TheShock). Так будет гораздо проще в дальнейшем.

    может ли что-нибудь дать использование ASP.NET (возможно core) в качестве основы, или для таких целей его использование бессмысленно?

    ASP.NET не нужен, имхо, он мало пользы может дать игровому серверу. Я бы начал делать сервер на .NET Core (можно и .NET Framework, просто сложнее будет деплоить. Подумайте про Azure).

    Дмитрий Александров предложил про чанки. Мне кажется, что это хорошая мысль. Почитайте статью "Введение в октодеревья", возможно, это решит проблему с длинными расстояниями. Чанки будут нужны, потому что однажды один сервер не сможет "осилить" весь мир, придётся разделять его.
    Ответ написан
  • Разработка сервера под игру, с чего начать?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Есть к примеру игра GTA SA я так понимаю сторонние разработчики сделали клиент

    Не совсем так. Любая многопользовательская игра состоит из двух частей - клиентской и серверной, и они не работают друг без друга (бывают бессерверные игры, но и в таких случаях обычно один из клиентов становится сервером, так работает и в Doom/Quake/UT). В GTA и клиент, и сервер сделали Rockstar Games, а не отдельные разработчики. И даже - больше, Rockstar Games постарались сделать так, чтобы спрятать протокол взаимодействия - чтобы хакеры и крякеры не взламывали игру, получая игровые преимущества неигровыми способами. "Сделать сервер GTA", с которым заработает клиент GTA, не получится, по крайней мере, цена такой разработки будет сопоставима с ценой работы над GTA (которая стоила десятки миллионов долларов).

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

    К примеру сделать сервер майнкрафт не состовляет проблем.

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

    Скачал, настроил, запустил

    "Скачал, настроил, запустил" - это не "разработка сервера", это взял то, что уже разработал кто-то.

    P.S. Всё написанное - имхо. Я не любитель GTA и не знаю рынка неофициальных серверов GTA, только знаю, что такие есть (вроде как). Но лично я считаю, что вряд ли кто-то сможет написать сервер, если не будет либо его исходников (украсть), либо разработчики сделают инструменты для разработки модов.
    Ответ написан
  • Какой уровень математики нужен в GameDev (Unity, UE4)?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Математика в gamedev нужна в любом случае. Даже если делается маленькая игрушка, то нужно хотя бы понимать, как работает пропорция...
    Но вот вопрос - какой уровень математики нужен в gamedev.
    TL;DR: очень желателен средний уровень (хотя бы уровень 11 класса).
    Долгое объяснение:
    1) Игру можно делать вообще без математики - движок берёт на себя сложную математику. Но чем больше игра, тем больше будет нужно понимание математики - математика может пригодиться при расчёте выстрелов, при расчёте "хитрого" поиска пути, обязательно пригодится в при разработке ИИ, и уж точно пригодится при расчёте баланса (но это работа гейм-дизайнера, а не программиста).
    2) Причём, нужно именно понимание - не столько умение решать типовые задачки, сколько способность анализировать формулы придумывать свои. Например, какую-то фишку можно сделать несколькими способами, и вероятнее всего, более производительным будет тот способ, который лучше использует математику. Помимо обычной математики, может пригодиться геометрия. И уж точно пригодится булева алгебра.
    3) Начиная с восьмого класса, в школе учат не только считать тривиальные задачки, но и развивают так называемое "математическое мышление". Особенно этому учат "задачки со звёздочкой" (более сложные, но необязательные, не знаю, во всех ли учебниках есть такие). Именно математическое мышление позволяет лучше продумывать алгоритмы. (N.B. рекомендую почитать Я.И.Перельмана с его "Занимательной математикой")
    4) ААА-игры делаются не одним-двумя программистами, при разработке ААА-игр программистов используются десятки (а всего разработчиков может быть сотни, от гейм-дизайнеров до композиторов). Все из них не обязательно должны знать математику хорошо. Но если не знать, то вероятность развиться "повыше" - то сложнее.
    5) При некоторых играх математика почти не нужна (при использовании приличного движка), а в некоторых играх математика точно нужна.
    6) Программирование - техническая наука. Да, "гуманитарии" тоже могут стать программистами, но им будет сложнее. Ещё Ломоносов сказал: "Математика ум в порядок приводит" - в нашем классе математики в школе была такая картинка на стене. И я как учитель могу подтвердить эту мысль.

    Итог.
    Можно ли сделать игру без математики? Можно.
    Математика поможет разработке игры? Почти наверняка.
    Хочется развиваться хотя бы до сениора? Учи математику.
    Ответ написан
  • Как можно реализовать проверку подлинности данных на игровом сервере?

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

    100% защититься невозможно, но возможно сделать так, чтобы взлом стал гораздо дороже, чем выгода. Например, валидация данных в игровом сервере в условной "Flappy Bird" может быть заметно проще, чем GTA.

    Очень хорошая и полезная статья Борьба с читерами в онлайн-играх: 22 «нужно» и «нельзя» на Хабре (плюс, важные комментарии). Выберите, какой уровень защиты вам нужен для вашей игры. Например, некоторые способы защиты невозможно сделать одному программисту (слишком долго и дорого).
    Ответ написан
  • Как правильно посчитать бонусы в карточной игре?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Я думаю, лучше обрабатывать с другой стороны - в игровом поле иметь список карт и список применённых бонусов. При использовании карты изменять характеристики как самой карты, так и игрового поля. И возможно, что придётся перерасчитывать каждую карту (зависит от применённой карты). Взяв карту и обработав её, игровое состояние сразу станет изменённым, и не нужно будет при каждой проверке перепроверять состояния каждой карты.
    Ответ написан
  • Разработка игр с умом?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Рекомендую начать с чего-нибудь попроще, пусть даже клон. Сделайте клон какого-нибудь платформера или Galaxy (или что больше нравится). Это важно, потому что дальше будет слишком много времени будет уходить на сложные задачи по программированию, с которым у вас пока слабо. Когда вы сделаете вашу первую программу, дальше вам будет гораздо проще. Если вы будете хорошо развиваться, то можно попробовать сделать за 2-4 недели, и только потом идти к вашей игре, которую вы хотите делать. Получив какой-то опыт, вам будет легче понять хорошим советам по архитектуре игры.
    Лично у меня есть несколько человек, с которыми я общаюсь и помогаю с программированием. Напишите в скайп, можно начать общение.
    Ответ написан
  • На каком языке пишут ААА игры?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    werw прав, но в последнее время всё чаще для AAA-игр используют UnrealEngine и Unity3d (помимо своих собственных разработок, почти наверняка на c++). Поэтому, чаще всего язык - c++ (UnrealEngine или свой фреймворк) или c# (Unity3d).

    UPD. Серверную часть игры часто делают на Java, но не-серверную часть про написание на Java я не слышал.
    Остальные языки (типа Erlang, например) могут использоваться, но гораздо-гораздо реже.
    Ответ написан
  • Unity: NullReferenceException: Object reference not set to an instance of an object в чём ошибка?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Я думаю, проблема как раз в том, что у вас разные компоненты у разных объектов - у зомби пытаетесь получить доступ к объекту скрипта жизней, но этот скрипт у персонажа, а не у зомби, поэтому playerHealth = GetComponent(); даст null.

    Вы неправильно пытаетесь связываться с разными объектами. В одном объекте не нужно иметь ссылку на объект другого персонажа. А как же тогда уменьшить жизни? Через событие - у вас есть OnTriggerEnter2D - вот в нём есть ссылка на тот объект, с которым только что столкнулся, вот в нём и нужно выбивать жизни:
    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.name == "Character")
        {
            var pers = col.gameObject.GetComponent<HealthCharacter>();
            if (pers != null)
            {
                pers.TakeDamage(attackDamage);
            }
        }
    }

    И не надо проверять объект по его имени (я имею в виду код if (col.gameObject.name == "Character") ), в Юнити есть прекрасная штука - теги. Создайте тег Enemy и тег Hero (или как у вас там персонаж называется), и вот по ним проверяйте - с ним столкнулся, или нет.
    Ответ написан
  • Как организовать синхронизацию игрового мира между клиентом и сервером?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите вопрос https://toster.ru/q/142555, в нём есть некоторые моменты, которые вам пригодятся. Я там привожу несколько ссылок "на почитать".

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

    Если игроков много (сотня и больше), то архитектура очень сильно усложнится. Настолько, что начинать учиться на таком проекте нет никакого смысла. Почитайте про это тот вопрос, что я привёл выше.

    Какая планируется технология на сервере и на клиенте? (язык программирования, платформа)
    Ответ написан
  • Есть ли зависимость между весом игры и количеством скачиваний?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вот посмотрите статью "Увеличиваем прибыль от iOS приложения втрое. Никакого продвижения, только техника" от guskov (ссылка), в ней как раз исследуется этот вопрос.
    TL;DR - да, влияет. Уменьшайте пакет как можно сильнее, остальное подгрузите при первом запуске.
    Ответ написан
  • На чем лучше написать, или где взять движок для 2D (2.5D) MMORPG?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Unity3d будет отличным началом для вас. Юнити - мощнейшая платформа, на которой можно сделать всё, что угодно. В том числе и 2d MMO.
    Но это будет не просто, сразу предупреждаю. Сделать платформер или 2д-бродилку на юнити можно очень быстро, но вот именно сделать ММО - это задача гораздо сложнее.
    (В Unity3d 5 сейчас разрабатывают новую платформу для работы с сетью, и там они обещают сильно упростить работу с сетью, в том числе в MMO-проектах).
    Есть некоторые сложности с бесшовностью, но они решаются. Юнити уже сейчас обладает огромным функционалом, покрывающим все базовые требования к любой игре, плюс есть обширный магазин аддонов (ассетов).
    Платформа любая - и клиент, и браузер, и мобилки, и даже консоли.
    Язык программирования - основной C#, можно писать на Javascript (точнее, язык, очень похожий на javascipt) и Boo (что-то типа Python).
    Ответ написан
  • Какой есть аналог gametutorials.com?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Необходимые ресурсы для геймдизайнеров - в самой статье больше англоязычных, но внизу и в комментах накидали много разных вариантов.
    gamedev.ru
    Ну и самый главный: habrahabr.ru/hub/gdev
    Ответ написан
  • Как рисовать простые векторные 2D фигуры в Unity3D для GUI?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Используйте NGUI.
    Версия 2 доступна бесплатно, работает хорошо. Скачать можно вот отсюда, в разделе Free Version.
    Или дождитесь выхода Unity4.6, там они делают свою новую систему GUI по типу NGUI. Думаю, за лето выпустят. А если всё-таки не успеют выпустить в версии 4.*, то в пятой точно должны выпустить.
    Ответ написан
  • Какую книжку почитать об организации классов для игрушек?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Чаще всего, если название класса не приходит на ум, то он спроектирован неверно, содержит слишком разрозненные функции. Не бойтесь делать больше классов, по классу на одну задачу/функцию - не класс, который содержит одну функцию (метод), а класс, который реализует выполнение какой-то одной задачи в программе.
    Обязательно прочите Приёмы объектно-ориентированного проектирования. П.... Это одна из лучших книг по архитектуре систем. Можно сказать, классический труд. Книга не самая простая, но даст вам необходимую базу для дальнейшего роста.
    Ответ написан
  • Какие есть технологии для разработки браузерных онлайн-игр?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Как верно сказал @Eugene22, выбирать язык стоит из двух факторов - 1) существующий опыт на каком-то языке и 2) что хочется изучить для будущего. Если с первым пунктом плохо, то остаётся выбрать какой-то язык и начать его изучать.
    Браузерные игры состоят из трёх компонентов:
    1) клиентская часть - тут практически без вариантов - javascript.
    2) серверная часть - тут есть множество вариантов. Из основных два варианта - php или Node.js (это серверный javascript). Оба варианта достойны рассмотрения, у каждого есть свои достоинства и недостатки. Также можно рассмотреть Python и Ruby. Не стоит сбрасывать со счёта Java и .Net языки (тут c# и asp.net). Ну и экзотика - Erlang или Go (всё-таки go я отнёс к экзотике, потому что это развивающийся язык, но активно набирает очки).
    3) База данных - для хранения игровых данных. Здесь тоже есть о чём подумать - взять обычный привычный вдоль и поперёк исследованный MySQL, или подумать о более мощных базах типа Postgres, или взять модный MongoDb и его nosql-братьев.
    Выбирайте, что вам нужно и вперёд. Но самый главный мой совет - не беритесь за что-то "типа Травиана и Гриполиса" в качестве первого проекта. Подобные проекты делаются годами профессиональными опытными программистами. Сделайте что-то гораздо проще - типа танчиков, бомбермена, вертолётиков, гонок - где есть только одна основная игровая механика. За время разработки этого проекта вы получите бесценный опыт, без которого вы даже не сможете оценить сложность тех проектов, о которых вы говорили в вопросе.

    UPD. В своём ответе вы просите добавить аргументов в пользу некоторых серверных языков. Добавлю про них.
    Первым рассмотрим php. Это достаточно простой язык для начала написания скриптов, и можно очень быстро написать что-то уже рабочее. Но это язык, который за внешней простотой прячет большую гибкость и достаточно сложные моменты. Поэтому для профессионального его использования нужны его глубокие знания, иначе получившийся код будет 1) медленным, 2) дырявым (ошибки и уязвимости) и 3) сложным в поддержке (сложно добавлять новые функции). Но начать его использовать очень просто.
    Node.js. Это серверная платформа, имеющая в качестве языка программирования javascript. Он в некоторых задачах намного быстрее, чем php, но в некоторых может быть сравним по скорости. Его преимущество, что используется тот же язык, что и для клиентской части - меньше изучать. Его сложность в том, что для серверного языка он достаточно сложен, писать хороший код сложнее, чем на php. Плюс, его основные парадигмы - прототипное наследование и асинхронный код - достаточно сложны для понимания. Хорошим советом может оказаться учиться писать не обычный javascript, а его разновидность CoffeeScript, но многие не согласятся, тут нет единого мнения.
    Python. Это очень мощный язык, позволяющий писать программы не только для web (собственно, сервер игры), но он используется очень много где. Он имеет очень простой синтаксис (кстати, отличающийся от многих других c-подобных языков), но очень гибкий и быстрый, и обладает богатейшей библиотекой готового кода (в принципе, php и node.js тоже обладают этим преимуществом). Недостатком можно отметить то, что гораздо меньшее количество программистов им владеют, и может быть, будет сложнее получить консультацию по возникшим вопросам (а вопросы будут - причём в любом языке). В общем, Python - отличный выбор для начала изучения серверного программирования.
    Ruby может дать очень быстрый старт и быструю разработку. Но его знают ещё меньше программистов, чем Python. Насчёт скорости выполнения он, вроде, медленнее питона (тут я не уверен, не хочу обманывать - у меня нет опыта на ruby). Его синтаксис достаточно своеобразен. Но если вы его хорошо освоите, то никогда не останетесь без высокооплачиваемой работы.
    Java и C# - очень мощные языки общего назначения, дадут очень сильную платформу для любого приложения, в том числе и сервера. Но они сложные, изучать их и хорошо писать на них гораздо сложнее предыдущих рассмотренных языков.
    Go - новый развивающийся язык, можно рассмотреть его для изучения. Но на нём пока мало готового кода, мало материалов, небольшое сообщество.
    Erlang - функциональный язык с очень необычной архитектурой (с точки зрения всех предыдущих языков), и очень необычный синтаксис. Изучать его сложно, но он даёт потрясающие результаты - в некоторых задачах. Советовать его не буду.
    Ответ написан
  • Php. Как лучше организовать хранение большого конфига социальной игры и быстрый доступ к нему?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если уж добавлять внешний сервис, то не redis, а MongoDB. Редис - превосходная штука, но Монго умеет нативно хранить вложенные данные - как раз json.
    Поэтому для данной задачи Монго подойдёт лучше редиса.
    К тому же, Монго так же очень быстра, прекрасно документирована, а также обладает агрегирующими возможностями - можно будет легко делать запросы на сумму, количество и т.п.
    Материалов по Монго полно (например, про выборки и изменение данных, а вот о агрегирующих функциях).
    Хотя, если вас полностью устраивает решение Виталий Желтяков, то оно лучше, конечно, потому как не привносит новых сущностей в архитектуру проекта. Но если вам нужно делать выборки по конфигу, то подумайте.
    Ответ написан
  • Где найти автопачер для собственной игры?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите wyBuild. Многие крупные игры используют его для патчинга. Но он не самый очевидный в настройке...
    Ответ написан