Lokalni multiplayer u Unity koristeći Unet. Couch Wars: najbolje igre za lokalni multiplayer

Zdravo svima! Danas bih želio govoriti o jednom od načina na koji možete kreirati lokalni multiplayer u Unity-u. Ovo rješenje je pogodno za izložbene prostore, testiranje funkcija ili lokalni multiplayer. Na primjer, ako želite vidjeti šta igrač radi, ali ne želite trošiti dodatne resurse na Android i snimiti screencast koristeći ADB, onda jednostavno možete postaviti server na nekom stroju u obliku kopije aplikaciju koja radi na telefonu i tamo šalje informacije o akcijama igrača.


Ukratko ću opisati kako se to može uraditi koristeći HLAPI na Unetu, ali ne preko NetworkingManagera, već na nešto nižem nivou. Po dobroj tradiciji, priložiću primjer svoje implementacije takve klijent-server interakcije. Molimo vas da ne sudite prestrogo o ovom primjeru, jer ja savršeno razumijem da arhitektura ovog rješenja nije dobra i stvara mnogo problema u budućnosti. Cilj mi je bio da što brže (preko vikenda) napišem sistem u kojem bih mogao pokazati princip rada sa mrežom. Reći ću vam i sa kakvim sam problemima naišao. IN u ovom primjeru Implementacija pretpostavlja da je server također Unity aplikacija.

Na internetu je najčešći primjer kako napraviti multiplayer chat, ali ja volim igrice, a četovanje mi se činilo dosadnim. Stoga sam odlučio pogledati kako napraviti multiplayer na primjeru tic-tac-toe. Recimo da je sva logika igre, određivanje pobjednika, mijenjanje poteza itd., ispisana, a sve što treba da uradimo je da instaliramo server. U najjednostavnijem slučaju, moramo obraditi 2 poruke u tic-tac-toe. Određivanje redosleda pomeranja (distribucija ID-ova) i hvatanje ćelije.


Sve u svemu, igra u ovom primjeru radi vrlo jednostavno. Postoje 2 scene. Učitavanje i igranje. Prilikom učitavanja gameplay scene, generišemo polje na kojem igrači igraju. Tu se provjerava i uvjet pobjede, postoje klase odgovorne za rad korisničkog sučelja, kao i redosljed poteza i logika igre općenito, ali to nam nije posebno zanimljivo. Glavne klase koje su odgovorne za grid su Server, Client, NetManager i zaseban fajl za NetMessages poruke i enum MyMsgType definisan u njemu. Oni su omotač preko Unet alata. Iz perspektive Uneta, glavne klase koje ćemo koristiti su NetworkClient, NetworkServer, MessageBase i MsgType. Šta su ovo časovi?

Najjednostavnije klase su MessageBase i MsgType. Prva je apstraktna klasa iz koje sve naše poruke moraju biti naslijeđene da bismo ih poslali između klijenta i servera. MsgType je jednostavno klasa koja pohranjuje konstante koje su odgovorne za određeni skup poruka ugrađenih u Unet.


NetworkServer je singleton koji pruža mogućnost upravljanja komunikacijama sa udaljenim klijentima. Ispod haube koristi NetworkServerSimple instancu i u suštini je zgodan omot oko nje. Prvo, trebamo pokrenuti server na određenom portu. Da biste to učinili, morate pozvati metodu Slušajte (int serverPort)- ovaj metod pokreće server na serverPort portu. (Dozvolite mi da vas podsjetim da su svi portovi u rasponu od 0 do 1023 sistemski portovi i ne bi se trebali koristiti kao parametar ove metode)

Server radi dobro i sluša neki port. Sada nam je potrebno da odgovaramo na poruke. Da biste to učinili, morate registrirati rukovatelja koristeći metodu RegisterHandler (kratki msgType, Networking.NetworkMessageDelegate rukovalac). Ova metoda uzima tip poruke i delegata kao parametre. Delegat, zauzvrat, mora uzeti NetworkMessage kao ulazni parametar. Recimo da želimo da se scena igranja počne učitavati na server u trenutku kada mu se igrač pridruži, a ID igrača se također distribuira. Zatim treba da registrujemo rukovalac za odgovarajuću poruku, kao i da implementiramo metod koji ćemo proslediti kao delegat za registraciju.

To izgleda otprilike ovako:

Primjer registracije rukovatelja i delegata

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.PLAYERS_IDS)[ % Constants.PLAYERS_COUNT]; SceneManager.LoadScene(1) )


