Hi,
If you just instantiate a rigidbody cannonball via RPC on all clients, it is not guarenteed that it lands on the same spot on all machines, because auf the unstable physic engine. What do you do in this case? Synchronize the rigidbody.position and rotation(maybe even velocity) as well on all the clients every frame, as you would do it with the player characters? Wouldn’t that waste too much bandwidth?
I avoid the physics engine like the plague because of issues like this. If you can I would suggest coding the movement yourself. If not, operate the original on the computer/server that spawned it. And create a separate network object, that is tied to the original. Use RPC updates from the original every FixedUpdate to orient the network one. Use Network.isMine check to delete the the extra one from the originating computer/server. It should be relatively inexpensive to send a single transform’s worth of data at that rate. I’ve used this Shadow entity setup before to great success.
Good Luck!
The best thing to do is increase the size of your objects a little so the little difference will not matter much. Then synchronize rigidbodies if you really want to use rigidbodies for that. The best way to handle it is using a diterministic formula yourself instead of using the rigidbody because your main problem is that different players will do the instantiate in different times so their results will be different (objects moved in different amounts in clients). The rigidbody’s inaccuracy is a few decimals after the decimal point in the float number so it’s not the main problem, if you use a formula of your own, then after instantiation you can see how much time you are back from server and then move the canon based on that.
If you delay your clients behind server for 100 miliseconds or so, then you should not have much problems.
For now focus on making it work either with rigidbody synching or any other method and later on optimize it after you really find out the experience that you want.