Bird
Raised Fist0
Unityframework~10 mins

State synchronization in Unity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - State synchronization
Local State Change
↓
Send Update to Network
↓
Receive Update on Other Clients
↓
Apply Update to Local State
↓
State is Synchronized
↓
Repeat on Next Change
State synchronization means when one player changes something, that change is sent to others and applied so everyone sees the same thing.
Execution Sample
Unity
void UpdatePosition(Vector3 newPos) {
    transform.position = newPos;
    CmdSendPosition(newPos);
}

[Command]
void CmdSendPosition(Vector3 pos) {
    RpcUpdatePosition(pos);
}

[ClientRpc]
void RpcUpdatePosition(Vector3 pos) {
    transform.position = pos;
}
This code updates an object's position locally, sends the new position to the server, which then tells all clients to update their positions.
Execution Table
StepActionLocal PositionNetwork Message SentNetwork Message ReceivedPosition Updated on Clients
1Player moves object locally(1,0,0)Send CmdSendPosition(1,0,0)NoNo
2Server receives CmdSendPosition(1,0,0)Send RpcUpdatePosition(1,0,0)NoNo
3Clients receive RpcUpdatePosition(1,0,0)NoRpcUpdatePosition(1,0,0)Update position to (1,0,0)
4State synchronized on all clients(1,0,0)NoNoPosition matches on all clients
5Player moves object locally again(2,0,0)Send CmdSendPosition(2,0,0)NoNo
6Server receives CmdSendPosition(2,0,0)Send RpcUpdatePosition(2,0,0)NoNo
7Clients receive RpcUpdatePosition(2,0,0)NoRpcUpdatePosition(2,0,0)Update position to (2,0,0)
8State synchronized on all clients(2,0,0)NoNoPosition matches on all clients
💡 No more position changes; all clients have synchronized positions.
Variable Tracker
VariableStartAfter Step 1After Step 3After Step 5After Step 7Final
Local Position(0,0,0)(1,0,0)(1,0,0)(2,0,0)(2,0,0)(2,0,0)
Network Message SentNoneCmdSendPosition(1,0,0)NoneCmdSendPosition(2,0,0)NoneNone
Network Message ReceivedNoneNoneRpcUpdatePosition(1,0,0)NoneRpcUpdatePosition(2,0,0)None
Position Updated on Clients(0,0,0)(0,0,0)(1,0,0)(1,0,0)(2,0,0)(2,0,0)
Key Moments - 3 Insights
Why does the local position update before the network message is sent?
Because the player moves the object locally first (see Step 1 in execution_table), then the change is sent to others. This makes the game feel responsive.
What happens if the network message is delayed?
Other clients keep the old position until they receive the update (see Step 3 and 7). This can cause temporary differences until synchronization.
Why do we use a Command and then a ClientRpc?
The Command sends data from client to server (Step 1 to 2), and the ClientRpc sends data from server to all clients (Step 2 to 3), ensuring all clients get the update.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the local position after Step 5?
A(1,0,0)
B(0,0,0)
C(2,0,0)
D(3,0,0)
💡 Hint
Check the 'Local Position' column at Step 5 in the execution_table.
At which step do clients update their position to (1,0,0)?
AStep 3
BStep 1
CStep 5
DStep 7
💡 Hint
Look at the 'Position Updated on Clients' column for when position changes to (1,0,0).
If the CmdSendPosition message is never sent, what happens to other clients?
AThey update position anyway
BThey keep old position and never synchronize
CThey crash
DThey send their own position back
💡 Hint
Refer to the 'Network Message Sent' and 'Position Updated on Clients' columns in the execution_table.
Concept Snapshot
State synchronization in Unity:
- Local changes update immediately for responsiveness.
- Commands send changes from client to server.
- ClientRpc broadcasts updates from server to all clients.
- Other clients apply updates to keep states in sync.
- Network delays can cause temporary differences.
Full Transcript
State synchronization means when a player changes something locally, that change is sent to the server using a Command. The server then sends the update to all clients using a ClientRpc. Each client applies the update to keep the game state the same everywhere. This process repeats whenever the state changes. The local player sees immediate changes for smooth gameplay, while others update when they receive network messages. If messages are delayed or lost, clients may temporarily have different states until synchronization happens.

Practice

(1/5)
1. What is the main purpose of state synchronization in Unity multiplayer games?
easy
A. To create new game levels automatically
B. To improve graphics quality
C. To speed up the game loading time
D. To keep game data consistent for all players

