Unity
ទំព័រនេះត្រូវបានបកប្រែពីភាសាអង់គ្លេស។ ប្រសិនបើទាំងពីរខុសគ្នា ទំព័រភាសាអង់គ្លេសគឺត្រឹមត្រូវ។ អានទំព័រភាសាអង់គ្លេស
Lingara.Embed គឺជាកញ្ចប់ NuGet មួយដែលដំណើរការលើស្នូលអ្នកលេងរបស់ Lingara។ វាផ្ទុកបណ្ណាល័យ native សម្រាប់វេទិកានីមួយៗក្នុងចំណោមវេទិកាទាំងប្រាំដែលកញ្ចប់ឧបករណ៍អ្នកលេងគាំទ្រ៖ Windows, macOS, Linux, Android និង iOS។
ដំឡើងកញ្ចប់
Unity មិនអានកញ្ចប់ NuGet ដោយខ្លួនឯងទេ ដូច្នេះសូមដំឡើង NuGetForUnity ជាមុនសិន។ បន្ទាប់មកបន្ថែម Lingara.Embed ទៅក្នុង Assets/packages.config ដូចខាងក្រោម។ NuGetForUnity ស្ដារកញ្ចប់ឡើងវិញ ហើយដាក់បណ្ណាល័យ native របស់វេទិកានីមួយៗនៅកន្លែងដែល Unity រំពឹងទុក។
component គំរូខាងក្រោម LingaraEmbedBehaviour មិនមែនជាផ្នែកមួយនៃកញ្ចប់ទេ៖ ដាក់កូដប្រភពរបស់វាទៅក្នុងគម្រោងរបស់អ្នក ដាក់វានៅលើ GameObject មួយ ហើយស្ដាប់ព្រឹត្តិការណ៍ C# របស់វា។ វាបង្កើតក្លាយអិននៅពេលវាភ្ញាក់ ហើយបោះបង់វានៅពេលវាត្រូវបានបំផ្លាញ នៅពេលហ្គេមបិទ និងមុនពេលកម្មវិធីកែសម្រួលផ្ទុកស្គ្រីបរបស់អ្នកឡើងវិញ។
យកតូខិនពីម៉ាស៊ីនមេរបស់អ្នក
កញ្ចប់មិនដែលកាន់សម្ងាត់ទេ។ នៅពេលក្លាយអិនត្រូវការតូខិន វាប្រាប់ដោយព្រឹត្តិការណ៍ TokenNeeded មួយ។ component ឆ្លើយតបវាដោយ coroutine មួយដែលផ្ញើទៅផ្លូវតូខិន (token route) នៃម៉ាស៊ីនមេផ្ទាល់ខ្លួនរបស់អ្នក ដែលបង្កើតតូខិនដោយប្រើ កញ្ចប់ឧបករណ៍ម៉ាស៊ីនមេ ហើយឆ្លើយតបដោយតូខិន និងពេលផុតកំណត់របស់វា។ ប្រសិនបើម៉ាស៊ីនមេរបស់អ្នកមិនអាចឆ្លើយតបបាន សូមហៅ TokenUnavailable ដើម្បីឲ្យការហៅដែលកំពុងរង់ចាំតូខិនបរាជ័យភ្លាមៗ ជំនួសឲ្យការអស់ពេល។
បង្ហូរព្រឹត្តិការណ៍នៅក្នុង Update
ស្នូលដំណើរការ I/O បណ្ដាញរបស់វានៅលើ thread ផ្ទាល់ខ្លួនរបស់វា។ នៅក្នុង Update component បង្ហូរអ្វីដែលបានមកដល់ចាប់តាំងពីហ្វ្រេមចុងក្រោយ យ៉ាងច្រើនបំផុត 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;
}
}
}