Realizarea unui joc multiplayer de tip social:
DarkRift 2 este un server dedicat, modular, care implementeaza protocoale de comunicare ca TCP, UDP, dar si cu extensii pentru WebSocket sau RUDP. Pentru integrarea cu Unity, se poate folosi pachetul din Asset Store DarkRift Networking 2
Folosind un server dedicat trebuie gestionate mai multe elemente:
DarkRift foloseste un sistem modular, bazat pe plugin-uri C#, pentru implementarea serverului. Astfel, putem defini un plugin in felul urmator:
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; } }
unde clasa Player reprezinta datele stocate despre player. Spre exemplu se pot stoca date legate de pozitie, rotatie sau id de utilizator.
public struct Player { public ushort ID; public float X, Y, Z; public float rotX, rotY, rotZ; }
In momentul in care se conecteaza un client, trebuie realizate urmatoarele lucruri:
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; }