Unity
Trang này được dịch từ tiếng Anh. Nếu hai bản khác nhau, trang tiếng Anh là bản đúng. Đọc trang tiếng Anh
Lingara.Embed là một gói NuGet xây dựng trên lõi người chơi của Lingara. Gói chứa thư viện gốc cho từng nền tảng trong năm nền tảng mà các bộ công cụ người chơi hỗ trợ: Windows, macOS, Linux, Android và iOS.
Cài đặt gói
Unity không tự đọc các gói NuGet, nên trước tiên hãy cài NuGetForUnity. Sau đó thêm Lingara.Embed vào Assets/packages.config, như bên dưới. NuGetForUnity khôi phục gói và đặt thư viện gốc của từng nền tảng vào nơi Unity mong đợi.
Thành phần mẫu bên dưới, LingaraEmbedBehaviour, không thuộc gói: hãy thả mã nguồn của nó vào dự án, gắn nó lên một GameObject, và lắng nghe các sự kiện C# của nó. Thành phần này tạo máy khách khi nó thức dậy và giải phóng máy khách khi nó bị hủy, khi trò chơi thoát, và trước khi trình chỉnh sửa tải lại các tập lệnh của bạn.
Lấy mã từ máy chủ của bạn
Gói không bao giờ giữ khóa bí mật. Khi máy khách cần một mã, nó báo điều đó bằng sự kiện TokenNeeded. Thành phần trả lời bằng một coroutine gửi POST tới tuyến cấp mã của máy chủ của chính bạn; máy chủ cấp mã bằng bộ công cụ máy chủ và trả lời bằng mã cùng thời điểm hết hạn của nó. Nếu máy chủ của bạn không thể trả lời, hãy gọi TokenUnavailable để các lệnh gọi đang chờ mã thất bại ngay lập tức thay vì hết thời gian chờ.
Rút sự kiện trong Update
Lõi chạy I/O mạng trên luồng riêng của nó. Trong Update, thành phần rút những gì đã đến kể từ khung hình trước, tối đa 256 sự kiện mỗi khung hình, và điều phối từng sự kiện: một yêu cầu mã, một câu trả lời NPC được truyền về (xem hội thoại NPC), một cập nhật luyện tập (xem kết quả luyện tập), một sự kiện về người chơi, hoặc một lỗi.
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;
}
}
}