Unreal
ទំព័រនេះត្រូវបានបកប្រែពីភាសាអង់គ្លេស។ ប្រសិនបើទាំងពីរខុសគ្នា ទំព័រភាសាអង់គ្លេសគឺត្រឹមត្រូវ។ អានទំព័រភាសាអង់គ្លេស
កម្មវិធីជំនួយ Lingara សម្រាប់ Unreal Engine 5 គឺជា game-instance subsystem មួយដែលដំណើរការលើចំណុចប្រទាក់ C នៃស្នូលអ្នកលេង។ វាដំណើរការលើវេទិកាទាំងប្រាំដែលកញ្ចប់ឧបករណ៍អ្នកលេងគាំទ្រ៖ Windows, macOS, Linux, Android និង iOS។ ម៉ាស៊ីនហ្គេមកុងសូល (console) មិនទាន់ត្រូវបានគាំទ្រនៅឡើយទេ។
ដំឡើងកម្មវិធីជំនួយ
ការចេញផ្សាយនីមួយៗផ្ទុកឯកសារ zip នៃកម្មវិធីជំនួយសម្រាប់កំណែម៉ាស៊ីនដែលគាំទ្រនីមួយៗ ដែលមានឈ្មោះ LingaraEmbed-<semver>-UE5.<m>.zip។ ពន្លាឯកសារសម្រាប់ម៉ាស៊ីនរបស់អ្នក ទៅក្នុងថត Plugins/ នៃគម្រោងរបស់អ្នក បន្ទាប់មកបើកកម្មវិធីជំនួយនៅក្នុងកម្មវិធីកែសម្រួល។ គ្មានអ្វីផ្សេងទៀតដែលត្រូវដំឡើងទេ។
យកតូខិនពីម៉ាស៊ីនមេរបស់អ្នក
កម្មវិធីជំនួយមិនដែលកាន់សម្ងាត់ទេ។ នៅពេលវាត្រូវការតូខិន វាផ្សាយ OnTokenNeeded។ ឆ្លើយតបវាដោយផ្ញើទៅផ្លូវតូខិន (token route) នៃម៉ាស៊ីនមេផ្ទាល់ខ្លួនរបស់អ្នក ដែលបង្កើតតូខិនដោយប្រើ កញ្ចប់ឧបករណ៍ម៉ាស៊ីនមេ ហើយឆ្លើយតបដោយតូខិន និងពេលផុតកំណត់របស់វា បន្ទាប់មកប្រគល់ទាំងពីរទៅឲ្យ ProvideToken។ ប្រសិនបើម៉ាស៊ីនមេរបស់អ្នកមិនអាចឆ្លើយតបបាន សូមហៅ TokenUnavailable ដើម្បីឲ្យការហៅដែលកំពុងរង់ចាំតូខិនបរាជ័យភ្លាមៗ ជំនួសឲ្យការអស់ពេល។
ភ្ជាប់ព្រឹត្តិការណ៍ដែលអ្នកប្រើ
ស្នូលដំណើរការ I/O បណ្ដាញរបស់វានៅលើ thread ផ្ទាល់ខ្លួនរបស់វា។ subsystem បង្ហូរវាពី tick ផ្ទាល់ខ្លួនរបស់វា យ៉ាងច្រើនបំផុត MaxEventsPerTick ព្រឹត្តិការណ៍ក្នុងមួយហ្វ្រេម (ការកំណត់គម្រោងមួយ) ហើយផ្សាយព្រឹត្តិការណ៍នីមួយៗលើ delegate មួយ។ ភ្ជាប់ delegate ដែលហ្គេមរបស់អ្នកត្រូវការ នៅពេលការលេងចាប់ផ្ដើម បន្ទាប់មកចាប់ផ្ដើម subsystem៖
OnTokenNeededនៅពេលត្រូវការតូខិន។OnNpcTurnសម្រាប់ដុំនីមួយៗនៃការឆ្លើយតបដែលបានស្ទ្រីម (សូមមើល ការសន្ទនាជាមួយ NPC)។OnPracticeសម្រាប់បច្ចុប្បន្នភាពនីមួយៗនៃការហាត់ (សូមមើល លទ្ធផលនៃការហាត់)។OnErrorនៅពេលការហៅមួយបរាជ័យ។
Unreal C++
// Your own server mints the token: never put a client secret in a game.
void ALingaraEmbedSnippetActor::HandleTokenNeeded(const FLingaraTokenNeeded& Event)
{
const TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
Request->SetVerb(TEXT("POST"));
Request->SetURL(TokenUrl);
Request->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
Request->SetContentAsString(TEXT("{}"));
Request->OnProcessRequestComplete().BindUObject(this, &ALingaraEmbedSnippetActor::HandleTokenResponse);
Request->ProcessRequest();
}
void ALingaraEmbedSnippetActor::HandleTokenResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bConnected)
{
ELingaraCallResult Result;
FLingaraEmbedError Error;
TSharedPtr<FJsonObject> Body;
FString Token;
FString ExpiresAt;
const bool bOk = bConnected && Response.IsValid() && EHttpResponseCodes::IsOk(Response->GetResponseCode())
&& FJsonSerializer::Deserialize(TJsonReaderFactory<TCHAR>::Create(Response->GetContentAsString()), Body)
&& Body->TryGetStringField(TEXT("token"), Token) && Body->TryGetStringField(TEXT("expires_at"), ExpiresAt);
if (bOk)
{
Lingara()->ProvideToken(Token, ExpiresAt, Result, Error);
}
else
{
// Fail the waiting calls now rather than at the core's timeout.
Lingara()->TokenUnavailable(TEXT("the token endpoint failed"), Result, Error);
}
}Unreal C++
// The subsystem drains the core's queue from its own tick (at most
// MaxEventsPerTick a frame, from Project Settings): bind the events you use.
void ALingaraEmbedSnippetActor::BeginPlay()
{
Super::BeginPlay();
ULingaraEmbedSubsystem* Subsystem = Lingara();
Subsystem->OnTokenNeeded.AddDynamic(this, &ALingaraEmbedSnippetActor::HandleTokenNeeded);
Subsystem->OnNpcTurn.AddDynamic(this, &ALingaraEmbedSnippetActor::HandleNpcTurn);
Subsystem->OnPractice.AddDynamic(this, &ALingaraEmbedSnippetActor::HandlePractice);
Subsystem->OnError.AddDynamic(this, &ALingaraEmbedSnippetActor::HandleError);
FLingaraEmbedConfig Config;
Config.MaxEventsPerTick = 256;
ELingaraCallResult Result;
FLingaraEmbedError Error;
Subsystem->Start(Config, Result, Error);
}
void ALingaraEmbedSnippetActor::HandleError(const FLingaraEmbedError& Error)
{
UE_LOG(LogTemp, Warning, TEXT("Lingara %s: %s"), *Error.KindName, *Error.Message);
}