Страница 1 из 2

Mirror (Аналог Unet)

СообщениеДобавлено: 12 июл 2019, 08:55
Saltant
Документация на англ лежит тут: https://vis2k.github.io/Mirror/General/ - прочитал кое как с гугл транслейтом мало чё понял.
Собственно вопрос прост, кто нибудь пользуется? Или же есть те кто хорошо разбирается в unet'е? (миррор сделан по аналогии юнета) Я хочу понять принцип работы авторитарного сервера в юнити, каким образом всё это должно работать при условии что Игроки смогут коннектиться на удаленный сервер, а сервер должен соединять всех игроков (кастомный спавн прифаба для игрока из скрипта, спавн объектов на сцене для всех игроков или одного, и т.д).
В общем было бы круто найти человека который хорошо в этом разбирается, потому что третий день ничо толком не выходит кроме дефолтной сцены типа "при коннекте появляется бокс (это игрок) и им можно перемещаться чтоб другой такой же бокс (другой игрок) увидел перемещения...", получилось например сделать что когда собирается какой то предмет с уровня, сервер через [TargetRPC] плюсует +1 score в текстовое поле игрока который собрал предмет, но вот например каким образом другой игрок узнает что первый игрок собрал предмет и получил +1 score нипанятна (хотелось бы понять как отображать score "противника" а не только свои).
Короч, задумка такая - если найдется человек который продуктивно сможет обучить этому не легкому делу (написание серва с взаимодействием между игроками) то есть возможность заплатить за обучение деньгами.

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 12 июл 2019, 09:23
Jarico
Saltant писал(а):Документация на англ лежит тут: https://vis2k.github.io/Mirror/General/ - прочитал кое как с гугл транслейтом мало чё понял.
Собственно вопрос прост, кто нибудь пользуется? Или же есть те кто хорошо разбирается в unet'е?


У Mirror многовато трафика сетевого уходит, смотрел через сниффер (на входе: 15-20 кб/сек на 1 игрока, на выходе: 10-15 кб/сек - отправка на сервер)

Гляди мою тему на оф. форуме
https://forum.unity.com/threads/raknet-networking-solution.700619/

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 12 июл 2019, 11:50
VladikDEV
а чего бы не юзать фотон?

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 12 июл 2019, 12:33
ikhtd
Еще для инфы, на мироре сделан усурвайвл.
https://assetstore.unity.com/packages/t ... ival-95015
Там демо вебгл есть, но по сети не работает. сервак надо самому скомпилить, а потом уже подключаться к нему такими же клиентами. Сервак компилиться и запускается на линухе или на винде и должен работать 24/7 в сутки
Исходники последней версии легко достать на пиратских сайтах типа персии. Там весь исходный код открыт. Мирор там впилен в виде dll, но тут же дается ссылка на оригинальный миррор на гитхабе. То есть легко заменить dll шарповскими скриптами.

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 13 июл 2019, 21:06
Saltant
VladikDEV писал(а):а чего бы не юзать фотон?

Мне все равно можно и фотон если я бы нашел нормальный видео тутор как все это делается.

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 13 июл 2019, 21:33
AngryCat
Saltant писал(а):
VladikDEV писал(а):а чего бы не юзать фотон?

Мне все равно можно и фотон если я бы нашел нормальный видео тутор как все это делается.

Так туторов много. Там и документации есть. Можно еще и на англ. пошарить.

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 13 июл 2019, 23:00
Saltant
AngryCat писал(а):
Saltant писал(а):
VladikDEV писал(а):а чего бы не юзать фотон?

Мне все равно можно и фотон если я бы нашел нормальный видео тутор как все это делается.

Так туторов много. Там и документации есть. Можно еще и на англ. пошарить.

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

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 13 июл 2019, 23:47
AngryCat
А что именно тебя интересует? Мб я сам могу помочь?

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 01:12
Saltant
AngryCat писал(а):А что именно тебя интересует? Мб я сам могу помочь?

Ну я же написал в первом посте что интересует, распишу еще раз подробней.

Есть у меня несколько прифабов игроков, данные о выбранном игроке (прифабе) приходят c WebApi при кнопке "войти в игру" (приходит json массив со всеми параметрами персонажа) отсюда я понимаю какой прифаб мне нужно заспавнить в качестве этого игрока. - Вопрос №1 - Каким способом из кода мне нужно спавнить этот выбранный прифаб для игрока?

Есть у меня инвентарь у персонажа, в нем есть предмет, например бутылка здоровья, она выполнена в виде ScriptableObject с int переменной (сколько дает HP при потреблении), при нажатии на бутылку должен срабатывать метод повышения количества хп равной количества из бутылки и бутылка должна исчезать если она была одна а если несколько (стак бутылок) то снижаться количество на 1. - Вопрос №2 - Каким способом (в коде) мне нужно писать этот метод потребления бутылки? По логике вещей он должен срабатывать на сервере, проверять есть ли в инвентаре персонажа вообще эта бутылка и если есть запускать метод повышения хп и отправлять клиенту новое количество хп. Соответственно клиент при нажатии на бутылку должен каким то образом отсылать запрос на сервер что "я хочу сожрать вот этот предмет", а сервер должен дальше думать - разрешить ли сожрать или нет.

Есть у меня на уровне монстр, которого можно грохнуть, тут сразу два вопроса. -Вопрос №3 - Каким образом мне передавать на сервер инфу об убийстве моба чтоб сервер отдал мне лут из этого моба?, - Вопрос №4 - Каким образом через некоторое время сервер должен вновь заспавнить этого монстра?

Как видно, я абсолютно не имею понятия как работать с сетью на высоком уровне (HLAPI) и только совсем не много понимаю низкоуровневую структуру транспорта (LLAPI).

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 09:53
AngryCat
Все твои вопросы решаются одним способом. Называется PunRPC. Можешь нагуглить, но вот вкратце: PunRPC - это атрибут для методов, который позволяет вызывать методы и передавать аргументы всем или нужным игрокам. Как выпить зелье? Очень просто! Нужно лишь поставить к методу атрибут [PunRPC] и вызвать через исполняемый объект :D там в массиве передаешь всё необходимое.

Дополнено: Сори не все вопросы решаются через PunRPC. Чтобы заспавнить объект используй PhotonNetwork.Instantiate.

Пример "попить зелье":

Синтаксис:
Используется csharp
public int Hp = 100;

void Update(){
if(GetComponent<PhotonView>().isMine) //Это проверка, мой ли это объект, чтобы не получилось, что я нажатием кнопки не восстанавливал хп всем игрокам = )
     if(Input.GetKeyDown(KeyKode.L)){
      GetComponent<PhotonView>().RPC("DrinkVodka",PhotonTargets.All,new object[]{ 100000000 });
     }
}

[PunRPC]
public void DrinkVodka(int hpRegen){
      Hp += hpRegen
}
P.S Сорре писал от руки еще на телефоне. Могут быть ошибки :/

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 11:23
seaman
Ну скинь сюда норм туторы, где не только показывают как заспавнить два кубика и управлять их передвижением.

https://www.youtube.com/playlist?list=P ... dllFpM-uw-

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 19:05
Saltant
Спасибо за ответы, посмотрю как просплюсь, а то я чет упоролся короче все вопросы которые задал в теме решил тупо написав на LLAPI (Telepathy), создал отдельный проект для сервера, соединил его с mysql базой игры, принимаю и отправляю байты как сообщения и тупо в swich проверяю че за шляпа от клиента припёрлась, обрабатываю и отправляю в ответ другой байт (типа сообщение респонса) и клиент его так же в свиче ловит типа "че за хрень пристала мне эта железка" и выполняет нужный метод. В принципе, в приницпе то - всё работает нормально. Единственное не много смущает что это Пуллинг, а фотон как я понял умеет подписываться на события а не крутить луп?

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 20:12
AngryCat
Saltant писал(а):Спасибо за ответы, посмотрю как просплюсь, а то я чет упоролся короче все вопросы которые задал в теме решил тупо написав на LLAPI (Telepathy), создал отдельный проект для сервера, соединил его с mysql базой игры, принимаю и отправляю байты как сообщения и тупо в swich проверяю че за шляпа от клиента припёрлась, обрабатываю и отправляю в ответ другой байт (типа сообщение респонса) и клиент его так же в свиче ловит типа "че за хрень пристала мне эта железка" и выполняет нужный метод. В принципе, в приницпе то - всё работает нормально. Единственное не много смущает что это Пуллинг, а фотон как я понял умеет подписываться на события а не крутить луп?
Он все умеет. Еще скажи, ты привязал mySQL бд, но ты же делаешь через WinAPI или как? Или ты просто хранишь все пароли и логины в одной переменной? :D :D

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 14 июл 2019, 22:02
Saltant
AngryCat писал(а):Еще скажи, ты привязал mySQL бд, но ты же делаешь через WinAPI или как? Или ты просто хранишь все пароли и логины в одной переменной? :D :D

Нет, зачем мне теперь webApi когда сервер на прямую подключен к БД и может с ней работать на прямую с помощью LinqToSql. Все так же как и в веб апи устанавливаешь коннект к БД (ip, bd, user, pass) создаешь классы таблиц, регистрируешь их и просто с сервера получаешь доступ к инфе в бд типа таким путем: "bd.Table.Find(blablabla)" ну и апдейтишь, инсёртишь, делейтишь, всё как обычно короче, только не нужны больше запросы через WebRequest к апи, чтоб апи выполнена запрос и отправила назад - а такой принцип не подходит для динамичных игр, а для каких нибудь браузерных-пошаговых - вполне. Сейчас у меня постоянный TCP коннект к серверу у клиента. Спавн персонажа реализовал пока таким образом:
"Авторизация в игре всё равно идет через веб апи (лень переписывать ибо это не динамика, кнопки тыкаются изи), при удачном логине апи возвращает Токен и список персонажей на аккаунте, когда тыкаешь на какого то персонажа чтоб им зайти - тут уже вступает в игру TCP сервер, клиент отправляет ему Токен и ID выбранного персонажа, сервер получает, сверяет данные с данными в БД и возвращает клиенту подробные характеристики персонажа для спавна и собственно выполняет Instantiate)"

Re: Mirror (Аналог Unet)

СообщениеДобавлено: 15 июл 2019, 12:21
AngryCat
Ну получается, что твоя игра защищена от взлома? Ибо у меня тоже проект на MySQL бд и не знаю, как мне лучше его защитить :/