Lingara Lingara Dokumentasyon Mga gabay API Mga library Mga app Gumawa Embed Web app
Wika: Filipino

Unreal

Isinalin mula sa Ingles ang pahinang ito. Kung magkaiba ang dalawa, ang pahinang Ingles ang tama. Basahin ang pahinang Ingles

Ang Lingara plugin para sa Unreal Engine 5 ay isang game-instance subsystem na nakapatong sa C interface ng player core. Tumatakbo ito sa limang platform na sinusuportahan ng mga player kit: Windows, macOS, Linux, Android at iOS. Hindi pa sinusuportahan ang mga console.

I-install ang plugin

Dala ng bawat release ang isang zip ng plugin para sa bawat sinusuportahang bersyon ng engine, na pinangalanang LingaraEmbed-<semver>-UE5.<m>.zip. I-unzip ang para sa iyong engine sa folder na Plugins/ ng iyong project, saka i-enable ang plugin sa editor. Wala nang ibang kailangang i-install.

Kumuha ng mga token mula sa iyong server

Hindi kailanman humahawak ng secret ang plugin. Kapag kailangan nito ng token, ibina-broadcast nito ang OnTokenNeeded. Sagutin ito sa pamamagitan ng pag-post sa token route ng sarili mong server, na nagmi-mint gamit ang isang server kit at sumasagot gamit ang token at ang expiry nito, saka iabot ang dalawa sa ProvideToken. Kung hindi makasagot ang iyong server, tawagin ang TokenUnavailable para agad na mabigo ang mga tawag na naghihintay ng token sa halip na mag-time out.

I-bind ang mga event na ginagamit mo

Pinapatakbo ng core ang network I/O nito sa sarili nitong thread. Inuubos ito ng subsystem mula sa sarili nitong tick, hanggang MaxEventsPerTick na event bawat frame (isang project setting), at ibina-broadcast ang bawat isa sa isang delegate. I-bind ang mga delegate na kailangan ng iyong laro kapag nagsimula ang paglalaro, saka simulan ang subsystem:

  • OnTokenNeeded, kapag kailangan ng token;
  • OnNpcTurn, para sa bawat piraso ng naka-stream na sagot (tingnan ang usapan ng NPC);
  • OnPractice, para sa bawat update ng pagsasanay (tingnan ang mga resulta ng pagsasanay);
  • OnError, kapag nabigo ang isang tawag.

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