Multiplayer local în Unity folosind Unet. Couch Wars: cele mai bune jocuri pentru multiplayer local

Salutare tuturor! Astăzi aș dori să vă vorbesc despre una dintre modalitățile prin care puteți crea multiplayer local în Unity. Această soluție este potrivită pentru vitrine, testare de caracteristici sau multiplayer local. De exemplu, dacă doriți să vedeți ce face jucătorul, dar nu doriți să cheltuiți resurse suplimentare pe Android și să luați screencast-ul folosind ADB, atunci puteți pur și simplu să configurați un server pe o mașină sub forma unei copii a aplicația care rulează pe telefon și trimite acolo informații despre acțiunile jucătorului.


Voi descrie pe scurt cum se poate face acest lucru folosind HLAPI pe Unet, dar nu prin NetworkingManager, ci la un nivel puțin mai scăzut. După cum este o tradiție bună, voi atașa un exemplu de implementare a unei astfel de interacțiuni client-server. Vă rog să nu judecați prea aspru acest exemplu, deoarece înțeleg perfect că arhitectura acestei soluții nu este bună și creează o mulțime de probleme în viitor. Scopul meu a fost să scriu cât mai repede un sistem (în weekend) în care să arăt principiul lucrului cu rețeaua. O sa va spun si ce probleme am intampinat. ÎN în acest exemplu Implementarea presupune că serverul este, de asemenea, o aplicație Unity.

Pe Internet, cel mai obișnuit exemplu despre cum să faci multiplayer este chatul, dar îmi plac jocurile și mi s-a părut plictisitor să faci chat. Prin urmare, am decis să mă uit la cum să fac multiplayer folosind exemplul tic-tac-toe. Să spunem că toată logica jocului, determinarea câștigătorului, schimbarea mișcărilor etc., a fost scrisă și tot ce trebuie să facem este să instalăm serverul. În cel mai simplu caz, trebuie să procesăm 2 mesaje în tic-tac-toe. Determinarea ordinii de mișcare (distribuirea ID-urilor) și capturarea celulei.


În general, jocul din acest exemplu funcționează foarte simplu. Sunt 2 scene. Încărcare și joc. Când încărcăm o scenă de joc, generăm un câmp pe care joacă jucătorii. Acolo se verifică și starea de victorie, există clase responsabile pentru funcționarea interfeței de utilizare, precum și ordinea mișcărilor și logica generală a jocului, dar acest lucru nu este deosebit de interesant pentru noi. Clasele principale care sunt responsabile pentru grilă sunt Server, Client, NetManager și dosar separat pentru mesajele NetMessages și enumerarea MyMsgType definită în acesta. Sunt un înveliș peste uneltele Unet. Dintr-o perspectivă Unet, principalele clase pe care le vom folosi sunt NetworkClient, NetworkServer, MessageBase și MsgType. Care sunt aceste clase?

Cele mai simple clase sunt MessageBase și MsgType. Prima este o clasă abstractă din care toate mesajele noastre trebuie să fie moștenite pentru a le trimite între client și server. MsgType este pur și simplu o clasă care stochează constante care sunt responsabile pentru un anumit set de mesaje încorporate în Unet.


NetworkServer este un singleton care oferă capacitatea de a gestiona comunicațiile cu clienți la distanță. Sub capotă folosește o instanță NetworkServerSimple și este în esență un înveliș convenabil în jurul acesteia. Mai întâi, trebuie să pornim serverul pe un anumit port. Pentru a face acest lucru, trebuie să apelați metoda Ascultă (int serverPort)- această metodă pornește serverul pe portul serverPort. (Permiteți-mi să vă reamintesc că toate porturile din intervalul de la 0 la 1023 sunt porturi de sistem și nu ar trebui folosite ca parametru al acestei metode)

Serverul funcționează bine și ascultă un port. Acum avem nevoie de el pentru a răspunde la mesaje. Pentru a face acest lucru, trebuie să înregistrați un handler folosind metoda RegisterHandler (scurt msgType, Networking.NetworkMessageDelegate handler). Această metodă ia ca parametri un tip de mesaj și un delegat. Delegatul, la rândul său, trebuie să accepte un NetworkMessage ca parametru de intrare. Să presupunem că vrem ca scena de joc să înceapă să se încarce pe server în momentul în care un jucător i se alătură, iar ID-urile jucătorilor sunt, de asemenea, distribuite. Apoi trebuie să înregistrăm un handler pentru mesajul corespunzător, precum și să implementăm o metodă pe care o vom transmite ca delegat pentru înregistrare.

Arata cam asa:

Exemplu de înregistrare a unui handler și a unui delegat

