<aside> 💡

Aan het eind sla je vanuit Unity de tijd op die een speler nodig had om een training of oefening af te ronden. Geen extra velden, geen ophalen nog — dat bouwen we in een volgende les bovenop dit fundament. Deze opzet is niet aan één game gebonden: elke trainingsgame waarin je een sessie- of afrondingstijd wilt vastleggen kan er zo mee uit de voeten.

</aside>

Wat ga je bouwen?

Een speler rondt een training of oefening af. Zodra dat gebeurt, sturen we de tijd die dat kostte (één getal, in seconden) naar een tabel trainingstijden in een Supabase-database. Na deze les kun je dat getal ook terugzien verschijnen in het Supabase-dashboard, live, terwijl je in Unity op Play drukt.

Hoe dit in elkaar zit

architectuur.png

Unity stuurt zelf geen SQL. Het stuurt een gewoon HTTP-verzoek (POST) naar de REST-API die Supabase automatisch voor je tabel aanmaakt, met je API-key in de apikey-header. Die API voert vervolgens de daadwerkelijke SQL uit op de Postgres-tabel erachter. Dat is ook precies waarom dit veilig genoeg is om vanuit een game-client te doen: er staat geen databasewachtwoord in je build, alleen een key die (later, in een vervolgles) je kunt begrenzen met rechten.

Stap 1 — Supabase-project aanmaken

Ga naar supabase.com en maak een gratis account. Klik op New project, geef 'm een naam (bijvoorbeeld training-demo) en kies een databasewachtwoord


Stap 2 — De tabel aanmaken

Open in het dashboard de SQL Editor en plak dit erin:

create table public.trainingstijden (
  id            bigint generated always as identity primary key,
  duur_seconden integer not null,
  aangemaakt_op timestamptz not null default now()
);

grant select, insert on public.trainingstijden to anon;

Klik Run. Je hebt nu een tabel met precies één inhoudelijke kolom: duur_seconden.

Stap 3 — URL en API-key opzoeken

Ga naar Settings → API Keys. Noteer twee dingen:

Gebruik altijd de publishable key in Unity — nooit de secret key. De secret key omzeilt alle beveiliging en hoort alleen in een backend die jij zelf beheert, nooit in een build die spelers kunnen decompileren.

Stap 4 — Het Unity-script

Maak een leeg GameObject in een lege scene, en zet dit script erop:

using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

public class TrainingstijdOpslaan : MonoBehaviour
{
    // TODO: vul in met jouw eigen project-gegevens (stap 3)
    private const string SupabaseUrl = "<https://JOUW-PROJECT-REF.supabase.co>";
    private const string PublishableKey = "sb_publishable_...";
    private const string Table = "trainingstijden";

    private void Update()
    {
        // Spatiebalk simuleert het afronden van een training met een willekeurige tijd.
        if (Input.GetKeyDown(KeyCode.Space))
        {
            int duurSeconden = Random.Range(10, 300);
            StartCoroutine(SlaGetalOp(duurSeconden));
        }
    }

    private IEnumerator SlaGetalOp(int duurSeconden)
    {
        string json = "{\"duur_seconden\":" + duurSeconden + "}";
        byte[] body = Encoding.UTF8.GetBytes(json);

        using var request = new UnityWebRequest($"{SupabaseUrl}/rest/v1/{Table}", "POST");
        request.uploadHandler = new UploadHandlerRaw(body);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("apikey", PublishableKey);
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
            Debug.Log($"Opgeslagen: {duurSeconden} seconden");
        else
            Debug.LogError($"Opslaan mislukt: {request.error}");
    }
}