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.
publicvoidPlayerScored(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 =newPlayerScores(); }bool foundPlayerScore =false; // If player already have a score, increase it by 1.foreach (Score s inplayerScores.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 =newScore();ps.playerRemoteId= playerId;ps.score=1;playerScores.scores.Add(ps); } // Modify the "PlayerScores" SyncPropertyroomPropertyAgent.Modify<PlayerScores>("PlayerScores", playerScores); }