NetworkServer.RegisterHandler(MsgType.Connect, OnConnect); private void OnConnect(NetworkMessage msg) ( Debug.Log(string.Concat("Connected: ", msg.conn.address)); var connId = msg.conn.connectionId; if (NetworkServer.connections.Count > Constants.PLAYERS_COUNT) ( SendPlayerID(connId, -1); ) else ( int index = Random.Range(0, Constants.PLAYERS_IDS.Length); SendPlayerID(connId, Constants.PLAYERS_IDS); _CurrentUser.PlayerID = Constants.PLAYERS_IDS[(index + 1) % Constants.PLAYERS_COUNT] SceneManager.LoadScene(1) )


Acum metoda OnConnect va fi apelată de fiecare dată când un utilizator se conectează. Merită să clarificăm că în această implementare, ID-urile determină ordinea mișcării, astfel încât la prima conexiune sunt selectate ID-urile pentru client și server. Clienții rămași primesc automat un ID egal cu -1, ceea ce înseamnă că acest client este un vizualizator.

Există un server simplu. Acum clienții nu vor interveni. Pentru a face acest lucru, vom folosi clasa NetworkClient. Pentru a vă alătura serverului trebuie doar să apelați metoda Conectare (string serverIp, int serverPort). Setăm portul pe care îl ascultă serverul nostru, setăm localhost ca IP dacă testăm aplicația noastră pe o singură mașină sau IP-ul unui computer din rețeaua locală pe care îl folosim ca server (o puteți afla fie în setările de rețea sau în consolă folosind comanda ipconfig de pe computerul care va acționa ca server).

Grozav, ne putem conecta. S-a spus mai devreme că serverul nostru distribuie ID-uri. Aceasta înseamnă că trebuie, în primul rând, să trimitem un mesaj despre ID și, de asemenea, să înregistrăm un handler pentru acest mesaj pe client. După cum am menționat mai devreme, toate mesajele trebuie să fie moștenite de la MessageBase. Mai întâi, să le definim (prefer să fac asta într-un fișier separat):

Mesajul și tipul acestuia

public class PlayerIDMessage: MessageBase ( public int PlayerID; ) public enum MyMsgType: short ( PlayerID = MsgType.Highest + 1, )


A trimite acest mesaj apelați metoda pe client Trimite (short msgType, Networking.MessageBase msg), care va trimite un mesaj msg de „type” msgType către server, sau pe server una dintre metodele în funcție de scop SendToAll(short msgType, Networking.MessageBase msg) sau SendToClient(int connectionId, short msgType, Networking.MessageBase msg), unde connectionId este id-ul unui anumit client.

Procesarea persoanei ID primite pe client

private void OnPlayerID(NetworkMessage msg) (Mesaj PlayerIDMessage = msg.reader.ReadMessage ();


_CurrentUser.PlayerID = mesaj.PlayerID;

SceneManager.LoadScene(1);

1. Verificați dacă Editorul Unity nu este blocat de firewall pentru comunicare prin protocoale TCPși UDP. Odată am petrecut ceva timp pe asta, în ciuda faptului că am ajuns la firewall și am setat portul necesar în excepții, dar nu am verificat dacă editorul nu a fost blocat.

2. Transmiteți tipul de valoare sau tipul de referință serializabil în mesaje și nu transmiteți moștenitorii MonoBehavior. De asemenea, este important să înțelegeți că tipul de referință în acest caz va transfera o copie a obiectului, și nu obiectul în sine și trebuie procesat în consecință.

În cazul în care vorbim despre retea localași hardware pre-cunoscut, nu sunt multe probleme care apar în cazul multiplayer-ului „real”. Practic nu este nevoie să ne gândim la întârzieri, fluctuații, pierderi de pachete etc. Prin urmare, o astfel de soluție poate fi utilă, deși aceste probleme pot fi rezolvate cu această abordare într-o anumită măsură. Comparativ cu mai multe nivel înalt abstractizare în Unet, prin NetworkManager, NetworkBehavior etc., oferă o flexibilitate mai înțeleasă și evidentă (în opinia mea), dacă clienții trebuie să încarce scene diferite etc. și spun că serverul este folosit ca serviciu de streaming și arată ce este afișat pe dispozitivul jucătorului, luându-i poziția și rotația + duplicând ceea ce se întâmplă pe partea lui. În alte cazuri, când este nevoie de o soluție mai rapidă și știi cum să lucrezi cu rețeaua, Unet oferă posibilitatea de a scrie la nivelul de transport.

Aș dori, de asemenea, să clarific despre soluția de pe Github (nu din punct de vedere al instrumentelor, ci din punctul de vedere al abordării arhitecturii) în opinia mea, acesta este un exemplu de ceea ce nu trebuie făcut. Ca să nu mai vorbim de arhitectura jocului în sine, problema este că logica de pe client și server este considerată independent. Când implementați multiplayer adecvat cu o arhitectură client-server, este mai bine atunci când starea jocului este stocată pe server și replicată clienților, iar clienții trimit comenzi care schimbă starea jocului pe server. Acest lucru, desigur, depinde și de mulți factori, dar în medie aceasta este abordarea.

Odată cu dezvoltarea internetului și tehnologii mobile comunicarea live pare să devină o raritate. Să spunem că nu este nimic în neregulă cu faptul că în timpul tăcerilor incomode oamenii preferă să-și îngroape nasul în smartphone-uri și tablete. Este mult mai rău că un astfel de lucru precum multiplayerul local devine un lucru al trecutului: acum, cu un singur clic, poți juca orice joc modern online fără a invita prieteni - toată lumea este deja invitată într-un lobby online confortabil. Dar ce poate fi mai bun decât comunicarea live în timp ce joci? Pufăiatul adversarului se aude chiar în ureche și poți să-ți exprimi orice plângere în persoană - sau cu plăcere să le asculți adresate ție. Am decis să ne amintim cel puțin zece jocuri moderne, pentru care, în ciuda progresului, te poți întâlni cu un grup prietenos și te poți juca în spiritul școlii vechi. Pentru ca pereții să se cutremure.

Broforce

Lansarea oficială a lui Broforce nu a avut loc încă, dar chiar și versiunea beta a acestui joc este o încântare pură. Un joc de platformă reunește toate pictogramele de acțiune de la începutul anilor 80 și 90, fiecare cu propriile abilități. Din vremea noastră, Broforce a devenit și mai bun - de exemplu, Hulk Hogan a apărut în joc.

Multiplayerul FIFA s-a mutat online cu mult timp în urmă datorită succesului modului Ultimate Team, dar Gmbox ne reamintește că multiplayerul local nu a fost anulat aici. După cum arată experiența noastră, când jucăm împreună FIFA, gamepad-urile se sparg mult mai repede, iar celulele nervoase încă nu se refac - dar jocul merită toate aceste sacrificii.

Ascensiunea TowerFall

PC, PS4, Ouya

Cel mai recent exemplu care a inspirat acest text. Toată acțiunea Towerfall are loc pe un singur ecran, unde până la patru jucători pot lupta simultan. Toată lumea este înarmată cu săgeți și aici se termină regulile și începe haosul: setările jocului oferă multe opțiuni pentru a adăuga haos unei bătălii deja în ritm rapid. Experimentele duc la cele mai neașteptate rezultate.

Trupa rock 3

PS3, Xbox 360


Cel mai recent joc din seria Rock Band are deja patru ani, dar ce poți face - încă este cel mai bun mod aduna-ti grupul si nu te jena. Dacă aveți toate clopotele și fluierele necesare în Rock Band, puteți organiza un VIA decent - cu un chitarist, basist, baterist, clape și un tip care își va striga versurile preferate din AC/DC în microfon.

Mortal Kombat Komplete Edition

PC, PS3, Xbox 360

Într-un articol despre multiplayer local era imposibil să nu menționăm cel puțin un joc de luptă și am decis să nu ne arătăm. Ne bucurăm enorm că acum există un analog aproape complet al jocului pe care îl jucăm de la sfârșitul anilor 90 pe toate platformele posibile - inclusiv pe cele unde nu a fost lansat oficial niciodată.

Junglea Tokyo


A juca Tokyo Jungle în cooperare este mult mai dificil decât a juca singur, dar și mai interesant. Totul depinde de alegerea animalului. De exemplu, dacă joci ca un prădător și prietenul tău joacă ca un ierbivor, trebuie să vânezi și să aduni plante. La rândul lor, este posibil ca doi prădători să nu împartă prada. Ei bine, în general, jocul cu o pisică în pereche cu un câine sau cu un crocodil în pereche cu un pui este o experiență de neprețuit. Apropo, nu-ți poți mânca partenerul în joc, chiar și unul mort. Etică...


Legendele Rayman

PC, PS3, Xbox 360, PS4, Xbox One

Încă din zilele Rayman Origins, platformele despre Rayman pot fi jucate în cooperare, iar aceasta este cea mai bună activitate cu familia, comparabilă cu vizionarea unui desen animat - totuși, jocul are suficiente momente în care nu poți face față fără tatăl tău. . Un alt tip de multiplayer local a apărut în Legends - jocul arcade de fotbal Kung Foot, în care o echipă de doi jucători încearcă prin orice mijloace să împingă mingea în poarta celeilalte perechi. Simplu, dar distractiv ca naiba.

PS3, Xbox 360



Versiunea consolei Diablo 3 a fost o revelație pentru noi din multe motive. De exemplu, cine ar fi crezut că Diablo ar putea fi jucat pe un gamepad? S-a dovedit că acest lucru este chiar mai convenabil decât utilizarea unui mouse cu o tastatură. Dar mai este un lucru: jocul cu patru persoane pe un ecran este mai interesant decât jocul singur. Camera locală păstrează perfect întregul cvartet în cadru, nu există lupte pentru prada partajată (fiecare își are propria lor), iar petrecerile sunt mult mai probabil să primească obiecte „legendare” decât indivizii.

Echipa spațială


Cel mai mult joc original dintre cele prezentate, Spaceteam vă va schimba punctul de vedere asupra oricăror joc de rețea. Jucătorii echipei Spaceteam trebuie să lucreze împreună pentru a controla nava spațială, verificând tabloul de bord, dând și urmând ordine. În realitate, arată așa: patru oameni, îngropați în telefoanele lor, împrăștiind termeni science-fiction amestecați cu obscenități alese. Așa se comportă astronauții adevărați? Aparent, așa se comportă - profesia este foarte nervoasă.

Super Smash Bros. Brawl / PlayStation All-Stars Battle Royale

Nintendo Wii/ respectiv PS3

Reprezentanți ai unui gen destul de rar de „lucrători”: patru eroi se adună într-o arenă și vesel (credeți-mă pe cuvânt) se bat între ei până când se determină un câștigător. Istoria genului a început cu Smash Bros., unde puteai pune aproape orice erou Nintendo unul împotriva celuilalt. Cel mai recent joc din serie a fost lansat în 2008 pe Wii și și-a pierdut ușor relevanța. New Smash Bros. vine pe Wii U anul acesta, data exactă de lansare nu este cunoscută, dar jocul are un analog pe PS3 - cu eroii jocurilor PlayStation și câțiva invitați precum Big Daddy de la BioShock. S-ar părea, ce hârtie de calc nerușinată - dar îmi amintesc că suntem în trăi. Vă dorim același lucru.

Dacă tu și prietenii tăi sunteți proprietari de dispozitive Android, atunci este posibil să vă jucați cu ideea de co-gaming. Petrece o seară cufundat în multiplayerul local, luptând și concurând cu prietenii - ce poate fi mai interesant?!

Numărul de jocuri care implementează acest mod este destul de mare. Am încercat să-i selectăm pe cei mai buni dintre ei și să vă invităm să vedeți singuri că sunt cu adevărat captivante.

Conceput pentru până la 8 jucători, acest joc de Eric Fromling este un luptator cu mai multe moduri de joc în care va trebui să arunci cu mine și bombe în adversarii tăi. Gama de moduri va captiva pe oricine - există 10 opțiuni, inclusiv capturarea drapelului, hochei bombardier, regele dealului, eliminare și alte opțiuni la fel de interesante.

Asfalt 8


Gameloft a reușit să creeze unul dintre cei mai buni curseți pe platformele mobile, ceea ce este încă impresionant, în ciuda faptului că a apărut acum aproximativ doi ani. Una dintre caracteristicile sale convenabile este multiplayerul local, datorită căruia poți organiza curse reale în compania prietenilor fără a părăsi canapeaua ta preferată.


Dintre toate jocurile de curse cu kart, această dezvoltare de la Vector Unit este poate cea mai apropiată de îndrăgitul Mario Kart, cel puțin când vine vorba de posibilitatea de a organiza competiții locale. Rețineți că puteți debloca o varietate de hărți și puteți oferi curserilor dvs. abilități unice, care, combinate cu tot felul de amplificatoare și power-up-uri, vă vor permite să faceți cursa și mai variată.

JUJU


Studioul Flying Wild Hog oferă acest joc în primul rând tinerei generații de jucători. Pare foarte interesant, dar este destinat doar dispozitivelor echipate cu procesor Tegra. Pentru multiplayer co-op veți avea nevoie de două controlere - aceasta este o altă cerință obligatorie.


Terraria este capabilă să-ți rețină atenția mult timp - lumea sa 2D captivează, iar creația, construcția și supraviețuirea sa creează dependență. Împreună cu un prieten, puteți crea armuri și arme, puteți ataca șefi, puteți construi o casă și puteți obține mâncare.

Minecraft: Pocket Edition


Cu această creație a studioului Mojang, totul este clar - aici puteți face orice, de la crafting la bătălii și călătorii. Și toate acestea se pot face în compania prietenilor în modul multiplayer local. Explorarea lumii deschise a Minecraft fără a fi singur este incredibil de interesantă. Încearcă și vezi singur.


Dezvoltat de Henry Smith, acest joc vă pune pe tine și pe trei prieteni să controlezi o navă spațială blocată în spațiul adânc. Nu vă așteptați la multă seriozitate de la acest titlu, veți găsi ceva umor în el și, de fapt, nu este chiar așa de rău.