Saltar al contenido principal

Modo sin conexión

«Sin conexión» quiere decir dos cosas distintas en MCE, y confundirlas es la forma más rápida de pasarse una tarde depurando una conexión que nunca tuvo que existir.

Qué esPara quién
Sin capa onlineEl motor se compila sin la definición MCE_ONLINE. La capa de Nakama no entra en la compilación.Todo juego de un solo jugador. Es lo que viene por defecto.
Respaldo sin conexiónLa capa online SÍ está compilada, pero ahora mismo no hay servidor que responda.Un juego online con el servidor caído, o un jugador sin conexión.

Un juego de un solo jugador no necesita nada de esta página: sin MCE_ONLINE no hay conexión que perder. El resto de la página habla de la segunda columna.

Qué deja una sesión sin conexión​

NakamaManager tiene una sola máquina de estados, y cuatro situaciones distintas la dejan en Offline:

SituaciónQué pasa
No se encontró el asset OnlineConfigOffline, con No OnlineConfig found. Online features disabled. en el registro
EnableOnline está apagado en la configuraciónOffline, y la llamada de conexión devuelve false en lugar de lanzar una excepción
La conexión falla y AllowOfflineFallback está encendido (lo que viene por defecto)Offline, con Falling back to offline mode. en el registro
La conexión falla y AllowOfflineFallback está apagadoFailed — un estado aparte, para un juego que prefiere detenerse antes que correr a medias

Esa última fila es la razón de ser de la bandera. Un juego donde el progreso tiene que ser autoritativo —una escalera competitiva, una economía compartida— está mejor negándose a arrancar que dejando al jugador jugar una sesión que el servidor nunca va a aceptar. Un juego donde lo online es un extra quiere lo contrario. La bandera está en el asset OnlineConfig, al lado de EnableOnline.

IsOffline es verdadero para Offline y para Disconnected, porque el código que pregunta «¿puedo mandar esto?» quiere la misma respuesta en los dos casos.

Qué sigue funcionando​

Todos los servicios online se pueden construir sin ningún manager. Eso no es un efecto secundario, es el contrato: los servicios se construyen al arrancar, antes de que nadie sepa si va a responder un servidor, y un servicio que lanzara una excepción en su constructor se llevaría el juego puesto.

Así que WorldSyncService, BattleMatchmaker, SpectatorService, RaidBattleService, FriendService, TradeService, GTLService, WalletService, ShopService, CloudSaveService, HousingService y ChannelManager existen en una sesión sin conexión. Lo que no hacen es hablar con nada: una llamada que necesita el servidor informa el fallo en vez de quedarse colgada. CloudSaveService.HasCloudSave es false, y el sistema de guardado local —el mismo que usa un juego de un solo jugador— mantiene el juego andando.

La prueba en modo edición OnlineServices_HandleOfflineMode es la que sostiene esa línea: construye los doce con un manager nulo y falla si alguno lanza una excepción.

Volver a conectarse​

DisconnectAsync vuelve enseguida cuando el estado ya es Disconnected u Offline, así que llamarlo en una sesión sin conexión es seguro y barato. Reconectarse es una llamada de conexión común; no hay que desarmar nada antes.

Qué no muestra esta página​

Todavía no hay una captura de una sesión jugando con el respaldo sin conexión. Los estados, la bandera y los doce servicios salen del código y están cubiertos por la prueba nombrada arriba; la corrida capturada con el servidor detenido a propósito sigue pendiente.