La sincronización de estado se refiere a la sincronización de valores como enteros, números de punto flotante, cadenas y valores booleanos que pertenecen a scripts en sus GameObjects conectados en red.
La sincronización de estado se realiza desde el servidor a los clientes remotos. El cliente * local * no tiene datos serializados. No lo necesita, porque comparte la escena con el servidor. Sin embargo, los enlaces de SyncVar se llaman en clientes locales.
Los datos no se sincronizan en la dirección opuesta: de los clientes remotos al servidor. Para hacer esto, necesita usar Comandos.
SyncVars son variables de scripts que heredan de NetworkBehaviour, que se sincronizan desde el servidor a los clientes. Cuando se genera un GameObject, o un nuevo jugador se une a un juego en curso, se les envía el último estado de todas las SyncVars en los objetos en red que son visibles para ellos. Use el atributo personalizado [SyncVar]
para especificar qué variables en su script desea sincronizar, como esto:
class Player : NetworkBehaviour {
[SyncVar]
int health;
public void TakeDamage(int amount)
{
if (!isServer)
return;
health -= amount;
}
}
El estado de SyncVars se aplica a GameObjects en los clientes antes de llamar a OnStartClient (), por lo que el estado del objeto siempre está actualizado dentro de OnStartClient().
SyncVars puede ser tipos básicos como enteros, strings y floats. También pueden ser tipos de Unity como Vector3 y estructuras definidas por el usuario, pero las actualizaciones para struct SyncVars se envían como actualizaciones monolíticas, no como cambios incrementales si los campos dentro de una estructura cambian. Puede tener hasta 32 SyncVars en un solo script de NetworkBehaviour, incluyendo SyncLists (consulte la siguiente sección, a continuación).
El servidor envía automáticamente actualizaciones de SyncVar cuando cambia el valor de un SyncVar, por lo que no necesita realizar un seguimiento de cuándo cambian o enviar información sobre los cambios.
Mientras que SyncVars contiene valores, SyncLists contiene listas de valores. Los contenidos de SyncList se incluyen en las actualizaciones de estado iniciales junto con los estados de SyncVar. Como SyncList es una clase que sincroniza sus propios contenidos, SyncLists no requiere el atributo SyncVar. Los siguientes tipos de SyncList están disponibles para los tipos básicos:
SyncListString
SyncListFloat
SyncListInt
SyncListUInt
SyncListBool
También está SyncListStruct, que puede usar para sincronizar listas de sus propios tipos de estructura. Cuando se utiliza SyncListStruct, el tipo de estructura que elige usar puede contener miembros de tipos básicos, matrices y tipos comunes de Unity. No pueden contener clases complejas o contenedores genéricos, y solo las variables públicas en estas estructuras están serializadas.
SyncLists tiene un delegado SyncListChanged llamado Callback que permite que los clientes reciban una notificación cuando el contenido de la lista cambie. Se llama a este delegado con el tipo de operación que se produjo y el índice del elemento para el que se realizó la operación.
public class MyScript : NetworkBehaviour
{
public struct Buf
{
public int id;
public string name;
public float timer;
};
public class TestBufs : SyncListStruct<Buf> {}
TestBufs m_bufs = new TestBufs();
void BufChanged(Operation op, int itemIndex)
{
Debug.Log("buf changed:" + op);
}
void Start()
{
m_bufs.Callback = BufChanged;
}
}