logo
Guías

Sincronizar una entidad

Sincroniza el estado de una entidad de red utilizando la autoridad y el sistema de datos de Eco.

Sincronizar una entidad

Una vez creado un objeto de red, el siguiente paso habitual es mantener parte de su estado sincronizado entre los participantes.

La idea central es sencilla: el objeto tiene un estado y un propietario, y Eco se encarga de propagar los cambios según el modelo de autoridad.

Definir el componente

Crea un Componente que represente el comportamiento de la entidad.

public class Unidad : Componente
{
    public void CambiarVida(int valor)
    {
        Set("vida", valor);
    }
}

El Componente utiliza su Objeto asociado para acceder al estado de red.

Escribir el estado

El estado puede escribirse mediante Set:

Set("vida", 100);
Set("nivel", 5);

También puedes utilizar rutas jerárquicas cuando el estado tenga más estructura:

Set("estadisticas/vida", 100);
Set("estadisticas/defensa", 25);

El valor se actualiza localmente antes de que Eco determine cómo debe propagarse.

Leer el estado

Cualquier participante que disponga del objeto puede consultar los datos mediante Get:

int vida = Get<int>("vida");
int nivel = Get<int>("nivel");

La lectura no implica comunicación con el servidor: consulta el estado local conocido por ese objeto.

Entender la autoridad

El punto más importante es decidir quién puede producir el estado.

                 Objeto

              propietario

          ┌─────────┴─────────┐
          │                   │
        Propietario        Otros clientes
          │                   │
       produce             consumen
        estado               estado

Cuando el cliente local es propietario, Eco puede distribuir el cambio y actualizar el estado persistente cuando corresponde.

Cuando el cliente no es propietario, un cambio puede requerir una solicitud al propietario en lugar de modificar unilateralmente la autoridad remota.

Sincronizar un estado sencillo

Para una propiedad discreta, el flujo normal puede ser tan simple como:

public void RecibirDaño(int daño)
{
    int vida = Get<int>("vida");
    Set("vida", Mathf.Max(0, vida - daño));
}

Aquí vida es estado. No hace falta convertir cada valor en una llamada remota diferente como CambiarVida(99), CambiarVida(98), etc.

¿Qué ocurre si todavía no se puede enviar?

Durante determinadas fases de conexión o entrada a canales, el objeto puede existir localmente pero todavía no estar listo para transmitir.

En ese caso, Eco puede mantener los cambios pendientes y procesarlos cuando PuedeEnviar vuelva a ser verdadero.

Set()

actualización local

¿Puede enviar?
 ├── Sí → sincronizar
 └── No → mantener pendiente

        objeto preparado

          sincronizar

Esto evita que el gameplay tenga que conocer todos los estados transitorios de la conexión.

Sincronización automática

Cuando una propiedad de Unity debe sincronizarse periódicamente, AutoSincronizar puede evitar tener que escribir manualmente el código de comparación y envío.

Es especialmente útil durante prototipos o para componentes sencillos.

Transform / campo

AutoSincronizar

cambio detectado

Send / SendQuickly

AutoSincronizar comprueba valores mediante reflexión y puede limitar la frecuencia de actualización con updatesPerSecond.

Elegir el mecanismo correcto

NecesidadMecanismo
Propiedad persistente de una entidadSet / estado del objeto
Acción puntualRFC
Campo de Unity durante prototipoAutoSincronizar
Estado muy frecuente y críticoSistema específico optimizado
Estado que debe sobrevivir a nuevos jugadoresPersistencia del estado

Una regla útil es distinguir estado de acción.

"Mi vida es 80"   → estado
"He atacado"      → acción

El primero suele ser candidato a sincronización; el segundo suele expresarse mediante una comunicación de evento o RFC.

Ejemplo completo

public class Unidad : Componente
{
    protected override void Start()
    {
        base.Start();

        if (isMine && !Has("vida"))
            Set("vida", 100);
    }

    public void RecibirDaño(int daño)
    {
        if (!isMine) return;

        int vida = Get<int>("vida");
        Set("vida", Mathf.Max(0, vida - daño));
    }

    public int ObtenerVida()
    {
        return Get<int>("vida");
    }
}

La idea importante del ejemplo no es la clase concreta, sino el reparto de responsabilidades:

Unity / gameplay

Componente

Objeto

Estado + propietario

Eco

Errores habituales

Sincronizar todo por RFC

Generar una RFC por cada cambio de propiedad suele complicar el sistema y puede aumentar el tráfico innecesariamente.

Ignorar la propiedad

Si varios clientes pueden escribir el mismo estado sin un criterio de autoridad, la documentación del estado deja de representar una única fuente de verdad.

Usar AutoSincronizar para todo

Es cómodo, pero su implementación basada en reflexión y comprobaciones periódicas puede resultar innecesaria en sistemas críticos o de alta frecuencia.

Confundir lectura con sincronización

Get devuelve el estado que el objeto conoce localmente. No es una consulta remota al servidor.

Relación con TNet

El modelo es equivalente al flujo tradicional de TNObject y TNAutoSync, pero en Eco los nombres públicos son Objeto, Componente y AutoSincronizar.

La referencia principal para el comportamiento sigue siendo el código de Nervelink/eco.

Referencias

Objeto y datos

Identidad, propiedad y estado de los objetos de Eco.

Sincronización

Funcionamiento detallado del sistema de sincronización.

TNet upstream

Referencia de la arquitectura original.

DeepWiki · TNet

Referencia generada sobre el repositorio actual de TNet.

On this page