Great feedback Jawsarn. I’ll speak to as much as I can today:
Yeah good points - we are actively looking into interpolation as a replacement/alternative for partial ticks, as part of broader Unified Netcode efforts.
Fair criticism: We see customers roll their own smoothing quite often, which speaks to the need to resolve this. Those plans last year fell through unfortunately - all I can say today is that it remains in our backlog.
Yeah: We typically recommend not predicting other players for this reason (if your game can get away with it), but obviously that’s not always feasible (e.g. vehicles). Our Lag Compensation assumes you’re shooting at an interpolated ghost, too. Remote prediction makes that story harder.
EDIT2: Apologies, I misread this. This is a known limitation, though technically “not a bug” as it’s by design. We’re thinking it may be better to default to “always rollback all ghosts” for simplicity sake.
Yeah, this is another big pain point we see, but requires a fairly big undertaking to improve. The common workaround here is to have a system running after the GhostUpdateSystem, which clobbers the received interpolated state, using a “manually predicted” state tracked yourself. Unfortunately, you then have to track said predicted state yourself, and this approach only really works if the data transformation is trivial (e.g. briefly detaching positions & health values etc).
It does seem like something we can provide an API for though, agreed.
Nice catch, definitely a bug - would you mind filing a second bug repro for this?
We’re investigating how best to mitigate this ATM… It’s non-trivial: While “writing an ISystem and putting it into a SystemGroup” works from the POV of ease-of-use & flexibility, it does make it impossible to schedule multiple systems worth of work once, unless manually unrolled (but even then, there’s Netcode, Physics & Transforms jobs sprinkled in there).
It may just look like a Netcode config toggle to force the entire PredictedSimulationSystemGroup to Run();, paying the cost of the sync point once. Unfortunately, we don’t have the semantics to force non-netcode-owned jobs within that group to be scheduled via Run();, so even this feels incomplete.
If you’re okay making package modifications, that’s what I’d recommend in the short term.
This is a (very common) misconception: SystemAPI.GetSingleton<NetworkTime>() (& RW & similar) - which unroll to EntityQuery.GetSingleton<T>() etc - do not trigger completions on dependencies, see: Singleton components | Entities | 1.4.3
EDIT:
Yeah, this should get looked at too. IInputComponentData was our attempt at simplifying, but it caused a few new problems. Apologies; can you file a 3rd repo for this?