I’m working on a simple multiplayer 2D topdown tank game using NGO. The base of the tank handles movement and is controlled directly by the player, while the turret can rotates slowly towards the aiming reticle.
First pass I tried making it all server authoritative at first, where the player only enters the inputs, but the result, even with a microsecond of lag running on the same machine, felt horrible. Basically I want the player to feel responsive to inputs and needs to respond instantaneously, or at least appear to.
Second pass I simply made the tanks into Client Transforms so the client could control them. Feels great, but not server authoritative. I made the turret rotation into a NetworkVariable. The client tells the server where it would like to aim, the NetworkVariable updates and the client tries to match that rotates. Looked good until I introduced some artificial lag and it was very stuttery. It also made aiming bullet impossible and makes them spawn out of sync with where the turret is.
Bullets work great. I followed Tarodev’s video on NGO. So when I shoot on the Client, it spawns a dummy bullet, then ServerRpc the spawnpoint and direction to the server which spawns the real bullet and ClientRpcs more dummy bullets to the clients. It looks and feels good and is close enough to be viable.
Now how I can I do that with things like movement and rotation? Is it all setting up dummy client visuals that only exist kind of where the server thinks they exist?