Lingara Lingara Documentazione Guide API Librerie App Crea Incorporare App web
Lingua: Italiano

Unreal

Questa pagina è tradotta dall'inglese. Se le due versioni differiscono, fa fede la pagina in inglese. Leggi la pagina in inglese

Il plugin Lingara per Unreal Engine 5 è un sottosistema di game instance sopra l’interfaccia C del player core. Funziona sulle cinque piattaforme supportate dai player kit: Windows, macOS, Linux, Android e iOS. Le console non sono ancora supportate.

Installare il plugin

Ogni release contiene uno zip del plugin per ciascuna versione del motore supportata, chiamato LingaraEmbed-<semver>-UE5.<m>.zip. Estrai quello per il tuo motore nella cartella Plugins/ del tuo progetto, poi abilita il plugin nell’editor. Non c’è nient’altro da installare.

Ottenere i token dal tuo server

Il plugin non conserva mai un segreto. Quando ha bisogno di un token, trasmette OnTokenNeeded. Rispondi inviando una richiesta alla route dei token del tuo server, che emette il token con un kit server e risponde con il token e la sua scadenza, poi passa entrambi a ProvideToken. Se il tuo server non può rispondere, chiama TokenUnavailable, così le chiamate in attesa di un token falliscono subito invece di andare in timeout.

Collegare gli eventi che usi

Il core esegue il suo I/O di rete su un proprio thread. Il sottosistema lo svuota dal proprio tick, al massimo MaxEventsPerTick eventi per frame (un’impostazione del progetto), e trasmette ciascuno su un delegate. Collega i delegate di cui il tuo gioco ha bisogno quando inizia la partita, poi avvia il sottosistema:

  • OnTokenNeeded, quando serve un token;
  • OnNpcTurn, per ogni pezzo di una risposta in streaming (vedi Dialoghi con gli NPC);
  • OnPractice, per ogni aggiornamento della pratica (vedi risultati della pratica);
  • OnError, quando una chiamata non riesce.

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