Sada će metoda OnConnect biti pozvana svaki put kada se korisnik poveže. Vrijedi pojasniti da u ovoj implementaciji ID-ovi određuju redoslijed premještanja, pa se pri prvom povezivanju biraju ID-ovi za klijenta i servera. Preostali klijenti automatski dobijaju ID jednak -1, što znači da je ovaj klijent gledalac.

Postoji jednostavan server. Sada se klijenti ne bi mešali. Da bismo to učinili, koristit ćemo klasu NetworkClient. Da biste se pridružili serveru potrebno je samo pozvati metodu Poveži (string serverIp, int serverPort). Postavljamo port koji naš server sluša postavljamo localhost kao IP ako testiramo našu aplikaciju na jednoj mašini ili IP računara na lokalnoj mreži koji koristimo kao server (možete to saznati ili u stranici; mrežne postavke ili u konzoli pomoću naredbe ipconfig na računaru koji će djelovati kao server).

Odlično, možemo se povezati. Ranije je rečeno da naš server distribuira ID. To znači da prvo trebamo poslati poruku o ID-u, kao i registrovati rukovaoca za ovu poruku na klijentu. Kao što je ranije spomenuto, sve poruke moraju biti naslijeđene od MessageBase-a. Prvo, hajde da ih definišemo (radije bih to uradio u zasebnom fajlu):

Poruka i njena vrsta

javna klasa PlayerIDMessage: MessageBase ( public int PlayerID; ) javni enum MyMsgType: kratki ( PlayerID = MsgType.Highest + 1, )


Za slanje ovu poruku pozvati metodu na klijentu Pošalji (kratka msgType, Networking.MessageBase poruka), koji će serveru poslati msg poruku tipa msgType, ili na serveru na jedan od načina u zavisnosti od svrhe SendToAll(kratka msgType, Networking.MessageBase msg) ili SendToClient(int connectionId, kratka msgType, Networking.MessageBase msg), gdje je connectionId id određenog klijenta.

Obrada dolazne ID osobe na klijentu

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


_CurrentUser.PlayerID = message.PlayerID;

SceneManager.LoadScene(1);

1. Provjerite da vaš zaštitni zid nije blokirao Unity Editor za komunikaciju putem TCP protokoli i UDP. Jednom sam proveo neko vrijeme na tome, uprkos činjenici da sam došao do firewall-a i postavio traženi port u izuzetke, ali nisam provjerio da uređivač nije blokiran.

2. Proslijedite tip vrijednosti ili referentni tip koji se može serijalizirati u porukama i nemojte proslijediti MonoBehavior nasljednike. Također je važno shvatiti da će referentni tip u ovom slučaju prenijeti kopiju objekta, a ne sam objekt, te se mora obraditi u skladu s tim.

U slučaju kada je reč o lokalna mreža i unapred poznatog hardvera, nema mnogo problema koji se javljaju u slučaju „pravog“ multiplayera. Praktično nema potrebe razmišljati o kašnjenjima, fluktuacijama, gubicima paketa itd. Stoga ovakvo rješenje može biti korisno, iako se ovi problemi mogu riješiti ovim pristupom u određenoj mjeri. U poređenju sa više visok nivo apstrakcija u Unetu, preko NetworkManager-a, NetworkBehavior-a, itd., pruža razumljiviju i očigledniju fleksibilnost (po mom mišljenju), ako klijenti treba da učitavaju različite scene itd., i kažu da se server koristi kao streaming servis i pokazuje šta je prikazano na uređaju igrača, uzimajući njegovu poziciju i rotaciju + dupliranje onoga što se dešava na njegovoj strani. U drugim slučajevima, kada je potrebno brže rješenje i znate kako raditi s mrežom, Unet pruža mogućnost pisanja na transportnom sloju.

Takođe bih želeo da pojasnim rešenje na Githubu (ne sa stanovišta alata, već sa stanovišta pristupa arhitekturi) po mom mišljenju, ovo je primer šta ne treba raditi. Da ne spominjemo samu arhitekturu igre, problem je što se logika na klijentu i serveru razmatra nezavisno. Kada se implementira adekvatan multiplayer sa klijent-server arhitekturom, bolje je kada je stanje igre pohranjeno na serveru i replicirano na klijente, a klijenti šalju komande koje mijenjaju stanje igre na serveru. Ovo, naravno, zavisi i od mnogo faktora, ali u prosjeku je to pristup.

