Lingara Lingara بەڵگەنامەکان ڕێنماییەکان API کتێبخانەکان ئەپەکان دروستکردن جێگیرکردن ئەپی وێب
زمان: سۆرانی

Unreal

ئەم پەڕەیە لە ئینگلیزییەوە وەرگێڕدراوە. ئەگەر هەردووکیان جیاواز بوون، پەڕە ئینگلیزییەکە ڕاستە. پەڕە ئینگلیزییەکە بخوێنەوە

پلەگینی Lingara بۆ Unreal Engine 5 ژێرسیستەمێکی game-instance ـە لەسەر ڕووکاری C ـی ناوکی یاریزان. لەسەر ئەو پێنج پلاتفۆرمە کار دەکات کە کیتەکانی یاریزان پشتگیرییان دەکەن: Windows، macOS، Linux، Android و iOS. کۆنسۆڵەکان هێشتا پشتگیری ناکرێن.

پلەگینەکە دابمەزرێنە

هەر بڵاوکراوەیەک بۆ هەر وەشانێکی پشتگیریکراوی بزوێنەرەکە zip ێکی پلەگینەکە هەڵدەگرێت، بە ناوی LingaraEmbed-<semver>-UE5.<m>.zip. ئەوەی بۆ بزوێنەرەکەتە لەناو فۆڵدەری Plugins/ ـی پرۆژەکەتدا بکەرەوە، پاشان پلەگینەکە لە دەستکاریکەرەکەدا چالاک بکە. هیچ شتێکی تر نییە بۆ دامەزراندن.

تۆکن لە سێرڤەرەکەی خۆت وەربگرە

پلەگینەکە هەرگیز نهێنییەک هەڵناگرێت. کاتێک پێویستی بە تۆکنێک بێت، OnTokenNeeded بڵاو دەکاتەوە. وەڵامی بدەرەوە بە ناردنی داواکارییەک بۆ ڕێڕەوی تۆکنی سێرڤەرەکەی خۆت، کە بە کیتی سێرڤەر تۆکنەکە دروست دەکات و بە تۆکنەکە و کاتی بەسەرچوونی وەڵام دەداتەوە، پاشان هەردووکیان بدە بە ProvideToken. ئەگەر سێرڤەرەکەت نەتوانێت وەڵام بداتەوە، بانگی TokenUnavailable بکە بۆ ئەوەی ئەو بانگکردنانەی چاوەڕێی تۆکنن دەستبەجێ شکست بهێنن لە جیاتی ئەوەی کاتیان بەسەر بچێت.

ئەو ڕووداوانە ببەستەوە کە بەکاریان دەهێنیت

ناوکەکە I/O ـی تۆڕەکەی لەسەر thread ـی خۆی کار پێدەکات. ژێرسیستەمەکە لە tick ـی خۆیەوە بەتاڵی دەکات، لە هەر چوارچێوەیەکدا بەلایەنی زۆرەوە MaxEventsPerTick ڕووداو (ڕێکخستنێکی پرۆژە)، و هەر یەکێکیان لەسەر delegate ێک بڵاو دەکاتەوە. ئەو delegate انەی یارییەکەت پێویستی پێیانە لە کاتی دەستپێکردنی یاریدا ببەستەوە، پاشان ژێرسیستەمەکە دەست پێبکە:

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