- Home /
UNET Networking, syncronizing lists question
Hello. 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);
....
....
blueTeam.Add(player);
....
}
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.
Answer by DiegoSLTS · Aug 25, 2016 at 02:36 PM
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.
(Not sure if my first message got sent) Thank you for the thorough explanation. I will end up making either a SyncListInt with the network id's or a SyncListStruct with id & name.
Yes alright, thank you for the thorough explanation. I will be using either a struct with a int network id and a string for just a sync list int with the id. Thanks again.
Your answer
Follow this Question
Related Questions
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
UNET Server not setting [SyncVar] 0 Answers
Networking Sync SetActive Not Working 0 Answers
Unity Networking RPC - Photon Cloud PUN 0 Answers