unity

Jaina in Unity: a complete guide

Drop the Jaina C# SDK into Unity, fetch schemas at runtime, populate game objects from records.

Jaina Team

The setup

Unity's netstandard2.0 profile is what Jaina.Client targets. Install in your project:

Note: Jaina.Client is publishing soon and is not yet on NuGet. Until it ships, use the REST API directly. The steps below are correct for when the package is live.

dotnet add package Jaina.Client

If you prefer dropping a DLL: download from NuGet, drop into Assets/Plugins/, set the .meta to Any Platform.

A minimal MonoBehaviour

using System.Threading.Tasks;
using UnityEngine;
using Jaina.Client;

public class JainaManager : MonoBehaviour
{
    [SerializeField] private string projectSlug = "my-game";
    private JainaClient client;

    async void Start()
    {
        client = new JainaClient(apiKey: System.Environment.GetEnvironmentVariable("JAINA_API_KEY"));

        var enemies = await client.Records.ListAsync<Enemy>(projectSlug, "enemy");
        foreach (var e in enemies.Items)
        {
            SpawnEnemy(e);
        }
    }

    private void SpawnEnemy(Enemy data)
    {
        var go = new GameObject(data.Name);
        var enemy = go.AddComponent<EnemyBehaviour>();
        enemy.Configure(data);
    }
}

Where Enemy is the typed model generated from your schema:

jaina codegen my-game --lang csharp --output ./Assets/Scripts/Models/

Loading sprites

The sprite field on the schema is a file with accept: "image/*". On the C# side it shows up as a string URL. Use Unity's UnityWebRequest to fetch:

using UnityEngine.Networking;

private async Task<Texture2D> LoadSpriteAsync(string url)
{
    using var req = UnityWebRequestTexture.GetTexture(url);
    var op = req.SendWebRequest();
    while (!op.isDone) await Task.Yield();
    if (req.result != UnityWebRequest.Result.Success)
    {
        Debug.LogError($"Sprite load failed: {req.error}");
        return null;
    }
    return DownloadHandlerTexture.GetContent(req);
}

Offline / build-time content

For Unity games that ship without network, use the CLI to export at build time:

jaina export my-game --format json --output ./Assets/StreamingAssets/

You'll get model.json files and assets/ per package. In Unity, read with StreamingAssetsLoader and parse with JsonUtility or the SDK's Package.FromJson(...).

What about updates?

Two patterns work:

  1. Periodic refresh — call client.Packages.GetAsync(slug) on game start; cache in PlayerPrefs or local file. Players get content updates on next launch.
  2. Webhook + push notification — your backend subscribes to Jaina webhooks (record.created, record.updated) and pushes a "new content available" notification to the game client.

For most games, option 1 is enough.

Caveats

  • JainaClient is IDisposable. Wrap it appropriately or use a singleton.
  • CancellationToken is supported on every async method. Use it when scenes transition.
  • The C# SDK retries transient errors automatically. You don't need to wrap calls in try/catch unless you want to handle specific failure modes.

That's it. Five-minute integration, full type safety, no glue code.