Transferir un objeto entre canales
Mueve un objeto de red entre canales conservando el control del ciclo de vida de la transferencia.
Transferir un objeto entre canales
Eco permite transferir un objeto de red a otro canal. La operación no debe tratarse como un simple cambio local de channelID: el objeto cambia de contexto de red y la implementación debe coordinar la operación con el servidor.
Importante
Durante una transferencia el objeto puede quedar temporalmente marcado como destruido para impedir que se envíen RFC en un estado intermedio. Espera a que la transferencia termine antes de asumir que el objeto está listo para comunicarse en el nuevo canal.
Qué cambia
Un Objeto pertenece siempre a un canal concreto y su identificador completo utiliza ambos datos:
UID = Canal + IDPor eso moverlo de un canal a otro no es simplemente actualizar una variable local. El nuevo contexto forma parte de la identidad de red del objeto.
Ciclo de transferencia
El flujo conceptual es:
Objeto en Canal A
↓
solicitud de transferencia
↓
servidor valida la operación
↓
objeto cambia de canal / identidad
↓
callback de transferencia
↓
Objeto en Canal BDurante el proceso Eco evita tratar el objeto como completamente operativo hasta que la transferencia ha finalizado.
Detectar una transferencia
Objeto expone el callback onTransfer, que recibe el nuevo canal y el nuevo ID:
objeto.onTransfer = (nuevoCanal, nuevoID) =>
{
Debug.Log($"Transferido a {nuevoCanal} con ID {nuevoID}");
};Esto permite reconstruir referencias locales que dependan del canal o del identificador dinámico.
El uid puede cambiar
Como uid combina el canal y el ID:
ulong uid = objeto.uid;no conviene guardar un uid como referencia permanente si el objeto puede transferirse. Después de la operación, vuelve a consultar uid, channelID e id.
Objetos estáticos frente a dinámicos
La propiedad de los objetos estáticos está restringida y no deben tratarse igual que los objetos dinámicos. Para transferencias dinámicas, el ciclo de vida debe mantenerse coordinado con el servidor.
Referencias locales
Evita asumir que una referencia de un sistema externo sigue siendo válida sólo porque la instancia de Unity no ha cambiado. El objeto puede seguir siendo la misma instancia, pero su contexto de red habrá cambiado.
Referencia local
│
▼
Objeto Unity
│
├── channelID ← puede cambiar
├── id ← puede cambiar
└── uid ← cambia con los anterioresQué no hacer
No cambies manualmente channelID para simular una transferencia. Tampoco continúes enviando mensajes usando el contexto antiguo mientras la operación está pendiente.
La transferencia es una operación del modelo de red, no una reasignación de datos de gameplay.
Cuándo utilizarlo
Un caso habitual es mover entidades entre ámbitos de juego:
Canal Lobby
↓
Canal Partida
↓
Canal ResultadoLa utilidad depende de que el objeto deba mantener continuidad lógica entre esos ámbitos. Cuando no sea necesario conservar la identidad, puede ser más sencillo destruir el objeto anterior y crear uno nuevo en el canal destino.
Relación con ownership
Transferir de canal y transferir ownership son operaciones distintas. El cambio de canal modifica el contexto al que pertenece el objeto; owner determina qué jugador tiene autoridad sobre ese objeto.
No asumas que una transferencia de canal equivale automáticamente a transferir propiedad.
Referencia a Eco
La implementación de Objeto expone channelID, id, uid, hasBeenDestroyed, onTransfer y la lógica relacionada con el ciclo de vida del objeto. La documentación debe considerarse subordinada al comportamiento del repositorio actual.
Referencia a TNet
El concepto procede del modelo de objetos por canal de TNet, pero la API utilizada aquí pertenece a Eco. Los ejemplos antiguos de TNet no deben utilizarse como API literal.
Objetos
Referencia del ciclo de vida e identidad de los objetos de red.
Varios canales simultáneos
Uso práctico de varios canales desde una misma conexión.
Transferir la propiedad
Diferencia entre cambiar de canal y cambiar de propietario.
Eco en GitHub
Código fuente de la implementación actual.