Solution

  1. Step 1: Understand the role of state synchronization

    State synchronization ensures that all players see the same game data, like positions and health.
  2. Step 2: Identify the correct purpose

    Keeping data consistent for all players is the key goal of state synchronization.
  3. Final Answer:

    To keep game data consistent for all players -> Option D
  4. Quick Check:

    State synchronization = consistent data [OK]
Hint: Think: same game info for everyone [OK]
Common Mistakes:
  • Confusing synchronization with graphics or loading speed
  • Thinking it creates new content automatically
2. Which of the following is the correct way to declare a NetworkVariable for player health in Unity?
easy
A. public NetworkVariable<int> playerHealth = new NetworkVariable<int>(100);
B. NetworkVariable playerHealth = 100;
C. int playerHealth = new NetworkVariable<int>();
D. public int playerHealth = NetworkVariable<int>(100);

Solution

  1. Step 1: Recall NetworkVariable declaration syntax

    NetworkVariable must be declared with type and initialized properly, like new NetworkVariable<int>(initialValue).
  2. Step 2: Check each option

    public NetworkVariable<int> playerHealth = new NetworkVariable<int>(100); correctly declares and initializes playerHealth as a NetworkVariable of int with 100.
  3. Final Answer:

    public NetworkVariable<int> playerHealth = new NetworkVariable<int>(100); -> Option A
  4. Quick Check:

    Correct NetworkVariable syntax = public NetworkVariable<int> playerHealth = new NetworkVariable<int>(100); [OK]
Hint: Look for 'new NetworkVariable<Type>(value)' pattern [OK]
Common Mistakes:
  • Assigning value directly without NetworkVariable
  • Missing 'new' keyword or type in declaration
3. Given this code snippet in a Unity multiplayer game, what will be the output if the owner updates the position?
public NetworkVariable<Vector3> playerPosition = new NetworkVariable<Vector3>(Vector3.zero);

void UpdatePosition(Vector3 newPos) {
    if (IsOwner) {
        playerPosition.Value = newPos;
    }
    Debug.Log(playerPosition.Value);
}
medium
A. Always Vector3.zero
B. The new position value passed to UpdatePosition
C. Null reference error
D. The previous position before update

Solution

  1. Step 1: Understand owner update behavior

    Only the owner can update the NetworkVariable value, so playerPosition.Value changes to newPos.
  2. Step 2: Check what Debug.Log prints

    Debug.Log prints the current value of playerPosition, which is updated to newPos by the owner.
  3. Final Answer:

    The new position value passed to UpdatePosition -> Option B
  4. Quick Check:

    Owner updates value = new position logged [OK]
Hint: Owner changes value, so output matches newPos [OK]
Common Mistakes:
  • Thinking value stays zero after update
  • Expecting error due to NetworkVariable usage
  • Assuming non-owner can update value
4. Identify the error in this Unity state synchronization code snippet:
public NetworkVariable<int> score = new NetworkVariable<int>(0);

void UpdateScore(int points) {
    score.Value += points;
}
medium
A. Missing type declaration for score
B. Incorrect NetworkVariable initialization
C. Updating NetworkVariable without checking ownership
D. Using += operator on NetworkVariable directly

Solution

  1. Step 1: Review NetworkVariable update rules

    NetworkVariables should only be updated by the owner or server to avoid conflicts.
  2. Step 2: Check code for ownership check

    The code updates score.Value without verifying if the caller is the owner, which can cause sync issues.
  3. Final Answer:

    Updating NetworkVariable without checking ownership -> Option C
  4. Quick Check:

    Always check ownership before updating NetworkVariable [OK]
Hint: Always verify ownership before changing NetworkVariable [OK]
Common Mistakes:
  • Forgetting ownership check before update
  • Assuming NetworkVariable updates are automatic
  • Confusing syntax errors with logic errors
5. You want to synchronize a player's inventory (a list of strings) across the network in Unity. Which approach correctly applies state synchronization principles?
hard
A. Use a NetworkList<string> updated only by the owner, syncing changes automatically
B. Use a regular List<string> and update it on all clients manually
C. Use a NetworkVariable and update it from any client freely
D. Send inventory data as strings via RPC every frame without ownership checks

Solution

  1. Step 1: Identify the correct data structure for lists

    NetworkList is designed for syncing collections like lists automatically in Unity.
  2. Step 2: Apply ownership update rule

    Only the owner should update the NetworkList to keep data consistent and avoid conflicts.
  3. Final Answer:

    Use a NetworkList<string> updated only by the owner, syncing changes automatically -> Option A
  4. Quick Check:

    NetworkList + owner updates = correct sync [OK]
Hint: Use NetworkList and update only as owner [OK]
Common Mistakes:
  • Using regular List without network sync
  • Updating NetworkVariable<List> from any client
  • Sending data every frame without ownership checks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard