Lingara Lingara Dokumentasie Gidse API Biblioteke Apps Bou Inbed Webtoepassing
Taal: Afrikaans

Unreal

Hierdie bladsy is uit Engels vertaal. As die twee verskil, is die Engelse bladsy korrek. Lees die Engelse bladsy

Die Lingara-inprop vir Unreal Engine 5 is ‘n game-instance-subsisteem bo-op die spelerkern se C-koppelvlak. Dit loop op die vyf platforms wat die spelerkits ondersteun: Windows, macOS, Linux, Android en iOS. Konsoles word nog nie ondersteun nie.

Installeer die inprop

Elke vrystelling dra ‘n zip van die inprop vir elke ondersteunde enjinweergawe, genaamd LingaraEmbed-<semver>-UE5.<m>.zip. Pak die een vir jou enjin uit in jou projek se Plugins/-gids, en aktiveer dan die inprop in die redigeerder. Daar is niks anders om te installeer nie.

Kry tokens van jou bediener

Die inprop hou nooit ‘n geheim nie. Wanneer dit ‘n token nodig het, saai dit OnTokenNeeded uit. Antwoord dit deur ‘n POST na jou eie bediener se tokenroete te stuur, wat met ‘n bedienerkit uitreik en met die token en sy vervaltyd antwoord, en gee dan albei aan ProvideToken. As jou bediener nie kan antwoord nie, roep TokenUnavailable aan sodat die oproepe wat op ‘n token wag dadelik misluk in plaas daarvan om uit te tel.

Bind die gebeurtenisse wat jy gebruik

Die kern voer sy netwerk-I/O op sy eie draad uit. Die subsisteem maak dit leeg vanuit sy eie tick, hoogstens MaxEventsPerTick gebeurtenisse per raam (‘n projekinstelling), en saai elkeen op ‘n delegate uit. Bind die delegates wat jou speletjie nodig het wanneer spel begin, en begin dan die subsisteem:

  • OnTokenNeeded, wanneer ‘n token nodig is;
  • OnNpcTurn, vir elke stuk van ‘n gestroomde antwoord (sien NPC-dialoog);
  • OnPractice, vir elke oefenopdatering (sien oefenresultate);
  • OnError, wanneer ‘n oproep misluk.

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