Lingara Lingara 문서 학습 가이드 API 라이브러리 앱 만들기 임베드 웹 앱
언어: 한국어

Unity

이 페이지는 영어에서 번역되었습니다. 두 내용이 다를 경우 영어 페이지가 정확합니다. 영어 페이지 읽기

Lingara.Embed는 Lingara의 플레이어 코어 위에 만든 NuGet 패키지입니다. 플레이어 키트가 지원하는 다섯 가지 플랫폼, 즉 Windows, macOS, Linux, Android, iOS 각각의 네이티브 라이브러리를 담고 있습니다.

패키지 설치하기

Unity는 자체적으로 NuGet 패키지를 읽지 않으므로, 먼저 NuGetForUnity를 설치하세요. 그런 다음 아래와 같이 Lingara.Embed를 Assets/packages.config에 추가합니다. NuGetForUnity가 패키지를 복원하고, 각 플랫폼의 네이티브 라이브러리를 Unity가 기대하는 위치에 둡니다.

아래 샘플 컴포넌트인 LingaraEmbedBehaviour는 패키지에 포함되어 있지 않습니다. 그 소스를 프로젝트에 넣고 GameObject에 붙인 다음, 그 C# 이벤트를 수신하세요. 이 컴포넌트는 깨어날 때 클라이언트를 만들고, 파괴될 때, 게임이 종료될 때, 그리고 에디터가 스크립트를 다시 불러오기 전에 클라이언트를 해제합니다.

서버에서 토큰 받기

패키지는 시크릿을 보관하지 않습니다. 클라이언트는 토큰이 필요하면 TokenNeeded 이벤트로 알립니다. 컴포넌트는 여러분 자체의 서버의 토큰 라우트로 POST하는 코루틴으로 응답하고, 서버는 서버 키트로 발급해 토큰과 그 만료 시각으로 응답합니다. 서버가 응답할 수 없으면 TokenUnavailable을 호출하세요. 그러면 토큰을 기다리는 호출이 시간 초과를 기다리지 않고 즉시 실패합니다.

Update에서 이벤트 비우기

코어는 네트워크 I/O를 자체 스레드에서 실행합니다. Update에서 컴포넌트는 지난 프레임 이후 도착한 것을 프레임당 최대 256개의 이벤트까지 비우고, 각각을 분배합니다. 토큰 요청, 스트리밍되는 NPC 응답(NPC 대화 참조), 연습 업데이트(연습 결과 참조), 플레이어에 관한 이벤트, 또는 실패입니다.

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;
        }
    }
}