Fix the Limitations of GDevelop “Standard Multiplayer” for Per-Player State

What I have noticed there is this one big disadvantage, in the multiplayer behavior for 3D is that when developing a multiplayer game in GDevelop using the standard (non-P2P) Multiplayer extension, it is not possible to reliably assign unique per-player data (e.g., character selection) at scene start. This leads to a all players end up sharing or inheriting the host’s state,even when using object ownership and per-instance variables.Here’s an example, some Players cant not own the same model even if there is duplicate multiple and separate models for that one player evertying gets bugged because,Clients cannot have independent persistent state at scene start.EVERTYING RUNS FROM THE HOST the host,Ownership controls input & sync, not who initializes data which is crazy. Ever time i tried to Use a GlobalVariable it gets Shared then overwritten then broken.

Evertying what i saw is from the debug menu i am not making stuff up.
What i have Tried is:
When Player selects a character it is then (stored in a global variable)
On scene start:
it is Create a player-owned object (Collision_Box)
Assign:
Object variable Player_ID
Global variable named (CharacterChoice)
it Loop through all player objects:
it Spawn the correct character based on the (CharacterChoice)
This approach appears correct but fails consistently.

What i saw in the runing game itself:

  • Player 1 (host) spawns correctly
  • Player 2:
  • Either gets the same character as Player 1
  • Or does not spawn correctly
  • Debug output shows:
  • Shared or overwritten CharacterChoice
  • Missing or incorrect per-player differentiation

Key Limitations:
There is no reliable way to assign unique per-player state before spawning gameplay objects using standard multiplayer.

1.No True Per-Player Variables
The standard multiplayer system does not provide player-scoped variables.
Available variable types:

  • Global variables → shared across all players
  • Scene variables → shared
  • Object variables → require correct ownership and timing
    There is no built-in equivalent of:
    GetPlayerVariable(playerId, variableName)

2.Scene Initialization is Host-Driven
Events like:
“At the beginning of the scene”
Are effectively controlled by the host’s state.
This causes:

  • Object creation to be initiated by the host
  • Variables copied at creation time to reflect host values
  • Clients not having a chance to inject their own state before spawning

3. Ownership Does Not Control Initialization
While you can assign:
Change the player owning the instance
Ownership only affects:

  • Input handling
  • Synchronization authority
    It does not:
  • Allow each client to initialize their own data
  • Provide a per-player execution context at scene start

4. Global Variables Cause Overwrites
Using:
GlobalVariable(CharacterChoice)
Results in:

  • Last write wins (usually host or fastest client)
  • All players reading the same value during spawn
  • Loss of per-player individuality

5. No Built-In Synchronization Step for Player Data
There is no built-in mechanism to:

  • Collect player-specific data
  • Wait until all players have provided input
  • Then initialize the game state consistently

Developers are forced to:

  • Use global variables (incorrect)
  • Or build custom message systems (complex)

My Final Statement:
The current standard multiplayer system in GDevelop lacks a fundamental concept: per-player state at initialization.
The Common multiplayer features are difficult or impossible to implement correctly and for Developers like myself and others encounter misleading behavior and silent failures i think addressing this would greatly improve Usability,Reduce frustration,Make multiplayer viable for more developers.

2 Likes

Hi, using global variables is the correct approach.
Your mistake is that you’re not disabling synchronization for these variables or disabling it in the wrong place.
You need to disable synchronization for a global variable, such as “character select,” before a multiplayer game starts. For example, you can do this when launching the very first scene, such as “menu” or “initialization.”



In this way, each player creates their own chosen character, the same works with any other data, for example, inside the “GameSaveData” array in my game all the upgrades, settings, etc. are stored.

Yeah i tried what you suggested with disabling global variable synchronization, but I’m still running into the same issue.I just cant build a proper character selection system in standard multiplayer.

Even when I disable global variable synchronization, object creation still ends up using the same value for all players.
I dont think there is reliable way to assign unique per-player data at initialization in standard multiplayer.

If you think you can help me here are my notes bro i give up I tried every possible method in the last 3 years, with the Standart Build in Multiplayer i just either need to move to P2P which is super not secure for what I’m trying to do, or build my self a damn surver there is no other way around.





This doesn’t work because where you create characters there is a condition “Player is host”, that is, the host will create two identical characters of the one he chose.

I strongly recommend keeping things simple and using the character creation system as shown in my screenshot.