This shows you the differences between two versions of the page.
pjv:laboratoare:08 [2020/01/08 17:06] alexandru.gradinaru |
pjv:laboratoare:08 [2020/01/15 16:51] (current) alexandru.gradinaru |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Multiplayer ====== | + | ====== Multiplayer (bonus) ====== |
Exista mai multe metode de a face un joc controlabil de mai multi jucatori in acelasi timp: | Exista mai multe metode de a face un joc controlabil de mai multi jucatori in acelasi timp: | ||
Line 268: | Line 268: | ||
Pentru integrarea cu Unity, se poate folosi pachetul din Asset Store [[https://assetstore.unity.com/packages/tools/network/darkrift-networking-2-95309|DarkRift Networking 2]] | Pentru integrarea cu Unity, se poate folosi pachetul din Asset Store [[https://assetstore.unity.com/packages/tools/network/darkrift-networking-2-95309|DarkRift Networking 2]] | ||
+ | Folosind un server dedicat trebuie gestionate mai multe elemente: | ||
+ | * conexiunile si lista curenta de clienti conectati | ||
+ | * datele stocate despre player | ||
+ | * mesajele de update | ||
+ | |||
+ | DarkRift foloseste un sistem modular, bazat pe plugin-uri C#, pentru implementarea serverului. | ||
+ | Astfel, putem defini un plugin in felul urmator: | ||
+ | <code> | ||
+ | public class NetPlugin : Plugin | ||
+ | { | ||
+ | |||
+ | Dictionary<IClient, Player> players = new Dictionary<IClient, Player>(); | ||
+ | |||
+ | public override bool ThreadSafe => false; | ||
+ | |||
+ | public override Version Version => new Version(1, 2, 5); | ||
+ | |||
+ | public NetPlugin(PluginLoadData pluginLoadData) : base(pluginLoadData) | ||
+ | { | ||
+ | ClientManager.ClientConnected += ClientConnected; | ||
+ | ClientManager.ClientDisconnected += ClientDisconnected; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | unde clasa Player reprezinta datele stocate despre player. Spre exemplu se pot stoca date legate de pozitie, rotatie sau id de utilizator. | ||
+ | <code> | ||
+ | public struct Player | ||
+ | { | ||
+ | public ushort ID; | ||
+ | public float X, Y, Z; | ||
+ | public float rotX, rotY, rotZ; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | In momentul in care se conecteaza un client, trebuie realizate urmatoarele lucruri: | ||
+ | * instantierea Player-ului in server | ||
+ | * notificarea tuturor celorlalti clienti conectati de conectarea unui nou player | ||
+ | * trimiterea de informatii despre ceilalti clienti, clientului nou conectat | ||
+ | * ascultarea de mesaje de actualizare | ||
+ | |||
+ | <code c#> | ||
+ | void ClientConnected(object sender, ClientConnectedEventArgs e) | ||
+ | { | ||
+ | //new player instance | ||
+ | Player newPlayer = new Player(); | ||
+ | newPlayer.ID = e.Client.ID; | ||
+ | newPlayer.X = 0; | ||
+ | newPlayer.Y = 3; | ||
+ | newPlayer.Z = 0; | ||
+ | newPlayer.rotZ = 0; | ||
+ | newPlayer.rotY = 0; | ||
+ | newPlayer.rotZ = 0; | ||
+ | |||
+ | using (DarkRiftWriter newPlayerWriter = DarkRiftWriter.Create()) | ||
+ | { | ||
+ | newPlayerWriter.Write(newPlayer.ID); | ||
+ | newPlayerWriter.Write(newPlayer.X); | ||
+ | newPlayerWriter.Write(newPlayer.Y); | ||
+ | newPlayerWriter.Write(newPlayer.Z); | ||
+ | newPlayerWriter.Write(newPlayer.rotX); | ||
+ | newPlayerWriter.Write(newPlayer.rotY); | ||
+ | newPlayerWriter.Write(newPlayer.rotZ); | ||
+ | |||
+ | //notify other clients | ||
+ | using (Message newPlayerMessage = Message.Create(0, newPlayerWriter)) | ||
+ | { | ||
+ | foreach (IClient client in ClientManager.GetAllClients().Where(x => x != e.Client)) | ||
+ | client.SendMessage(newPlayerMessage, SendMode.Reliable); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | players.Add(e.Client, newPlayer); | ||
+ | |||
+ | using (DarkRiftWriter playerWriter = DarkRiftWriter.Create()) | ||
+ | { | ||
+ | foreach (Player player in players.Values) | ||
+ | { | ||
+ | playerWriter.Write(player.ID); | ||
+ | playerWriter.Write(player.X); | ||
+ | playerWriter.Write(player.Y); | ||
+ | playerWriter.Write(player.Z); | ||
+ | playerWriter.Write(player.rotX); | ||
+ | playerWriter.Write(player.rotY); | ||
+ | playerWriter.Write(player.rotZ); | ||
+ | } | ||
+ | | ||
+ | //send all other players data to new client | ||
+ | using (Message playerMessage = Message.Create(0, playerWriter)) | ||
+ | e.Client.SendMessage(playerMessage, SendMode.Reliable); | ||
+ | } | ||
+ | |||
+ | e.Client.MessageReceived += MovementMessageReceived; | ||
+ | } | ||
+ | </code> | ||
==== Steam ==== | ==== Steam ==== | ||
Line 285: | Line 379: | ||
... | ... | ||
- | === Cerinte === | + | ===== Cerinte ===== |
Realizarea unui joc multiplayer (network) | Realizarea unui joc multiplayer (network) |