🎮 UnityDocs

Cloud Save: guardado en la nube

Cómo guardar el progreso en la nube para que siga entre dispositivos: qué es Unity Cloud Save y los Unity Gaming Services, el flujo de autenticación, guardar/cargar por clave, y por qué el servidor es la única defensa real contra trampas.

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-17
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min

Por qué la nube#

Un guardado local vive en un dispositivo: si el jugador cambia de móvil o entra desde el PC, no está. El cloud save guarda el progreso en un servidor asociado a la cuenta del jugador, y lo recupera en cualquier dispositivo (cross-save). Además, al vivir en un servidor, abre la puerta a protegerlo de trampas.

Unity Cloud Save (UGS)#

Unity ofrece Cloud Save dentro de los Unity Gaming Services (UGS): un almacén clave-valor por jugador, sin montar tu propio backend.

Requiere configurar UGS

Necesitas vincular el proyecto a la Unity Dashboard (un Project ID) e instalar los paquetes Authentication y Cloud Save desde el Package Manager. El servicio tiene una capa gratuita generosa y luego escala con el uso.

El flujo: autenticar y luego guardar#

Antes de guardar en la nube hay que identificar al jugador (aunque sea de forma anónima):

C#
using Unity.Services.Core;
using Unity.Services.Authentication;
using Unity.Services.CloudSave;
using System.Collections.Generic;
using UnityEngine;

public class GuardadoNube : MonoBehaviour
{
    async void Start()
    {
        await UnityServices.InitializeAsync();
        // Login anónimo: crea/recupera una cuenta ligada al dispositivo
        if (!AuthenticationService.Instance.IsSignedIn)
            await AuthenticationService.Instance.SignInAnonymouslyAsync();
    }

    public async void Guardar(int nivel, int monedas)
    {
        var datos = new Dictionary<string, object> { { "nivel", nivel }, { "monedas", monedas } };
        await CloudSaveService.Instance.Data.Player.SaveAsync(datos);
    }

    public async void Cargar()
    {
        var claves = new HashSet<string> { "nivel", "monedas" };
        var datos = await CloudSaveService.Instance.Data.Player.LoadAsync(claves);
        if (datos.TryGetValue("nivel", out var v)) Debug.Log("Nivel: " + v.Value.GetAs<int>());
    }
}
Local primero, nube después

El patrón robusto: guarda siempre en local (rápido, funciona sin conexión) y sincroniza con la nube cuando hay red. Si el jugador está offline, el juego sigue; al reconectar, subes. Nunca dependas de la nube para poder jugar.

La nube y las trampas#

Aquí está la gran ventaja de fondo: un guardado local siempre se puede editar; solo el servidor puede ser autoridad.

Cloud Save no es automáticamente anti-cheat

Guardar en la nube protege el progreso entre dispositivos, pero si el cliente decide "tengo 999 monedas" y lo sube, la nube lo cree. Para datos competitivos (rankings, economía real) necesitas lógica en servidor que valide (Cloud Code / tu backend): el cliente propone, el servidor decide. Es el mismo principio del servidor autoritativo en multijugador.

Errores frecuentes#

  • Intentar guardar en la nube sin autenticar primero (falla).
  • Depender de la conexión para poder jugar (guarda local y sincroniza).
  • Subir datos sensibles sin validarlos en servidor y creer que están "seguros".
  • No gestionar conflictos (jugó offline en dos sitios): decide una política (último gana, o fusionar).
  • Bloquear el hilo esperando la nube: las llamadas son async, úsalas sin congelar el juego.

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

El cloud save guarda el progreso por cuenta en un servidor (cross-save entre dispositivos). Con Unity Cloud Save (UGS) tienes un almacén clave-valor sin montar backend: inicializas UGS, autenticas (login anónimo vale) y usas SaveAsync/LoadAsync. El patrón sano es local primero, nube después, para funcionar sin conexión. Y recuerda: la nube protege el progreso, pero solo la validación en servidor frena las trampas — el cliente propone, el servidor decide. Para lo local, sigue con JSON o binario.

Fuentes y para profundizar