<aside> 💡
Zorg er voor dat voor je gaat beginnen met bouwen je API draait op http://localhost:5050
</aside>
| Wat er gebeurt | |
|---|---|
| 1 | De cursist rondt een oefening af |
| 2 | Unity stuurt het resultaat op met POST /resultaten |
| 3 | Unity haalt de lijst opnieuw op met GET /resultaten |
| 4 | De ranglijst verschijnt in beeld |
Stap 2 en 3 horen bij elkaar. Je stuurt pas iets op en vraagt het daarna terug, zodat je zeker weet dat wat je toont ook echt in de database staat.
In een gewone C#-app pak je HttpClient. In Unity niet. Unity heeft zijn eigen UnityWebRequest, die meeloopt met het frame-ritme van de engine en op alle platforms werkt. Je roept hem aan vanuit een coroutine.
JsonUtility is de JSON-lezer van Unity. Die heeft klassen nodig die precies op je JSON lijken. Ze staan onderaan ApiClient.cs, net zoals de records onderaan je Program.cs staan.
[Serializable]
public class Result
{
public string cursist;
public string oefening;
public float seconden;
public int fouten;
public int id;
}
[Serializable]
public class ResultList
{
public List<Result> resultaten;
}
<aside> 💡
cursist met kleine letter, dus hier ook.public string cursist; werkt, met { get; set; } erachter niet.[Serializable] is verplicht, anders blijft alles leeg zonder enige foutmelding.
</aside>Die ResultList eromheen is geen willekeur. JsonUtility kan geen JSON lezen die begint met [. Daarom zit je lijst in een object, en daarom staat er { "resultaten": [...] } in je API.
Alle verzoeken lopen via één api client class
public class ApiClient : MonoBehaviour
{
[SerializeField] private string baseUrl = "<http://localhost:5050>";
public IEnumerator GetResults(Action<ResultList> onSuccess, Action<string> onError)
{
using UnityWebRequest request = UnityWebRequest.Get(baseUrl + "/resultaten");
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
onError?.Invoke($"{request.responseCode}: {request.error}");
yield break;
}
ResultList list = JsonUtility.FromJson<ResultList>(request.downloadHandler.text);
onSuccess?.Invoke(list);
}
}
yield return request.SendWebRequest() is de regel die wacht. Je game loopt gewoon door, en zodra het antwoord binnen is gaat de methode verder op de volgende regel.
ActionparametersDat is de Observer van vorige week, in het klein. ApiClient weet niet wat er met het resultaat moet gebeuren. Hij roept gewoon terug: gelukt met deze lijst, of mislukt met deze melding. Wie dat opvangt mag zelf weten wat hij ermee doet.