I was recently trying to move an object in a spiral. The object geometry, defined in a client context, was referenced by a server script. I moved it using MoveTo and experimented with different time steps (I controlled the whole thing by spawning events at a fixed interval to calculate the incremental movement, the same interval was used in the MoveTo).
I needed reasonably small increments (0.1s) to give a smooth curve to the motion and all looked good when I ran everything locally as a single client (shift + play in the editor). As soon as I moved to a server-client run (just a normal mp play in the editor) the object motion was noticeably jerky. I assume this is some issue with the update frequency from the server.
Increasing the time increment improved the smoothness of the motion, but changed the appearance of the curved motion to a sequence of straight lines (as you would expect).
What would be the correct way to achieve this? I can't move the object from the client side as I need it to be a networked object.
I haven't used MoveTo yet, but it sounds like latency. Indeed, when you have a script which modifies geometry and you want it to be network synchronized, then your best bet is to perform "MoveTo" on both sides rather than waiting for the engine to update clients. Right now it's only happening on the server, and the server has to manually update clients with the new position.
Core server 30 ticks/second so if your game is running over 30 or so fps then it's always gonna be jerky, unless you put some client side scripting in.
Look into network contexts. The script you use to tick movement should probably be in a static context. Just be wary that the client and server could go out of sync; so make use of the server view mode and watch the client/server simulation for a bit. I don't know the extent of floating point rounding inaccuracies accumulating over time (because of server and client being different machines, it's an age old problem) but this is definitely the purpose of static contexts - logic that runs on both server and client.
Also if you have a static script for movement then you technically don't need the object to be networked. BUT again, accumulation of rounding errors - maybe it's worth using a custom property or something to just make sure the client matches the server position after every X ticks, not sure if that's needed.
If you want to hide your movement code from clients, and that's why it's only on the server, then I'm afraid that's really not possible. Gotta have client side code so it can predict the server-authorarive movement.