#define "нормальный взломщик"?) Тот, кто просто умеет перехватить пакеты и применить к ним ряд эвристических алгоритмов? х) [а порой даже и элементарных обратных функций]
По сабжу: jmp 465554555245 -> В данной задаче будет достаточно даже элементарного хранения данных в бинарном файле и использования защиты от дурака
Любая структура, хранящая данные, подчиненные определенным правилам, и имеющая возможности их добавления/удаления/обновления, является базой данных. Другой момент - как вы ее представите. # Варианты: 1) Один/ряд текстовых/бинарных файлов, где хранятся данные, обработанные одним (а чаще несколькими) из алгоритмов шифрования; 2) JSON, XML, YAML и подобные в чистом или так же "скомпилированном" виде (с оговорками, но легче, чем СУБД); 3) Реляционная база данных и СУБД (MySQL, SQLite, PostgreSQL, Firebird и т.д.); * СУБД тоже делятся на виды: какие-то являются клиент-серверными (PostgreSQL, MySQL), другие - встраиваемыми (SQLite, Firebird) и т.д. 4) Сохранение данных в памяти сервера с dump'ом через определенный промежуток времени; 5) Можно упороться и завести структуру данных аля ассоциативный массив (на хеш-таблицах или деревьях -> зависит от подхода), хранить все данные в ней и время от времени проводить ее сериализацию с последующим сохранением (ИМХО - в чистом виде не имеет права на жизнь).
Естественно не стоит выбирать только один способ, их нужно комбинировать. В продакшене как правило используется концепция/технология ORM + реляционная база данных, но никто не запрещает сделать тоже самое, используя тот же JSON -> It depends on needs.
Но все это решаемо и не представляет из себя никакой сложности. # Куда более важные проблемы: * Какая архитектура используется в приложении? * Какой уровень доступа предоставляется пользователю к его данным? * Как часто пользователь должен обращаться к серверу, чтобы запросить свои данные? * Должен ли он вообще обращаться к серверу за определенным видом данных?
# Несколько советов по хранению и передаче данных: - Никогда не хранить пароли и другую конфиденциальную информацию в чистом виде, всегда применять к ним хеширование (SHA2, SHA3) и сравнивать по хешу - При необходимости применять ряд алгоритмов шифрования/хеширования - Всегда использовать уникальную для каждого пользователя "соль" (вики) - Никогда не доверять пользователю, он врет -> 1. Хранить данные на сервере и производить их изменение там же, отсылать и получать данные с предварительным шифрованием, а еще лучше - вовсе не передавать данные напрямую, а использовать отправку событий (аля он нашел клад +3к опыта) с их предварительной проверкой на валидность (использование контрольных сумм, например) 2. При хранении же на стороне клиента применять вычисление контрольных сумм, проверку хешей и проводить четкий контроль при изменении данных - При необходимости передачи данных через HTTP использовать HTTPS - Защита от "дурака" тоже защита. Даже элементарное дублирование всех переменных с определенным ключом смещения и последующей их проверкой-сравнением дает результат - При особой надобности пиши свою функцию шифрования на основе уже существующих. Очень примитивный пример:
Код
# Python3 def to_ascii(h): strs = "" for i in range(len(h)//2): strs += chr(int(h[(i*2):(i*2)+2], 16)) return strs
def to_hex(s): strs = "" for i in range(len(s)): strs += "%x"%(ord(s[i])) return strs
def crypt(message): for i, v in enumerate(message): message = message[:i] + chr(ord(v)-12) + message[i+1:] return to_hex(message)
def de_crypt(message): message = to_ascii(message) for i, v in enumerate(message): message = message[:i] + chr(ord(v)+12) + message[i+1:] return message
P.S> Это всего лишь неточная теоретическая выдержка и ряд вполне очевидных, но полезных советов. Пользоваться ими или нет - дело лично каждого. Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Понедельник, 24 Апреля 2017, 19:53
Здравствуйте, уважаемые участники форума! Текста и лишних слов(такова моя манера речи... сложно говорить конкретно) будет много, так что если все же решитесь - терпения вам ^_^
Версия Unity: 5.0.2f1 (конечно, можно обновиться на новый, изучить его UNet(не копал, но все хвалят c: ), но пока вопрос стоит другим ребром).
В настоящий момент при организации мультиплеера в Unity возникли небольшие загвоздки с nat punchthrough... Используются самую малость дописанные PHP скрипты мастер сервера из данной темы. Работает без нареканий, все прекрасно (MainMenu.js и PHPMasterServerConnect.js из оригинала просмотрены и добавлен лишь необходимый функционал). А вот с NAT-Facilitator'ом(2.0.0, скачан и скомпилирован с сайта unity, т.е. используем свой собственный компьютер с ним) уже загвоздки. При необходимости пробивки Nat'а клиенты отказываются подключаться к фасилитэйтору, на одном клиенте греша на то, что он недоступен, на другом просто зависая. На компьютере с facilitator'ом порты проброшены(вообще, там даже режим Bridge ставился, т.ч. это не аргумент), ip белый, внешний, {Firewall, брандмауэр} - отключены. Еще один прикол в том, что когда еще решалось использовать стандартные Master Server и Facilitator, то работало все идеально, подключение было без проблем, оба клиента коннектились. Причиной отказа от Master Server'a была кривая реализация метода UnregisterHost на мастер-сервере (скорее всего это последний вариант, что остается, если здесь ничего не решится - искать проблему, из-за которой не происходит очищение таблицы на мастер-сервере. хотя, она более-менее ясна. если я не ошибаюсь, а мой английский не до такой степени уж плох, то community unity уже обсуждало этот вопрос, и проблемой видимо было то, что юнити не отправляет название таблицы для поиска в методе UnregisterHost, но может я все-таки неправильно понял, и кто-нибудь меня поправит). Из-за невозможности удалить хост с Master Server'а, пока он не выключен (т.е. когда он уже не может достучаться до хоста, то его благополучно подчищают), решением было использовать PHP Master Server, который в свою очередь теперь куралесит с Facilitator'ом. Поиски по данной проблеме привели к этому обсуждению. Из нее мне все же наводит сомнения то, что похоже Facilitator до сих пор должен взаимодействовать с Master Server'ом от Unity. Конечно, там лишь сказано, что он использует это только для определения external-ip, но кто же его знает (да-да, вряд ли они оба обращаются к одному (локальному..?)хранилищу(да, наверняка, там обычный массив, список, любая коллекция в ОЗУ)) Для большего спокойствия - с отключенным useNat компьютеры коннектятся безупречно (проблема именно в Facilitator'e).
В оригинале PHP Master Server'a с форума Unity имеются строки:
Код
var conn = GetComponent(PHPMasterServerConnect); conn.gameName = GUI.TextField (Rect (215, 300, 400, 25), conn.gameName); //Вышеуказанное привожу, чтобы не возникало вопросов откуда переменная conn... она вообще отношения сейчас не имеет никакого, но заранее прибил возможный вопрос... Network.InitializeServer (32, parseInt(portString), !Network.HavePublicAddress ()); MasterServer.RegisterHost (conn.gameType, conn.gameName, "");
Что, конечно же, как бы намекает на то, что мастер-сервер от unity запускается.
Собственно вопросы: 1) Кто-нибудь уже сталкивался с такими проблемами? Методы их решения? (конечно, вы можете сказать перейти Photon/SmartFox/ElectroServer(он загнулся?) и другие, но сейчас решается вопрос именно по стандартным средствам unity) 2) Копался ли кто-нибудь в коде Master Server'a? Даже технология его работы упростит (maybe) неизбежное изучение исходников. 3) В добавление к вопросу 2 - Обходные или валидные пути решения проблемы с UnregisterHost? (кроме как "зачудить" отключение сервера, мастер нас кикнет, а потом через промежуток времени заново его создать и законнектиться всем клиентам, что, кстати, может и не сработать, если "мистическая" связь facilitator'a и master server'a все же есть) 4) Если вы не сталкивались с этим, то что по вашему мнению здесь имеет подводные камни? (Очень логично, думаю, было бы посмотреть на Network.player.guid, который, если я правильно понимаю, выдает нам Facilitator как идентификатор при соединении с ним. Значит, если он неправильно определен(мы не приконнектились к искомому facilitator'у), то и NAT Punchthrough между клиентами невозможен, не так ли? Но почему тогда он коннектится, если мы установили master-server от unity на компьютере?..)
Спасибо большое за ваше внимание. Если где-то я сказанул бред, то поправьте меня (да, со мной бывает такое. возможно, я неправильно что-либо понимаю).
Всех с Наступающим Новым Годом!!! Счастья, успехов вам в грядущем 2016-ом, валидного кода и компилятора без ошибок!) :holiday:
P.S>Надеюсь, на форуме не настало заранее 1 января :"D P.S.S: Да, все же скажу к чему все эти заморочки и зачем мне удаление сервера до его выключения. Клиент нажимает кнопку поиска, идут запросы на мастер-сервер, там он находит уже открытые сервера других игроков, пробует к ним коннектиться, если, в итоге, никуда не законнектился - создает сервер сам(именно здесь довольно полезен nat facilitator). Сервера (если они пусты, еще нет игроков на них, т.е. неизвестно - а они вообще могут быть таковыми..) продолжают запросы на мастер-сервер, как и обычный клиент. И если они смогли законнектиться на другой сервер, то свой они прикрывают и становятся обычным клиентом. Так открывается лобби, в котором собираются игроки. Возможное количество - от 2х до 4х. Когда все игроки нажали "Ready", начинается отсчет до запуска игры (не знаю, может быть, можно оставить возможность приконнектиться в этот промежуток). Пока идет отсчет - отправляется UnregisterHost(т.е. нам больше числиться в серверах не нужно, нам не нужны больше игрок для данной сессии игры). По окончанию - стартуется игра, сервер - игрок, к нему все законнекчены либо напрямую, либо через facilitator.
Добавлено (05 января 2016, 16:19) --------------------------------------------- UP, думаю, многие успешно отошли от НГ < 3
Сообщение отредактировал Abel399 - Вторник, 29 Декабря 2015, 16:54
Ну, как-то так думаю можно для скрипта.. С PlayMaker не работал, не могу говорить... если у вас какие-либо операции происходят в update, то можно придумать как использовать Time.deltatime. А может быть я ошибаюсь и мой метод не сработает, тогда думаю помогут короутины... Сложно точно вам посоветовать, так как непонятно где и в каком моменте нужно отслеживать... Если есть некое "начало" и некий "конец" работы скрипта, то просто запоминаем время начала, а в конце находим разницу времени. Тогда в PlayMaker тоже можно так же поступить, если там есть возможность получить время и потом найти промежуток.. Больше информации не помешало бы
Добавлено (03 января 2016, 16:14) --------------------------------------------- А еще есть замечательный инструмент - Profiler. Борозда прокопана, остается лишь углубляться
С Новым годом, дорогие форумчане!!!! Да принесет он вам море счастья, успехов, незабываемых впечатлений и моментов из жизни! Пусть ваши проекты добьются своих высот и будут радовать окружающих. Валидного кода и земного счастья, С НОВЫМ, 2016, ГОДОМ, ребята!!! :v: P.S>А еще здорового и беспоследственного вам утра 1 Января!)
Сообщение отредактировал Abel399 - Пятница, 01 Января 2016, 05:02
Зависит от габаритов стены и метода определения столкновений. Если через place_meeting в step'е, то что-то типо этого:
Код
if(place_meeting(x+sprite_get_width(sprite_wall)*sign(hspeed),y,obj_wall)) hspeed=-hspeed; if((place_meeting(x,y-sprite_get_height(sprite_wall),obj_wall))//или тоже *на sign, зависит от целей { hspeed = 0; y = yprevious; }
Если столкновение через Events:
Код
if(collision_line(x,y,x+hspeed,y,obj_wall,0,1)) hspeed = -hspeed; if(collision_line(x,y,x,y+vspeed,obj_wall,0,1))//либо -abs(vspeed), если только столкновение сверху { vspeed = 0; y = yprevious; }
Может быть в спрайте неверно указана галочка "Precise collision checking"?... Обычно в таких случаях все решается методом тестов. Берете, создаете новый спрайт, вешаете на него скрипт, балуетесь с настройками спрайта и в процессе этой творческой деятельности в большинстве случаев всегда появляются догадки, подозрения. Т.е. если оно у вас и там работать не станет, следует прочесать официальный форум, возможно, это действительно связано с версией и следует переустановить gm. Либо это связано с конкретным спрайтом, и там вы уже будете точно знать, где копать. С Наступающим ;>
Могу представить это себе так: В GM:S игра экспортируется под html5, реализовать нужно либо прямое, либо через php общение с MySQL(глянь). При начале игры сайт регистрирует их сессию в таблице mysql под уникальным идентификатором, который будет использоваться для "разговора" игроков. В таблице можно сделать 2 колонки и так хранить историю ходов для каждого игрока, либо одну колонку, где будет записан просто текущий ход(говлрить буду о нем). Когда игрок походил, он шлет запрос на mysql сам/через php, находит строку своей сессии и в столбце ходов записывается сам ход. Другой игрок, который ожидает, раз в секунду, допустим, шлет запрос и проверяет состояние этой ячейки. Если она не пуста - считывает данные, чистит ячейку, и ход передается в его руки. И так по кругу. Победу определять, конечно, лучше на сервере, но все зависит от условий ее наступления. На клиенте все же нежелательно это делать... Шифрование запросов уже дело принципов(здесь от "читерства" применить можно сравнение хеш-кодов запросов). Чтобы определить лив игрока, можно использовать сравнение времени обновления запросов от клиента, для каждого своя ячейка в базе. Для общения с php, как я понимаю, теперь юзается - Asynchronous
В итоге, все упрется в хороший хостинг и "неглючную" BD.
Успехов, с Наступающим Новым годом! Если что-то непонятно, или я категорически не прав, говорите с;
Сообщение отредактировал Abel399 - Среда, 30 Декабря 2015, 14:59
Почти все проекты интересны и прекрасны, но больше всего склонил к себе |Rutraple - HappyPumpkin| благодаря своей ненавязчивостью, приятной для глаз *мультяшной* графикой и возможностью выстраивать некие подобия механизмов, а не напревшие уже блоки(блокостроение). К тому же игра позволяет расслабиться и отдохнуть, решая несложные поставленные задачки =) Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Среда, 03 Сентября 2014, 10:25
Fr0sT, Ясно, появилась мыслЯ. У меня просто поворот меняется каждый кадр => сглаживание тут не ощущается. И есть два выхода: сохранение времени или установка контрольных точек поворота через равные промежутки времени, что наверняка напоминало твою реализацию. Буду пробовать Ninja Slayer - 2D Physics Puzzle [cancelled]
Fr0sT, Спасибо за отзыв :-) Я так и делаю. У меня character controller висит на общем префабе, а внутри него сама моделька персонажа, которая и поворачивается. А у тебя все-таки получилось смягчить поворот? Левша, В связи с моим неполным пониманием функции, я отложил это дело до ближайшего времени. Сейчас занимаюсь основной игровой логикой, но над решением данной "мелочи" все ещё думаю :-)
allods, Да, в паренте. Но это не имеет значения ибо дрожит не камера, а сам персонаж, который наклоняется к поверхности. И камера следом за ним. Камеру можно и скриптом плавно поворачивать. Левша, Я вас понял. Дело в том, что я плохо объясняю =) смотрите: Вот поверхность:
Вот на этом бугре или неровности поверхности, персонаж поворачивается перпендикулярно бугру. Потом опять встает на сглаженную поверхность и нормально поворачивается. Вы предлагали поворачивать объект на угол в градусах по нужным осям. Это правильно, да. Но ведь можно поворачивать и сразу по компонентам Quaternion для меньших расчетов (здесь, возможно, вы можете не понять мою мысль из-за моих ужасных объяснений :D). Если идеально выровнять поверхность terrain, сделать небольшую сопочку (обязательно ровную и без сглаживания, чтобы не было бугорков), то наклон будет идеальным и правильным, без "тряски". Т.е. нужно как-то сделать так, чтобы если поверхность резко меняется в течении какого-то времени, то скрипт игнорировал поворот или же запрещал очень резкие повороты.
Эх.. Надеюсь моя писанина хоть немного понятна. Спасибо за уделенное внимание
P.S>А вообще это происходит из-за постоянной смены нормали к поверхности. Их видимо много в одном месте и =>Смена наклона очень резка и быстра. Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Четверг, 17 Июля 2014, 09:49
Левша, Да нет. Камера по осям x и z вообще не поворачивается (пока, позже попробую сделать плавный поворот камеры за объектом). Тут дело в том, что нормаль поверхности получается каждый фрейм, и порой на вроде бы ровной поверхности она получается отличной от предыдущей. И, как следствие, объект резко поворачивается в ненужную сторону, а потом возвращается в исходное положение. Отсюда и появляется "дрожание" и "вибрация". Думал выровнять terrain в Photoshop, но не помогло. Все равно почему-то имеется такой феномен. Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Вторник, 15 Июля 2014, 08:14
Левша, Большое спасибо, интерполяция прекрасная вещь =) С горем пополам и бомбежкой Google я научился поворачивать объект вокруг локальной оси и теперь все выглядит просто Щикарно. Вот код, чтобы с такой проблемой никто не сталкивался:
P.S>Ответа на маленький вопрос про Backface Culling никто не знает?
Добавлено (14.07.2014, 10:00) --------------------------------------------- Эх... способ работает, но сглаживание достичь все равно не удалось. Бывают моменты, что модель дергается даже на ровной поверхности. Но как же в видео все так удачно реализовано..
Но вот теперь появилась загвоздка - Terrain слегка шершавый и из-за это персонаж при движении слегка вибрирует(дрыгается, чувствуя каждую кочку). Либо мне выравнивать Terrain, либо как-то смегчать поворот... Может подскажите?) Благодарю за внимание
Добавлено (14.07.2014, 06:15) --------------------------------------------- Неее, способ себя не оправдывает - прыжки камеры и модели просто дикие, поворот не всегда работает... Надо контроллер на модель вешать вероятно..
Приветствую вас, дорогие форумчане. Во время работы в Unity у меня возник один довольно коварный вопрос, ответ на который я так и не смог найти в великом Google. Точнее я нашел заметку на официальном сайте на форуме, но не понял метода реализации... Суть вопроса: мне необходимо, чтобы при движении персонажа модель поворачивалась по осям x и z так, что персонаж постоянно ногами находился на земле. Идеальный пример реализации - серия игр про Sonic'а от Sega. Есть так же видео, где данная вещь показана на Unity: http://www.youtube.com/watch?v=LGbWo9Da40M.
Мне известно лишь то, что это можно реализовать, проводя нормаль в точке столкновения с сурфейсом поверхности и поворотом на *какой-то вектор(вроде направление движения или transform.up)* -> сама нормаль (RaycastHit.normal или collision.contacts[number].normal).
Код
var moveDirection = Vector3(Input.GetAxis("Horizontal"),0.0,Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); PlayerController.Move(moveDirection*walkSpeed*Time.deltaTime);
P.S>Оно мне не особо нравится, ибо создается эффект скольжения при повороте персонажа. Использую его так, как через transform.forward при движении по склону, персонаж дергается и скорость спуска уменьшается. Как только появится поворот модели, этот феномен исчезнет. Если не сложно, то может быть вы знаете другой способ перемещения? =)
Персонаж представляет из себя префаб, на котором висит Character Controller и сам скрипт управления. В дочерних объектах находится Camera и префаб модели персонажа со скелетом и мешом. На нем так же висит компонент Animation. В качестве поверхности используется обыкновенный Terrain.
Думаю, что этой информации вполне достаточно для описания моей ситуации. Спасибо за внимание и надеюсь на вашу помощь
P.S>Если будет необходима дополнительная информация о персонаже - сообщите, я предоставлю.
Как в Unity3d отключить Backface Culling(т.е. включить отрисовку обратной стороны полигона. При экспорте из 3D's Max она отключена)? вроде через шейдеры можно, но не совсем понятно как. Спасибо.