Sa razvojem interneta i mobilne tehnologijeČini se da komunikacija uživo postaje rijetkost. Pretpostavimo da nema ništa loše u činjenici da ljudi tokom neugodne tišine radije zarivaju nos u svoje pametne telefone i tablete. Mnogo je gore što takva stvar kao što je lokalni multiplayer postaje prošlost: sada jednim klikom možete igrati bilo koju modernu igricu na mreži bez pozivanja prijatelja - svi su već pozvani u udoban online lobi. Ali šta može biti bolje od komunikacije uživo tokom igranja? Protivničko puhanje zvuči vam pravo u uho, a sve pritužbe možete izraziti lično - ili ih sa zadovoljstvom poslušati upućene vama. Odlučili smo podsjetiti na najmanje deset modernih igara za koje se, uprkos napretku, možete okupiti sa prijateljskom grupom i igrati u duhu stare škole. Tako da se zidovi tresu.

Broforce

Zvanično izdanje Broforcea još nije održano, ali čak i beta verzija ove igre je čisto oduševljenje. Jedan platformer okuplja sve ikone akcionih filmova na prelazu iz 80-ih u 90-e, svaka sa svojim sposobnostima. Od našeg vremena, Broforce je postao još bolji - na primjer, Hulk Hogan se pojavio u igri.

FIFA multiplayer se odavno preselio na internet zahvaljujući uspjehu Ultimate Team moda, ali Gmbox nas podsjeća da lokalni multiplayer ovdje nije otkazan. Kao što pokazuje naše iskustvo, kada zajedno igrate FIFA-u, gamepadi se mnogo brže lome, a nervne ćelije se i dalje ne oporavljaju – ali igra je vrijedna svih ovih žrtava.

TowerFall Ascension

PC, PS4, Ouya

Najnoviji primjer koji je inspirisao ovaj tekst. Sve Towerfall radnje odvijaju se na jednom ekranu, gdje se do četiri igrača mogu boriti istovremeno. Svi su naoružani strelicama, i tu se pravila završavaju i počinje haos: postavke igre nude mnogo opcija za dodavanje haosa u već ubrzanu bitku. Eksperimenti dovode do najneočekivanijih rezultata.

Rok bend 3

PS3, Xbox 360


Najnovija igra iz serije Rock Band stara je već četiri godine, ali šta možete - još uvijek je najbolji način okupite svoju grupu i nemojte se sramotiti. Ako imate sva potrebna zvona i zviždaljke u Rock Bandu, možete organizirati pristojnu VIA-u - sa gitaristom, basistom, bubnjarom, klavijaturistom i tipom koji će u mikrofon uzvikivati ​​svoje omiljene replike iz AC/DC-a.

Mortal Kombat Kompletno izdanje

PC, PS3, Xbox 360

U članku o lokalnom multiplayeru bilo je nemoguće ne spomenuti barem jednu borbenu igru, a mi smo odlučili da se ne pokažemo. Neizmjerno nam je drago što sada postoji gotovo potpuni analog igre koju igramo od kasnih 90-ih na svim mogućim platformama - uključujući i one na kojima nikada nije službeno objavljena.

Tokyo Jungle


Igrati Tokyo Jungle u saradnji je mnogo teže nego igrati sami, ali i zanimljivije. Sve ovisi o izboru životinje. Na primjer, ako igrate kao grabežljivac, a vaš prijatelj igra kao biljožder, morate i loviti i sakupljati biljke. Zauzvrat, dva grabežljivca možda neće dijeliti plijen. Pa, generalno, igranje mačke u paru sa psom ili krokodila u paru s piletinom je neprocjenjivo iskustvo. Inače, ne možete pojesti partnera u igri, čak ni mrtvog. etika...


Rayman Legends

PC, PS3, Xbox 360, PS4, Xbox One

Od vremena Rayman Origins-a, platformeri o Raymanu se mogu igrati u zajedništvu, a ovo je najbolja aktivnost sa porodicom, uporediva sa gledanjem crtanog filma - međutim, igra ima dovoljno trenutaka u kojima ne možete bez tate . U Legendama se pojavila još jedna vrsta lokalnog multiplayera - fudbalska arkadna igra Kung Foot, gdje tim od dva igrača pokušava na bilo koji način gurnuti loptu u gol drugog para. Jednostavno, ali zabavno kao pakao.

PS3, Xbox 360



Konzolna verzija Diablo 3 je za nas bilo otkrovenje iz mnogo razloga. Na primjer, ko bi pomislio da se Diablo može igrati na gamepadu? Ispostavilo se da je ovo još praktičnije od korištenja miša s tastaturom. Ali postoji još jedna stvar: igranje igre sa četiri osobe na jednom ekranu zanimljivije je od igranja same. Lokalna kamera savršeno drži čitav kvartet u kadru, nema borbi za zajednički plen (svako dobija svoj), a mnogo je veća verovatnoća da će stranke dobiti „legendarne“ predmete nego pojedinci.

