Lingara Lingara Documentação Guias API Bibliotecas Aplicações Criar Incorporar Aplicação web
Idioma: Português

Unreal

Esta página é uma tradução do inglês. Se as duas diferirem, a página em inglês é a correta. Ler a página em inglês

O plugin do Lingara para o Unreal Engine 5 é um subsistema de instância de jogo sobre a interface C do núcleo de jogador. É executado nas cinco plataformas que os kits de jogador suportam: Windows, macOS, Linux, Android e iOS. As consolas ainda não são suportadas.

Instalar o plugin

Cada versão inclui um zip do plugin para cada versão do motor suportada, com o nome LingaraEmbed-<semver>-UE5.<m>.zip. Descompacte o do seu motor para a pasta Plugins/ do seu projeto e, em seguida, ative o plugin no editor. Não há mais nada para instalar.

Obter tokens do seu servidor

O plugin nunca guarda um segredo. Quando precisa de um token, difunde OnTokenNeeded. Responda fazendo um pedido à rota de tokens do seu próprio servidor, que emite com um kit de servidor e responde com o token e a sua validade, e depois entregue ambos a ProvideToken. Se o seu servidor não puder responder, chame TokenUnavailable para que as chamadas que aguardam um token falhem de imediato em vez de esgotarem o tempo limite.

Associar os eventos que usa

O núcleo executa a sua E/S de rede no seu próprio thread. O subsistema esvazia-a a partir do seu próprio tick, no máximo MaxEventsPerTick eventos por frame (uma definição do projeto), e difunde cada um num delegate. Associe os delegates de que o seu jogo precisa quando o jogo começa e, depois, inicie o subsistema:

  • OnTokenNeeded, quando é necessário um token;
  • OnNpcTurn, para cada bocado de uma resposta em streaming (consulte Diálogo com NPC);
  • OnPractice, para cada atualização da prática (consulte resultados da prática);
  • OnError, quando uma chamada falha.

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