Torna al Blog

Come risolvere il Player Location Desync in UEFN e Unreal Engine Multiplayer

Pubblicato il 27 febbraio 2026
Come risolvere il Player Location Desync in UEFN e Unreal Engine Multiplayer

L'incubo del Multiplayer Transform Desync

Ogni sviluppatore di giochi multiplayer affronta prima o poi il momento in cui il proprio netcode inizia a mentire. Scrivi una sequenza in cui un giocatore si siede su una sedia, la sedia si muove sulla mappa e tutto sembra perfetto sul server. Ma quando carichi un secondo client, l'illusione svanisce. Il Client A vede se stesso sulla sedia perfettamente. Il Client B vede la sedia muoversi mentre il Client A fluttua congelato a mezz'aria nel punto di partenza.

Questo fenomeno — lo uefn player location desync — è un problema noto quando si usano gli input del giocatore per attivare comandi MoveTo su prop che ospitano giocatori collegati (attached). Il server registra la posizione assoluta corretta, ma i simulated proxies (le rappresentazioni del giocatore sugli altri client) non riescono a ereditare il transform aggiornato dal prop genitore.

Che tu stia creando un'esperienza in Unreal Editor for Fortnite (UEFN) o progettando un dedicated server in Unreal Engine 5, capire perché la replication degli attachment fallisce è fondamentale. In questo tutorial, analizzeremo la Network Dormancy, perché gli attachment rompono la client-side prediction e come forzare il replication graph a rispettare lo stato del mondo.

Perché gli Attachment rompono i Network Updates

Per risolvere il desync, devi capire come Unreal Engine gestisce la actor replication gerarchicamente.

Quando un character actor si attacca a un prop, il suo transform diventa relativo al genitore. Per risparmiare banda, Unreal Engine utilizza il concetto di Network Dormancy.

Se un giocatore è seduto e non fornisce input di movimento, il server può contrassegnare il player actor come dormant (dormiente). Il server assume: "Il giocatore non si muove autonomamente, quindi non invierò aggiornamenti per lui. Invierò solo quelli per la sedia."

I numeri dietro il Desync

  • Server Tick Rate: Tipicamente 30Hz in UEFN.
  • Prop NetUpdateFrequency: Spesso 100 aggiornamenti al secondo.
  • Character MinNetUpdateFrequency: Può scendere a 2.0 in assenza di input.

Quando chiami MoveTo, la sedia si aggiorna a 30Hz. Ma poiché il giocatore è dormant, gli altri client non ricevono l'RPC (Remote Procedure Call) per aggiornare la posizione relativa. Risultato? Un enorme desync visivo.

Step 1: Il Workaround in UEFN Verse

Uscire dalla sedia risolve il problema perché cambiare il movement mode da Custom a Walking forza il server a eseguire il flush della Network Dormancy.

Possiamo ricreare questo "flush" in Verse con un micro-teleport per svegliare il replication graph.

# [Codice Verse come originale]

Usando TeleportTo sulle stesse coordinate, attiviamo il flag TeleportPhysics nel motore C++, resettando la client-side prediction.

Step 2: Fix nativo in Unreal Engine C++

Se hai accesso al codice sorgente, puoi usare le API di networking per gestire la dormancy direttamente.

// Esempio C++
// [Codice C++ come originale]

Step 3: Persistenza nel Backend

Assicurati di salvare nel database le coordinate server-authoritative dopo un forced net update. Costruire un backend per salvataggi ad alta frequenza richiede settimane. horizOn offre un Backend-as-a-Service pronto all'uso per sviluppatori di giochi.

5 Best Practices

  1. Mai fidarsi dello stato di attachment del client: Usa RPC server-authoritative.
  2. Gestisci la NetDormancy manualmente: Usa FlushNetDormancy durante i movimenti.
  3. Gerarchie semplici: Evita attachment multi-livello.
  4. RPC affidabili per cambi di stato: Usa NetMulticast per salire/scendere dai prop.
  5. Valida i transform al dismount: Controlla la posizione sul server all'uscita.

Conclusione

I desync multiplayer derivano spesso da ottimizzazioni aggressive. Gestendo la Network Dormancy, puoi forzare gli aggiornamenti. Prendi il controllo del tuo replication graph.

Vuoi scalare il tuo backend? Prova horizOn gratuitamente.