I currently use list of GameObjects in my Unity UNET project, defined this way
public List<GameObject> blueTeam;
I’ve just ran into some issues with it, where that remote clients won’t be removed from the list.
So I checked up on syncronization and do I have to use a custom struct and a SyncListStruct if I want to have networked lists?
My code goes the following.
public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
//Instatiante our player
GameObject player = (GameObject)Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
When a remote client then is removed, the entry in the list is not and the list just says it’s missing a gameobject. This only happens on remote clients, and not on the server/hoster.
So before I reformat my code with structs, as UNET doc example says, I just want to know if anyone could help me out.
note: I also tried removing the remote client via a command, same issues occurs.
Yes, SyncList* classes are one way to synchronize a list of values of some type. For non basic values like floats or bools you have to sync structs, not objects. List objects are not synchronized through the network even if you put the SyncVar attribute. Another approach is to call an RPC method on all clients with an array of some struct with the new values.
But in your case, since you’re synching players (I guess this are Player objects in the UNET context, with a NetworkID, that you later Spawn in all clients) you can use a SyncListInt with the NetworkID’s of the players casted as ints.
Another approach would be to have a SyncVar in the player with some ID of the team it was assigned, so there’s no need to sync the whole list. I think this is better, when writing the network part of a game you should always try to sync the less things as possible. Using a SyncList will send all the values of the list to all the clients every time you set a new value when you probably just want them to know that a new player joined the team. Clients can do something when a player’s “team” var changes, like updating local List variables for each team.