Unity (WebGL)

El paquete de Unity com.gamealia.sdk es un plugin .jslib más un wrapper en C# sobre el SDK de JavaScript. Unity 2021.3 o más nuevo, con target WebGL.

Instalación

La forma fácil: corré gamealia init --write en la carpeta del proyecto de Unity (o pedíselo a tu asistente, que usa gamealia_integrate_sdk). Agrega:

  • el paquete en Packages/com.gamealia.sdk/ (Runtime: Gamealia.cs, Gamealia.jslib);
  • la plantilla WebGL Assets/WebGLTemplates/Gamealia/, que carga el SDK antes del loader de Unity.

Después elegí la plantilla en Player Settings → WebGL → Resolution and Presentation → WebGL Template → Gamealia.

¿Usás tu propia plantilla? Agregá esto en su <head>, antes del script del loader de Unity:

<script src="https://gamealia.app/sdk/v1.js"></script>

Compilá para WebGL y subí la carpeta del build (la que tiene index.html y Build/). Si tu build usa hilos (SharedArrayBuffer), poné el aislamiento de la ficha en coop-coep.

Uso

void Start()
{
    Gamealia.OnAdStart += () => Time.timeScale = 0f; // el audio se silencia solo (AutoMuteAudio)
    Gamealia.OnAdEnd += () => Time.timeScale = 1f;
    Gamealia.OnPause += () => Time.timeScale = 0f;
    Gamealia.OnResume += () => Time.timeScale = 1f;

    Gamealia.Init(info =>
    {
        // info.locale: "es", "en", ...; info.environment: "gamealia" | "preview" | "autotest" | "mock"
        Gamealia.Data.Load(r =>
        {
            if (r.ok) Gamealia.Data.Get<SaveData>("save", s => { if (s != null) save = s; Ready(); });
            else Ready(); // no se pudo leer la partida: usá los valores por defecto y no la pises
        });
    });
}

void Ready()
{
    Gamealia.Game.LoadingStop(); // obligatorio, cuando el juego ya se puede jugar
}

public void StartLevel() => Gamealia.Game.GameplayStart();

public void GameOver()
{
    Gamealia.Game.GameplayStop();
    Gamealia.Ad.RequestMidgame(shown => ShowGameOverScreen());
}

public void WatchAdForLife()
{
    Gamealia.Ad.RequestRewarded((shown, rewarded) => { if (rewarded) lives++; });
}

El ejemplo del paquete (Package Manager → Gamealia SDK → Samples → Basic) tiene un script completo.

API

Cada callback corre en el hilo principal, de forma asíncrona, y nunca lanza excepciones. Si algo falla, devuelve los mismos valores por defecto que el SDK de JavaScript.

C#JavaScript
Gamealia.Init(Action<InitResult>), Gamealia.Info, IsInitialized, Locale, Environment, IsMobileinit()
Gamealia.IsAvailablela página cargó el SDK (false en el Editor)
Gamealia.Game.LoadingStart(), LoadingStop(), GameplayStart(), GameplayStop(), HappyTime()game.*
Gamealia.Ad.RequestMidgame(Action<bool> shown)ad.requestMidgame()
Gamealia.Ad.RequestRewarded(Action<bool, bool> (shown, rewarded))ad.requestRewarded()
Gamealia.User.Get(Action<PublicUser>), GetToken(Action<string>), RequestLogin(Action<PublicUser>)user.*
Gamealia.Data.Load(Action<LoadResult>) (ok, json, error)data.load()
Gamealia.Data.Get<T> / Set<T> (tipos de JsonUtility), GetJson / SetJson, GetString / SetString, GetInt / SetInt, GetFloat / SetFloat, GetBool / SetBool, Remove, Cleardata.get/set/remove/clear()
Gamealia.Room.GetJoinCode() (sincrónica), InviteLink(code, Action<string>), ShowInvite(code), Publish(RoomInfo), Unpublish()room.*
Gamealia.Presence.SetStatus(text)presence.setStatus()
eventos OnAdStart, OnAdEnd, OnPause, OnResume, OnMute, OnUnmute, OnUserChange, OnRoomJoinon(event)
  • Audio: con Gamealia.AutoMuteAudio (por defecto true) se activa AudioListener.pause mientras se muestra un anuncio.
  • Partidas: 1 MB por jugador y juego. Los callbacks de Set* reciben false si no se guardó.
  • Idioma: Gamealia.Locale es el idioma del jugador; antes de que termine Init es el del sistema.

En el Editor

En el Editor, en otras plataformas y en una página WebGL sin el SDK (por ejemplo sin conexión), todas las llamadas funcionan en local: Init responde con environment: "mock", los anuncios responden "no se mostró" y los datos quedan en PlayerPrefs. Compilá y corré gamealia preview para ver el flujo real con anuncios simulados.

Cómo funciona

Gamealia.jslib llama a window.Gamealia y responde con SendMessage("GamealiaBridge", "OnResult", json); los eventos llegan por SendMessage("GamealiaBridge", "OnEvent", json). El GameObject GamealiaBridge se crea solo y sobrevive a los cambios de escena: no lo renombres ni lo destruyas.

Fallas comunes del autotest

  • sdk_loaded: el build no usa la plantilla de Gamealia (o la tuya no tiene la etiqueta de script).
  • loading_stop: Gamealia.Game.LoadingStop() no se llama dentro de los 15 s; llamalo apenas la primera escena se puede jugar, no después de una descarga larga.
  • engine_integrity: subí la carpeta completa del build; tienen que estar los archivos .loader.js, .framework.js, .data y .wasm.