Lingara Lingara Belge Rêbername API Pirtûkxane Sepan Avakirin Bicihkirin Sepana webê
Ziman: Kurdî

Unreal

Ev rûpel ji Îngilîzî hatiye wergerandin. Heke her du ji hev cuda bin, rûpela Îngilîzî rast e. Rûpela Îngilîzî bixwîne

Pêveka Lingara ji bo Unreal Engine 5 subsystem-eke game-instance ye ku li ser navrûya C ya navika lîstikvan hatiye avakirin. Ew li ser wan pênc platforman dixebite ku kîtên lîstikvan piştgirî didin: Windows, macOS, Linux, Android û iOS. Konsol hîn nayên piştgirîkirin.

Pêvekê saz bike

Her weşan ji bo her guhertoyeke motorê ya piştgirîkirî zip-eke pêvekê hildigire, bi navê LingaraEmbed-<semver>-UE5.<m>.zip. Ya ji bo motora xwe di peldanka Plugins/ ya projeya xwe de veke, paşê pêvekê di edîtorê de çalak bike. Tiştekî din tune ku were sazkirin.

Tokenan ji servera xwe bistîne

Pêvek qet nepeniyekê nagire. Dema ku tokenek hewce dike, OnTokenNeeded belav dike. Bersiva wê bi şandina daxwazekê ji rêya tokenê ya servera xwe re bide, ku bi kîta serverê tokenê çêdike û bi token û dema qedandina wê bersiv dide, paşê herduyan bide ProvideToken. Heke servera te nikaribe bersiv bide, bangî TokenUnavailable bike da ku bangên li benda tokenê di cih de têk biçin li şûna ku dema wan biqede.

Bûyerên ku tu bi kar tînî girêde

Navik I/O-ya xwe ya torê li ser thread-a xwe dixebitîne. Subsystem wê ji tick-a xwe vala dike, herî zêde MaxEventsPerTick bûyer di çarçoveyekê de (mîhengeke projeyê), û her yekê li ser delegate-ekê belav dike. Delegate-ên ku lîstika te hewce dike dema ku lîstin dest pê dike girêde, paşê subsystem-ê dest pê bike:

  • OnTokenNeeded, dema ku tokenek hewce ye;
  • OnNpcTurn, ji bo her perçeyekî bersiveke ku bi perçeyan tê (binêre Diyaloga NPC);
  • OnPractice, ji bo her nûkirineke temrînê (binêre encamên temrînê);
  • OnError, dema ku bangek têk diçe.

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