Lingara Lingara Documentación Guías API Bibliotecas Apps Crear Integración Aplicación web
Idioma: Español

Unreal

Esta página está traducida del inglés. Si ambas difieren, la página en inglés es la correcta. Leer la página en inglés

El plugin de Lingara para Unreal Engine 5 es un subsistema de instancia de juego sobre la interfaz C del núcleo de jugador. Funciona en las cinco plataformas que admiten los kits de jugador: Windows, macOS, Linux, Android e iOS. Las consolas aún no son compatibles.

Instalar el plugin

Cada versión incluye un zip del plugin para cada versión del motor compatible, con el nombre LingaraEmbed-<semver>-UE5.<m>.zip. Descomprime el de tu motor en la carpeta Plugins/ de tu proyecto y luego activa el plugin en el editor. No hay nada más que instalar.

Obtener tokens de tu servidor

El plugin nunca guarda un secreto. Cuando necesita un token, emite OnTokenNeeded. Respóndelo haciendo una petición a la ruta de tokens de tu propio servidor, que emite con un kit de servidor y responde con el token y su caducidad, y luego pasa ambos a ProvideToken. Si tu servidor no puede responder, llama a TokenUnavailable para que las llamadas que esperan un token fallen de inmediato en lugar de agotar el tiempo de espera.

Vincular los eventos que usas

El núcleo ejecuta su E/S de red en su propio hilo. El subsistema lo vacía desde su propio tick, como máximo MaxEventsPerTick eventos por fotograma (una opción del proyecto), y emite cada uno en un delegado. Vincula los delegados que necesite tu juego cuando empiece la partida y luego inicia el subsistema:

  • OnTokenNeeded, cuando se necesita un token;
  • OnNpcTurn, para cada fragmento de una respuesta en streaming (consulta Diálogo con PNJ);
  • OnPractice, para cada actualización de práctica (consulta resultados de práctica);
  • OnError, cuando falla una llamada.

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