Updating Room States

3 - 5 minutes read

RoomPropertyAgent

You have used SyncPropertyAgent to update player properties. RoomPropertyAgent is similar to SyncPropertyAgent, but it is designed to updates room level properties.

Select the GameManager GameObject in the Scene Hierarchy, Click the Add Component Button and search for "GameDataManager". Select RoomPropertyAgent to Attach it to the GameManager GameObject.

Similar to SceneSpawner, a Network System ID component is attached automatically. You can have multiple RoomPropertyAgents, make sure you assign different Agent Id to them.

Adding "PlayerScores" SyncProperty

Click Add Game Sync Property button and name the new SyncProperty "PlayerScores". Set Type to Serializable.

Rules for wining the game

For this tutorial, the player who killed opponents 3 times is the winner of the game. You can use serializable objects to store player scores.

GameData and PlayerScore

Create a new script and call it GameDataModels.cs. Add GameData and PlayerScore Serializable Classes.

using System;
using System.Collections.Generic;

[Serializable]
public class PlayerScores
{
    public List<Score> scores = new List<Score>();
}

[Serializable]
public class Score
{
    public string playerRemoteId;
    public int score;
}

Update the GameSceneManager.cs script

GameSceneManager should have a reference to its RoomPropertyAgent component.

RoomPropertyAgent roomPropertyAgent;

private void Start()
{
    roomPropertyAgent = GetComponent<RoomPropertyAgent>();
}

Added a method to update player's score.

    public void PlayerScored(string playerId)
    {
        // Read the current value of the "PlayerScores" SyncProperty.
        PlayerScores playerScores = roomPropertyAgent.GetPropertyWithName("PlayerScores").GetValue<PlayerScores>();

        // Initialize the playerScores object.
        if (playerScores == null)
        {
            playerScores = new PlayerScores();
        }

        bool foundPlayerScore = false;

        // If player already have a score, increase it by 1.
        foreach (Score s in playerScores.scores)
        {
            if (s.playerRemoteId == playerId)
            {
                s.score++;
                foundPlayerScore = true;
            }
        }

        // If player has not scored yet, add a new score for the player and set its value to 1.
        if (!foundPlayerScore)
        {
            Score ps = new Score();
            ps.playerRemoteId = playerId;
            ps.score = 1;
            playerScores.scores.Add(ps);
        }

        // Modify the "PlayerScores" SyncProperty
        roomPropertyAgent.Modify<PlayerScores>("PlayerScores", playerScores);
    }

Last updated