створення мультиплеєра
Вітання.
Думаю з чого почати створення мережевого мультиплеєра. Прочитав дуже багато літератури про різні сервера. Але все якось, нібито, не підходить для моєї задумки. Як я хотів все реалізувати:
(Приклад) Є 3 гравця. Перший натиснув на кнопку стрибка. Всім клієнтам вирушило повідомлення типу: Jump (GameObject) або GameObject.Jump (). Об'єкт стрибнув. І ніякого сервера (точніше що б "сервером" виступав 1 гравець, який так само легко відправив би клієнтам інформацію про кімнаті). Я, звичайно, все сильно спростив (зрозуміло, що там ще багато різних перевірок, синхронізацій ітд. Поки не йдеться від Макстер сервері).
Але що ні Новомосковскл, всюди якісь сервера, складні алгоритми. Може хтось направить мене на потрібну статтю, якщо такий спосіб взагалі існує? Або пояснить, де можна обійтися звичайним програмуванням, а де ні.
для стрибка піде і звичайний unity network
ilka писал (а): для стрибка піде і звичайний unity network
Подивився. Уже схоже на те, що потрібно. Але виникають наступні питання:
Знову всі операції йдуть через посередника (сервер), а це зайві мс. Або сервер - обов'язкова частина? Не можна зробити відправку повідомлень клієнтів між собою (тобто повідомлення відправляється нема на сервер, а всім іншим гравцям)?
Чому я не хочу сервер? Тому що якщо якийсь гравець буде одночасно сервером, то якщо він піде, гра припиниться. А відправка повідомлень між гравцями не залежить від каго-то конкретно.
роби все через новий Network
він може працювати як через сервер так і локально
1 - 3 гравці підключаються до сервера
2 - 1 гравець вибирає створити гру, він же стає сам "сервером", 2 гравця подключаютсяи до першого
youtube.com/user/immeasurability/videos
300 на 300 youtube.com/watch?v=NdWLWxKqiuw
ліміти youtube.com/watch?v=jveE1usxPto
коробля youtube.com/watch?v=OTkhONYv8iI
Почитав, здається, почав щось розуміти.
Сервер обов'язковий, ок. Він виступатиме у мене тільки посередником передачі даних (ніяких розрахунків на ньому не буде). Але виникають знову ж такі питання.
Мені дуже навіть підходить NetworkView (а точніше NetworkView.RPC), але він же вбудований в юніти. А значить сервер буде представляти із себе додаток юніти. А це зайве навантаження на машину (vps / dedicated). Тобто мені не потрібні всі ті функції ЮНИТИ, тому що, як я говорив, ніяких розрахунків на сервері не буде. Що порадите? Може бути є якісь найпростіші приклади?
значить сервер буде представляти із себе додаток юніти. А це зайве навантаження на машину
Не зовсім так.
Створює гру - створює сервер.
Одночасно сервер є як би клієнтом творця - гравця.
Решта до нього підключаються просто як клієнти.
Не обов'язково запускати сервер окремим додатком.
2 - 1 гравець вибирає створити гру, він же стає сам "сервером", 2 гравця подключаютсяи до першого
значить сервер буде представляти із себе додаток юніти. А це зайве навантаження на машину
Не зовсім так.
Створює гру - створює сервер.
Одночасно сервер є як би клієнтом творця - гравця.
Решта до нього підключаються просто як клієнти.
Не обов'язково запускати сервер окремим додатком.
2 - 1 гравець вибирає створити гру, він же стає сам "сервером", 2 гравця подключаютсяи до першого
Я вже прийшов до висновку про те, що сервер краще робити на своїй машині (що б гра не припинялася, якщо хтось вийшов. І "дурити" буде не так то просто).
Виходить, як я зрозумів, я можу створити окремий додаток клієнта і окремий додаток сервера. На сервері у мене буде тільки скрипт networkа (ніяких префабов, ніяких го ітд).
Думаю, для початку можна буде і не звертати не зайві ресурси, які поджірает сама юня.
Зараз я правильно розумію? Це можна реалізувати засобами ЮНИТИ?
Ну да, можна сервер і клієнт зібрати окремими додатками.
При цьому сервера не потрібен рендер ігрової графіки, ніяких сверхРесурсов він зрозуміло споживати не буде.
Тобі не потрібен окремий сервер. Один з клієнтів стає сервером на час однієї партії гри. Він про це не знає. Дурити може тільки лише він.
Якщо будеш робити виділений сервер, то тобі потрібно буде орендувати залізо, купувати або переписувати мережеві рішення для клієнт-сервера, робити сервер консольним додатком.
getAlex писал (а): Тобі не потрібен окремий сервер. Один з клієнтів стає сервером на час однієї партії гри. Він про це не знає. Дурити може тільки лише він.
Якщо будеш робити виділений сервер, то тобі потрібно буде орендувати залізо, купувати або переписувати мережеві рішення для клієнт-сервера, робити сервер консольним додатком.
1) Якщо я куплю слабенький ВДС (ну наприклад 1000 MHz, CPU1 GB RAM), то, думаю, він цілком буде придатний для початку (все-таки там ніяких розрахунків не буде). Ні?
2) А якщо сервер створювати у 1 гравця, то гра завершитися, якщо він вийде? Або це можна буде якось вирішити?
3) Які клієнт-сервера доведеться купувати? На скільки я розумію, я зможу все свої логіку вибудовувати за допомогою NetworkView.RPC?
4) Я як сервер буду використовувати той же юніти. І складно мені буде зробити додаток консольним? Не можу знайти про це нічого (був би радий посиланням).
На скільки я розумію, ви зараз говорите про запуск і управління сервером. В крайньому випадку, можна буде і без консольних команд обійтися.
І ще питання. Я запустив сервер (InitializeServer), як мені тепер його зупинити?
2) Можна вирішити. Зазвичай 2 конекту одночасно -один до лобі сервера, де гравці вибирають кімнати, другий - до сервера-гравцеві. Якщо сервер-гравець відвалюється, лобі вибирає їм нового сервера серед гравців, грунтуючись на оптимальному пінг між ними
3) Всі ці ЮНИТИ Нетворк, наскільки я знаю клієнт-клієнт (я можу і помилятися). Там немає нормальних варіантів клієнт-сервер. Безкоштовні варіанти клієнт-сервер є, але їх потрібно сильно допілівать
4) Юніті жере багато місця. Навіть з опцією без графіки та іншого він не годиться для серверів. Сервер повинен бути у вигляді консольного застосування, наприклад написаного на віжуал студіо
А взагалі я можу створити кілька серверів в 1 додатку? Зараз пишу InitializeServer кілька разів (пробував так само в різних скриптах, на різних ГО), а підключитися виходить тільки до останнього створеному.
Це могло б дуже добре заощадити ресурси.
Таки знайшов на форумі щось схоже.
Woolf писал (а): З технічної точки зору, кімната, це просто список користувачів в ній находящ
public class Room # 123;
public List
public void userIn # 40; User user # 41; # 123;
// додати користувача в лист
# 125;
public void userOut # 40; User user # 41; # 123;
// прибрати користувача з листа
# 125;
public void userMessageToRoom # 40; byte # 91; # 93; msg # 41; # 123;
// розіслати всім, хто в листі повідомлення
# 125;
Ось і весь мінімальний функціонал кімнати на сервері.
Виходить, що у мене буде 1 сервер. На ньому, припустимо, є 100 осіб. І вже я сам "умовно" поділяю цих людей на поточні гри (кімнати) і вже сам вибудовую між ними взаємозв'язок. Але, хіба, при цьому всі 100 клієнтів ніяк не повідомлятимуть з іншими (наприклад пінгувати один одного)?
emel-maks-va писал (а): А взагалі я можу створити кілька серверів в 1 додатку?
Це не так робиться. Є основна програма, яка контролює через System.Diagnostic консольні додатки-сервера. По-перше, якщо буде краш сервера, то впаде тільки одна сесія, а не все. По-друге, це буде першим кроком для того, щоб в подальшому розміщувати гру одночасно на різних серверах. По-третє, це рішення буде швидше працювати тому той же розмір списків коннектов буде менше і не потрібно буде проходитися по списку з 1000 гравців, тільки для того щоб трьом гравцям оновити координати.