5. Multiplayer online server solutions
Cerinte
Realizarea unui joc multiplayer de tip whack-a-mole / colectare:
Creati o scena care sa genereze random obiecte pe harta, sincronizate in retea. Host-ul sau server-ul este cel care are autoritate, asadar are 'dreptul' de a realiza spawn-ul acestor obiecte
Jocul incepe atunci cand exista cel putin 2 jucatori conectati
Fiecare jucator va avea health, afisati acesta in joc printr-un health bar (ex. world-space canvas)
Jucatorii sunt animati si se pot deplasa folosind input standard de la mouse/tastatura pentru a atinge obiectele
In momentul in care un obiect este atins, jucatorul care l-a atins primeste scor, iar obiectul este distrus
In scena apar la anumite intervale de timp zone de damage
Decideti voi cum si unde apar zonele, va recomandam sa apara la locatii random din ce in ce mai des dupa ce incepe o sesiune de joc
Aceste zone vor aplica damage unitatilor
In mod ideal, precum este si in referinta video, aceste zone sunt marcate in prealabil cu cateva secunde pentru a informa jucatorii de pericol si a le da timp sa se deplaseze din acea zona
Jocul se incheie atunci cand ramane in viata un singur client
Exista un leaderboard afisat pe TAB care afiseaza scorul curent al tuturor jucatorilor conectati
Jocul poate functiona in mod client-server (aveti nevoie de 3 instante/build-uri, unul pentru server, 2 pentru clienti) sau in mod host-client (aveti nevoie de 2 instante/build-uri, unul care va fi atat server cat si client, si un alt client)
Bonus: Click-and-move folosind cursorul
Exemplu: In acest mini-game dintr-un mod de tower defense din Warcraft 3 se poate observa o scena in care apar in mod constant obiecte colectabile (coins), precum si o unitate controlata de player (minutele 5:05 → 5:20). Video referinta. Daca ar fi sa implementati un joculet similar, va trebui sa aveti 2 astfel de unitati spawn-ate in scena, controlabile in mod independent.
Documentatie video
Gasiti pe MS Teams inregistrat
Documentatie text
Pentru acest laborator sugestia este sa folositi Photon Fusion 2. Aceasta este solutia care se va prezenta in cadrul laboratorului, dar conceptele folosite in alte biblioteci de sincronizare sunt similare. Puteti opta pentru alte solutii precum:
NetCode for GameObjects
Mirror
FishNet
DarkRift Networking 2
Photon PUN (predecesor al lui Fusion, asadar recomandam Fusion in schimb)
Solutia de networking built-in din Unreal Engine
Concepte de interes pentru acest laborator (acestea vor fi parcurse pe scurt in laborator dar voi va trebui apoi sa le implementati):
-
Setup scena networked. Aici se prezinta conceptele de baza pentru integrarea Fusion-ului, cum se porneste un joc sincronizat in retea, crearea unui prefab pentru player, citirea si aplicarea de input
Variabile sincronizate. Acestea sunt variabile marcate cu tag-ul
[Networked]
, pe care host-ul sau server-ul le poate seta si sunt in mod automat replicate catre toti clientii conectati in sesiunea curenta. Ganditi-va la scorul fiecarui player, acesta s-ar putea defini in acest mod
Gasiti
aici informatii mai detaliate despre aceste proprietati sincronizate
RPC-uri (remote procedure call). Metode care permit comunicarea client↔server. Ca exemplu, clientul poate trimite un RPC catre server atunci cand colecteaza un obiect a.i. server-ul sa poata face despawn acelui obiect (intrucat server-ul este cel cu autoritate)
Gasisti
aici informatii mai detaliate despre RPC-uri
Pentru testarea jocurilor multiplayer pe local, direct din editor, fara build, un utilitar foarte folositor pentru rularea in pararel a mai multor sesiuni il puteti gasiti aici: ParrelSync (GitHub)
Important: Evenimentele OnTriggerEnter
(si similare) nu sunt reliable pe clienti intr-un context sincronizat. Implementati logica pentru acestea pe host/server sau folositi-va de overlap-uri (OverlapSphere
, OverlapBox
, etc.)
Potential
thread de interes care descrie problema mai in detaliu.
TL;DR, folositi overlaps (links mai sus),
OnTriggerStay
, faceti calculele necesare pe server/host