Spaceteam


Najviše originalna igra od predstavljenih, Spaceteam će promijeniti vaš pogled na bilo koju mrežna igra. Igrači Spaceteam-a moraju raditi zajedno kako bi kontrolirali svemirski brod, provjeravajući kontrolnu ploču, dajući i slijedeći naredbe. U stvarnosti, to izgleda ovako: četiri osobe, zakopane u svoje telefone, razbacuju termine naučne fantastike pomiješane sa izborom opscenosti. Da li se tako ponašaju pravi astronauti? Očigledno se tako ponašaju - struka je jako nervozna.

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

Nintendo Wii/PS3 respektivno

Predstavnici prilično rijetkog žanra „svađalica“: četiri heroja se okupe u jednoj areni i veselo (vjerujte mi na riječ) tuku jedni druge dok se ne odredi pobjednik. Istorija žanra je počela sa Smash Bros., gde ste mogli da suprotstavite skoro svakog Nintendo heroja. Najnovija igra u seriji objavljena je 2008. na Wii-ju i malo je izgubila na važnosti. New Smash Bros. dolazi na Wii U ove godine, tačan datum izlaska nije poznat, ali igra ima analogiju na PS3 - sa herojima PlayStation igara i nekoliko pozvanih gostiju poput Big Daddyja iz BioShocka. Činilo bi se, kakav besramni paus papir - ali sećam se da smo unutra live. Isto želimo i vama.

Ako ste vi i vaši prijatelji vlasnici Android uređaja, možda se poigravate idejom zajedničkog igranja. Provedite veče uronjen u lokalni multiplayer, boreći se i takmičeći se sa prijateljima - šta može biti zanimljivije?!

Broj igara koje implementiraju ovaj način rada je prilično velik. Potrudili smo se da odaberemo najbolje od njih i pozovemo vas da se i sami uvjerite da su zaista fascinantni.

Dizajnirana za do 8 igrača, ova igra Erica Fromlinga je svađalica s više načina igre u kojoj ćete morati bacati mine i bombe na svoje protivnike. Raspon modova će osvojiti svakoga - postoji 10 opcija, uključujući hvatanje zastave, hokej bombardera, kralja brda, eliminaciju i druge jednako zanimljive opcije.

Asfalt 8


Gameloft je uspio stvoriti jedan od najboljih trkača na mobilnim platformama, koji je i dalje impresivan uprkos činjenici da se pojavio prije otprilike dvije godine. Jedna od njegovih praktičnih karakteristika je lokalni multiplayer, zahvaljujući kojem možete organizirati prave utrke u društvu prijatelja bez napuštanja omiljene sofe.


Od svih kart trkaćih igara, ovaj razvojni razvoj iz Vector Unita je možda najbliži omiljenom Mario Kartu, barem kada je u pitanju mogućnost organiziranja lokalnih takmičenja. Imajte na umu da možete otključati razne mape i dati svojim trkačima jedinstvene sposobnosti, koje će vam, u kombinaciji sa svim vrstama pojačivača i pojačanja, omogućiti da utrku učinite još raznolikijom.

JUJU


Flying Wild Hog studio nudi ovu igru ​​prvenstveno mlađoj generaciji gejmera. Izgleda vrlo zanimljivo, ali je namijenjeno samo uređajima opremljenim Tegra procesorom. Za co-op multiplayer trebat će vam dva kontrolera - ovo je još jedan obavezan zahtjev.


Terraria je u stanju da zadrži vašu pažnju dugo vremena - njen 2D svijet osvaja, a njegova izrada, konstrukcija i preživljavanje stvaraju ovisnost. Zajedno sa prijateljem možete kreirati oklop i oružje, napadati šefove, izgraditi kuću i dobiti hranu.

Minecraft: Pocket Edition


Sa ovom kreacijom Mojang studija, sve je jasno - ovdje možete sve, od izrade do bitaka i putovanja. A sve se to može uraditi u društvu prijatelja u lokalnom multiplayer modu. Istraživanje otvorenog svijeta Minecrafta a da ne budete sami je nevjerovatno uzbudljivo. Probajte i uvjerite se sami.


Razvijenu od strane Henryja Smitha, ova igra stavlja vas i tri prijatelja u kontrolu nad svemirskim brodom nasukanim u dubokom svemiru. Ne očekujte mnogo ozbiljnosti od ovog naslova, u njemu ćete naći malo humora, a to zapravo i nije tako loše.