Ответы пользователя по тегу Разработка игр
  • Как вставлять изображение на canvas НЕ только при загрузке?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    С помощью data:URL (RFC 2397).
    Пример
    <img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0j
    vb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAA
    Re8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0Cc
    guWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" width="16" 
    height="14">

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

    Соответственно, ваш код нужно поменять примерно так:
    Код
    const image = new Image();
    image.src = strDataURI; // картинка уже в строке
    texture = image;
    Ответ написан
    Комментировать
  • Mobile Game art/design - как создавать такой дизайн?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Используется художник, который специализируется на таком стиле или умеет его копировать (подражать другому художнику).
    Ответ написан
    Комментировать
  • Что будет в геймдеве с Flash после его закрытия?

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

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

    Браузерные игры в 2020 можно разрабатывать на WebGL. Для этого вполне подходит Unity. Собственно, Unity как раз делает упор на кроссплатформенность, так что один и тот же проект вы сможете собрать под разные платформы без особых проблем. Ограничителем будет только отличие в целевых устройствах и способах взаимодействия с ними (разные размеры экрана, соотношения сторон, наличие мыши, клавиатуры, сенсорного экрана, датчиков и пр).
    Ответ написан
    7 комментариев
  • JavaScript или Python - на чем проще написать игру?

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

    На ум приходят два популярных хороших движка:
    1. Godot - там как бы Python, но не он. Там свой скриптовой язык, очень похожий на Python. Проблема здесь в том, что если буквально прикручивать Python, то это повлечет накладные расходы производительности. Так что если не хотите учить новый язык (а зря), то попробуйте Godot - сам движок учить всё равно придётся.
    2. Unity - там как бы был JavaScript, и в целом даже ещё есть. Но разработчики этого движка давно поняли, что это бесперспективняк, и стараются всячески уйти от поддержки Javascript. Рано или поздно они её выпилят в пользу C#, который гораздо лучше для игр. Да и то там, как и в случае с Godot, не совсем Javascript, а очень похожий язык, который в свое время нарекли Unityscript.

    Таким образом, C# - лучший выбор.

    Ещё можно рассмотреть Lua, как вариант, он идеально подходит для описания игровой логики и прост в освоении. Но движки с поддержкой Lua пока что уступают вышеперечисленным. Проще взять тот же Unity и прикрутить к нему MoonSharp, например, чтобы иметь возможность использовать Lua. Но только если это действительно нужно - например, для поддержки модификаций.
    Ответ написан
  • Какой игровой движок подходит лучше?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Лучше взять Unity, это самый оптимальный выбор.

    Если очень хочется С++, и ничего больше, то можете всю логику поместить в DLL, написанную на C++, а потом её подключить к игровому проекту на Unity.

    Посмотрите также в сторону Unreal Engine - это действительно хороший и удобный движок, с красивым кодом внутри, из которого можно легко лепить то, что вам хочется, и дорабатывать под свои нужды. И там как раз используется C++. В ряде случаев Unreal даже лучше Unity (в плане отсутствия ограничений). Но главный недостаток (для вас) заключается в том, что это монстр, он тянет с собой кучу всего, и игра получится тяжелее, чем на Unity. Тем более, что у вас карточная 2D-игра.
    Ответ написан
    Комментировать
  • Где найти разработчика - энтузиаста, или сайт где таких поискать, разбирающегося в CS:GO?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Энтузиаста (нормального) найти не получится.

    Потому что если человек в теме, то ему есть, чем заняться. Он либо работает где-то и ему не до бесплатной помощи, либо у него свои проекты, которые ему интересны. А если это новичок, то ему будет интересно чему-то научиться за бесплатно (опять же не факт), но это уже не "разбирающийся".
    Ответ написан
    4 комментария
  • Какие есть иструменты разрбаотки поведения NPC?

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

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

    К примеру, по какому принципу NPC могут объединяться? В Prison Architect они объединяются в банды по цвету кожи. В вашей игре есть цвет кожи и расизм? Скорее всего, нет, значит у вас будет другой, уникальный критерий.

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

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

    И это еще не конец. Поведение придется еще забалансить, чтобы выглядело аутентично и играть было интересно. Ведь геймдев - это искусство. Поэтому коэффициенты внутри этой функции придется подбирать, пробовать разные, да и вообще менять и улучшать саму функцию, и дерево тоже, пока NPC не будут вести так, как вы хотите. Было бы странно найти готовое решение под это.
    Ответ написан
    3 комментария
  • Как правильно вкатиться в разработку игр?

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

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

    Также и с играми. Попробуйте ради прикола написать 2-3 предложения (не больше) описания игры в Стиме (или в мобильном сторе) для пользователей, чтобы в них содержалось самое главное об игре, чтобы пользователи заинтересовались ей. От этого зависит, будут ли люди скачивать/покупать игру, или же будут проходить мимо. Думаете, это просто? А вы попробуйте зацепить свою аудиторию. Забыл сказать, аудиторию тоже выбрать нужно, и ответ "моя аудитория - весь мир", это ответ на двойку.

    Придумайте иконку игры. Казалось бы, просто? Но у специалиста может уйти до 2 недель, если не больше, с учетом А/B тестирования, привлечения экспертов для оценки, собственно самих художников, чтобы ее нарисовать. Хотя я не спорю, иконка, сделанная на коленке за 10 минут, может быть самой удачной, но это уже лотерея, никто не запрещает испытывать судьбу на прочность, это дешево, просто шансы на успех стремятся к нулю.

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

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

    Например, в дополнение к классическим художникам и программистам есть такие роли, как геймдизайнер, пм (project manager), продюсер, QA, дизайнер UI/UX, левел-дизайнер, моделлер, аниматор и т.д. Это далеко не все. Соответственно, в крупном проекте будет несколько геймдизайнеров, продюсеров и т.д., то есть там за "роль" отвечает уже целый отдел, в каждом из которых свои более узкие специальности. Ну а в мелком (на 10 человек) у каждого будет по пачке ролей.

    P.S. На всякий случай напомню, что релиз игры - это не конец, это только начало. А то в моде заблуждение, что после релиза можно открыть карман для денег и больше ничего не делать. Так что если вы (и ваша команда) вопреки статистике всё же сможете сделать игру, которая кому-то нужна, то "веселье" на этом не закончится.
    Ответ написан
    Комментировать
  • Можно ли себя считать геймдевелопером?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <любая профессия> - это тот, кто успешно выполняет поставленные перед ним задачи.

    Вопрос - какие задачи перед геймдевелопером? Я бы сказал так - делать игры. Это немного противоречит ответу GavriKos, который настаивает на том, что эти игры нужно еще и представить общественности. Было бы круто, конечно. Но если предположить, что некий чувак 50 лет делает игру и так ее и не выпустил, причем больше он ничем не занимается, то кто он, если не геймдевелопер? Возможно, он неудачник, то есть неудачный геймдевелопер, но всё же геймдевелопер. Или, скажем, чувак только что выпустился из ВУЗа со специальностью геймдевелопер (предположим), можно ли говорить, что на самом деле он не имеет профессии? Очевидно, имеет. Таким образом, главное условие - принимать участие в разработке игр. И как только вы прекращаете принимать участие в разработке игр, то вы становитесь бывшим геймдевелопером, то есть по сути не геймдевелопером (уже).

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

    Про нормальность. Да, это нормально использовать чужие наработки. Если у вас есть права на это, то это даже законно. Более того, изобретать велосипеды считается бессмысленной работой. Так что если есть, что использовать, то используйте, подсматривайте, как сделано, делайте по аналогии, это не запрещено с точки зрения морали. А с юридической точки зрения нужно смотреть. Скажем, купленные в сторе ассеты вам вряд ли поверяд, не находите? А чужие картинки из Интернета, которые вы обработали и использовали, могут обернуться штрафом в какой-то момент.
    Ответ написан
    1 комментарий
  • Как так красиво рисуют спрайты для 2D игр и в какой программе они это делают?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Иллюстратор рисует в той программе, в которой ему удобно. Каждый сам для себя решает, что ему удобнее. Он может рисовать вообще на бумаге без компьютера. Но в моде сейчас рисовать на специальном планшете для рисования.

    Используемые программа или устройство при этом никак не увеличивают навыки рисования, которые можно получить, например, в художественной школе. Так что если к рисованию у вас душа не лежит, то проще нанять специалиста, а не делать всё самому.
    Ответ написан
    4 комментария
  • Как начать карьеру в gamedev?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала определитесь с целью. Если ваша цель - деньги, то в геймдев идти не стоит, лучше пойти в банковскую сферу, там платят гораздо больше.

    Ну а если не деньги, то всё равно цель нужно четко понимать. Тогда уже можно будет предметно отвечать как, зачем, почему, стоит ли и т.д.
    Ответ написан
  • Как создавать качественную 2D анимацию?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не используйте GameMaker Studio, я пробовал, не понравилось, слишком много ограничений.
    А синтаксис там вообще "волшебный". Присвоение значения переменной изменит переменную у всех объектов такого типа и прочие несуразности.

    Лучше переходите на Unity. Это уже классика.

    Насчет векторной графики, ее практически не используют. Точно не скажу, но по моим представлениям нарисовать на экране произвольный многоугольник с 10 вершинами и закрасить его будет использовать больше вычислительных ресурсов, чем скопировать готовое изображение из памяти. То есть теоретически векторная графика может дать выигрыш в размере билда и занимаемой оперативной памяти в рантайме, но увеличивает нагрузку на батарейку смартфона и повышает минимальные системные требования для игры (кроме памяти).
    Ответ написан
  • Как поделиться игрой (Adobe Captivate) с конкретными пользователями в интернете?

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

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

    Как вариант, если вы хотите показать примерно дизайн игры и ее возможности, то можно организовать конференцию с человеком, или дать ему удаленное управление своим экраном. Это можно сделать, например, программой TeamViewer (она умеет в управление и в конференцию). Такой вариант не подойдет только в случае каких-нибудь тяжелых шутеров со сложной графиков, высоким FPS и высокими требованиями к реакции игрока. Если же ваша игра на флеше, то проблем быть не должно.
    Ответ написан
    Комментировать
  • Проскакивает контроль прыжка ГГ в сторону, по нажатию двух клавиш. Как переделать управление ГГ?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вариант 1 (тупой)
    Добавить задержку в 200 мс перед тем, как герой начнет двигаться от клавиш вправо-влево. Это делается просто. В момент нажатия запоминаем текущее время с точностью до миллисекунд.
    А условие движения такое: клавиша вправо зажата И время зажатия больше 200 мс

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

    Вариант 3 (сложный, для комбо)
    Если у вас одновременное нажатие вправо+вверх - это какое-то особое комбо, то можно аналогично первому варианту отслеживать время нажатия вправо и в пределах этой задержки разрешать пользователю совершать данное комбо.
    То есть при нажатии клавиши вправо нужно запомнить текущее время.
    А при нажатии клавиши вверх проверяется условие.
    Условие такое: клавиша вверх нажата И клавиша вправо была нажата менее 200 мс назад

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

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

    Вариант 6 (домашнее задание)
    В случае, если герой в прыжке может менять направление ускорения стрелками, то нужно подойти к геймдизайнеру и спросить, как быть в этому случае. Ведь в конечном итоге всё зависит от его задумки, какие ощущения у игрока он хотел вызвать.
    Ответ написан
    Комментировать
  • Как сделать таймер при помощи команды на сервере игре, чтобы он появился на Сайте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Веб-сайт в данном случае тоже сервер, и для понимания введем понятия:
    • Игровой сервер (или просто сервер)
    • Веб-сервер (бекенд)
    • Браузер пользователя или клиент или фронтенд


    Далее задачу можно разделить на два (три) этапа:

    Этап первый

    Вам нужно, чтобы ваш сервер отсылал на веб-сервер информацию о начале и конце. Это делается по протоколу HTTP или HTTPS, что-то типа java.net.HttpUrlConnection, но я точно не знаю, что вам лучше подойдет для этой цели.

    Соответственно, на веб-сервере у вас должен быть свой скрипт на любом языке, обычно это PHP. Этот скрипт сохраняет информацию в базу (обычно MySQL).

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

    Этап второй
    Это общение веб-сервера и браузера (клиента). И тут есть свои тонкости.

    Во-первых, сразу вилка на функционал - либо у вас таймер появляется по нажатию по F5 (обновить страницу). То есть вы обновляете страницу, браузер запрашивает новые данные с веб-сервера, и после этого показывает таймер. Либо у вас страница веб-сайта открыта, и там в реальном времени вдруг появляется таймер. Сам! Это можно сделать по-разному, но самый банальный способ - чтобы веб-страница (то есть браузер) делала запрос каждые 10 секунд в фоне (ajax), и если вдруг появляются новые данные, то страница преображается.

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

    В остальном всё просто. Информация из базу тупо посылается на клиент, то есть время окончания, и дальше на клиенете скрипт работает локально. Он показывает отсчет времени до старта игры. Собственно, написание этого мини скрипта на JavaScript можно считать третьим этапом.
    Ответ написан
    Комментировать
  • Почему сервер майнкрафт просто так выключается?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Так написано же, что все подробности ошибки сохранены здесь:
    C:\Users\User\launcher\updates\HiTech\crash-reports\crash-2019-11-17_16.29.11-client.txt

    Скорее всего, какой-то мод глючит. Пробуйте отключать моды по одному. Ну или не по одному, а по 5. Или сначала одну половину отключить, потом другую половину отключить, а первую включить. В общем, нужно искать виновника методом исключения.
    Ответ написан
  • Собственные проекты. Стоит ли доводить до идеала?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не совсем понятно, какую цель вы преследуете. Исходя из вашего слова "профитнее" (т.е. по-русски "выгоднее") её можно трактовать по-разному.

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

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

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

    4) Наконец, если вы хотите заниматься буквально саморазвитием, то есть повышать качество кода и снижать количество багов в нем, то нужно заморочиться конкретно на этом. Опять же, игры здесь ни при чем. Нужно наводить порядок в голове, приучать себя к хорошему оформлению кода и т.д. Опыт, конечно, тоже идет в плюс, но тупо опыта не достаточно. А точных рецептов здесь нет. Начать можно даже с гугления наивной фразы "как писать код без ошибок", а дальше как пойдет, это долгий путь. Но сразу скажу, что это имеет мало отношения к коммерческой выгоде. То есть даже если вы участвуете в ААА-проекте, где отсутствие багов критично, никто не пустит ваш код в продакшн сразу после написания. Ошибаются все, даже профи.

    P.S. На уровне джуна можно быть только помощником. То есть хорошо зная лишь теорию, получать замечания от более опытных товарищей, которые отвечают за успех. Хотя деление это довольно условно. Пет-проекты могут как способствовать росту, так и просто отнимать время, смотря что и как качать.
    Ответ написан
    Комментировать
  • Как реализовать многопользовательскую игру?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Проблемы начинаются не только при читерстве, но и банально при обрыве связи с сервером. Например, когда у пользователя пропадает Интернет. И если вы разрешаете игроку перемещаться локально, отсылая координаты, то с точки зрения сервера игрок исчезнет на некоторое время, а потом появится в других координатах, далеких от тех, где он был.

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

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

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

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

    Если говорить про чисто техническую защиту от изменения кода на клиенет, то лучшее, что вы можете сделать, это обернуть весь код в анонимную функцию. Она будет как бы глобальным пространством для других функций и переменных, но через консоль к ней нельзя будет получить доступ.
    (function() {
      let x = 50;
      let y = 50;
      // и т.д. всё, как обычно, только в обертке
    })();

    Однако настоящих прошареных хакеров такой метод не остановит, конечно. Большинство пользователей - да, но единицы смогут это обойти, меняя непосредственно сетевые пакеты, приходящие в браузер. Именно поэтому нужно валидизировать все поступающие на сервер данные, чтобы их нельзя было подделать.
    Ответ написан
    Комментировать
  • Как исправить, что бы персонаж в Unity не улетал в "космос" при прыжке у стены?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Код:
    isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);

    Не работает, потому что сразу же после этого вызывается функция CheckGround(), в которой переменная isGrounded снова перезаписывается:
    Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 0.6F);
    isGrounded = colliders.Length > 1;

    Поэтому первую строчку вообще не будем рассматривать, эта пустышка, которая ничего не делает, только процессор нагружает лишний раз. Разберем, что же происходит в последних строках.
    Вы считаете количество коллайдеров в круговой области. И если оно больше 1, то isGrounded будет true.
    Видимо, около стены вы также считаете стену. Поэтому наличие стены делает isGrounded = true.
    В чем здесь логика, вам виднее.
    Исправляйте. :)
    Ответ написан
  • Как определить что кнопка мыши зажата?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А как вы гуглите?
    spoiler
    Ради интереса попробовал ввести в гугл запрос:
    unity mouse is pressed
    И всё нашлось.
    У вас какие-то другие поисковые запросы?

    Даже если бы не было функции GetMouseButton, чтобы определить, что кнопка зажата, это было бы легко реализовать самому через функции GetMouseButtonDown и GetMouseButtonUp, плюс переменная, в которой можно хранить текущее состояние.
    Ответ написан
    3 комментария