Unity
Bu sayfa İngilizceden çevrilmiştir. İkisi arasında fark varsa İngilizce sayfa doğrudur. İngilizce sayfayı oku
Lingara.Embed, Lingara’nın oyuncu çekirdeği üzerine kurulu bir NuGet paketidir. Oyuncu kitlerinin desteklediği beş platformun her biri için yerel kütüphaneyi taşır: Windows, macOS, Linux, Android ve iOS.
Paketi kurun
Unity, NuGet paketlerini kendi başına okumaz; bu yüzden önce NuGetForUnity’yi kurun. Ardından aşağıdaki gibi Lingara.Embed paketini Assets/packages.config dosyasına ekleyin. NuGetForUnity paketi geri yükler ve her platformun yerel kütüphanesini Unity’nin beklediği yere yerleştirir.
Aşağıdaki örnek bileşen LingaraEmbedBehaviour paketin bir parçası değildir: kaynağını projenize bırakın, bir GameObject’e ekleyin ve C# olaylarını dinleyin. Bileşen uyandığında istemciyi oluşturur; yok edildiğinde, oyun kapandığında ve düzenleyici betiklerinizi yeniden yüklemeden önce istemciyi serbest bırakır.
Belirteçleri sunucunuzdan alın
Paket hiçbir zaman gizli anahtar tutmaz. İstemcinin bir belirtece ihtiyacı olduğunda bunu bir TokenNeeded olayıyla bildirir. Bileşen bu olayı, kendi sunucunuzun belirteç rotasına istek gönderen bir eşyordamla yanıtlar; sunucunuz bir sunucu kiti ile belirteç üretir ve belirteci ve son kullanma zamanını yanıt olarak döndürür. Sunucunuz yanıt veremiyorsa TokenUnavailable çağrısını yapın; böylece belirteç bekleyen çağrılar zaman aşımına uğramak yerine hemen başarısız olur.
Olayları Update içinde boşaltın
Çekirdek ağ I/O’sunu kendi iş parçacığında yürütür. Bileşen Update içinde, son kareden bu yana gelenleri karede en fazla 256 olay olarak boşaltır ve her birini dağıtır: bir belirteç isteği, akışla gelen bir NPC yanıtı (bkz. NPC diyaloğu), bir alıştırma güncellemesi (bkz. alıştırma sonuçları), oyuncuyla ilgili bir olay ya da bir hata.
Unity
<?xml version="1.0" encoding="utf-8"?>
<!-- Assets/packages.config, after installing NuGetForUnity: it restores Lingara.Embed and places each platform's native library. -->
<packages>
<package id="Lingara.Embed" version="0.1.0-alpha.6" manuallyInstalled="true" />
</packages>Unity
[Serializable]
private struct Handoff { public string token; public string expires_at; }
// Your own server mints the token: never put a client secret in a game.
private IEnumerator FetchToken()
{
using (var request = UnityWebRequest.PostWwwForm(tokenUrl, string.Empty))
{
yield return request.SendWebRequest();
if (Client == null) yield break;
if (request.result != UnityWebRequest.Result.Success)
{
Client.TokenUnavailable(request.error); // fail the waiting calls now
yield break;
}
var handoff = JsonUtility.FromJson<Handoff>(request.downloadHandler.text);
Client.ProvideToken(handoff.token, handoff.expires_at);
}
}Unity
private void Update()
{
if (Client == null) return;
events.Clear();
Client.Drain(events); // at most 256 a frame; the rest wait for the next
foreach (var e in events)
{
switch (e)
{
case EmbedEvent.TokenNeeded _: StartCoroutine(FetchToken()); break;
case EmbedEvent.NpcTurn turn: NpcTurn?.Invoke(turn); break;
case EmbedEvent.Practice practice: Practice?.Invoke(practice); break;
case EmbedEvent.LingaraReceived received: LingaraReceived?.Invoke(received); break;
case EmbedEvent.Failed failed: Failed?.Invoke(failed); break;
case EmbedEvent.Log log: Debug.Log($"[lingara] {log.Level} {log.Target}: {log.Message}"); break;
}
}
}