Lingara Lingara Ohjeet Oppaat API Kirjastot Sovellukset Rakenna Upotus Verkkosovellus
Kieli: Suomi

Unreal

Tämä sivu on käännetty englannista. Jos ne eroavat toisistaan, englanninkielinen sivu on oikea. Lue englanninkielinen sivu

Lingara-liitännäinen Unreal Engine 5:lle on game instance -alijärjestelmä pelaajaytimen C-rajapinnan päällä. Se toimii viidellä alustalla, joita pelaajapaketit tukevat: Windows, macOS, Linux, Android ja iOS. Konsoleita ei vielä tueta.

Asenna liitännäinen

Jokainen julkaisu sisältää liitännäisestä zip-tiedoston jokaiselle tuetulle moottoriversiolle, nimeltään LingaraEmbed-<semver>-UE5.<m>.zip. Pura moottoriasi vastaava tiedosto projektisi kansioon Plugins/ ja ota liitännäinen käyttöön editorissa. Muuta asennettavaa ei ole.

Hae tunnukset palvelimeltasi

Liitännäinen ei koskaan säilytä salaisuutta. Kun se tarvitsee tunnuksen, se lähettää tapahtuman OnTokenNeeded. Vastaa siihen lähettämällä pyyntö oman palvelimesi tunnusreitille, joka luo tunnuksen palvelinpaketilla ja vastaa tunnuksella ja sen vanhenemisajalla, ja anna sitten molemmat kutsulle ProvideToken. Jos palvelimesi ei pysty vastaamaan, kutsu TokenUnavailable, jotta tunnusta odottavat kutsut epäonnistuvat heti sen sijaan, että ne aikakatkaistaisiin.

Sido käyttämäsi tapahtumat

Ydin suorittaa verkko-I/O:nsa omassa säikeessään. Alijärjestelmä tyhjentää sen omassa tickissään, enintään MaxEventsPerTick tapahtumaa ruudunpäivitystä kohden (projektin asetus), ja lähettää kunkin delegaatille. Sido pelisi tarvitsemat delegaatit pelin alkaessa ja käynnistä sitten alijärjestelmä:

  • OnTokenNeeded, kun tunnusta tarvitaan;
  • OnNpcTurn, jokaiselle virtautetun vastauksen palalle (katso NPC-dialogit);
  • OnPractice, jokaiselle harjoittelun päivitykselle (katso harjoittelun tulokset);
  • OnError, kun kutsu epäonnistuu.

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