Lingara Lingara ឯកសារ មគ្គុទ្ទេសក៍សិក្សា API បណ្ណាល័យ កម្មវិធី បង្កើត បង្កប់ កម្មវិធីលើបណ្ដាញ
ភាសា: ខ្មែរ

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