I’d like to hear other’ opinions and suggestions on networking solutions for a multiplayer lockstep real time strategy game (MLRTS).
In an MLRTS, there only needs to be 1 Network View and that Network View will sync between itself on all clients players’ commands with a command queue*. Commands will be run at a predetermined frame for a synchronous system and guide 200+ units on what animations to play and what positions to move to. Communication will be done between clients with that Network View exclusively. Some needed features for an MLRTS are:
- Everything standard Unity networking can do (RPC’s mainly)
- Controllable timeout system (So developers can implement their own latency control)
- Detectable statistics about clients like ping (So an adaptable compensation system can be implemented)
- (Not needed, but helpful) Matchmaking system
Things like proper packet send order and packet loss detection aren’t necessary as the confirmation system will be done on top of everything through RPCs.
So far, I have tried out Photon Unity Networking (PUN) but it has not met my requirements completely. Regarding the timeout system, it automatically disconnects clients and does not let me implement a system in which users can continuously attempt to communicate in case of high latency. The server will automatically ‘timeout’ them, removing the user from the game and deleting all network instantiated objects. A way around this would be to reconnect the user but that would be inefficient and I would like to avoid it if I could.
In my opinion, PUN is a great solution for games like FPS’s and MMORPG’s with decent support and handling behind-the-scenes networking necessities but I don’t think it’s made for MLRTS games so I would like to know more about my other options.
Note: In addition to Bolt, SmartFox, and Photon, I’m also considering UnityPark’s uLink which seems to have all the features I need. Is there anybody with experience with uLink?
Thanks everyone in advance :).
*A list of a custom struct containing information such as what command to execute and what frame to execute it on.