Lingara Lingara Belgeler Rehberler API Kütüphaneler Uygulamalar Oluştur Gömme Web uygulaması
Dil: Türkçe

Unreal

Bu sayfa İngilizceden çevrilmiştir. İkisi arasında fark varsa İngilizce sayfa doğrudur. İngilizce sayfayı oku

Unreal Engine 5 için Lingara eklentisi, oyuncu çekirdeğinin C arayüzü üzerine kurulu bir game-instance alt sistemidir. Oyuncu kitlerinin desteklediği beş platformda çalışır: Windows, macOS, Linux, Android ve iOS. Konsollar henüz desteklenmemektedir.

Eklentiyi kurun

Her sürüm, desteklenen her motor sürümü için eklentinin LingaraEmbed-<semver>-UE5.<m>.zip adlı bir zip dosyasını içerir. Motorunuza uygun olanı projenizin Plugins/ klasörüne açın, ardından eklentiyi düzenleyicide etkinleştirin. Kurulacak başka bir şey yoktur.

Belirteçleri sunucunuzdan alın

Eklenti hiçbir zaman gizli anahtar tutmaz. Bir belirtece ihtiyaç duyduğunda OnTokenNeeded yayınlar. Buna kendi sunucunuzun belirteç rotasına istek göndererek yanıt verin; sunucunuz bir sunucu kiti ile belirteç üretir ve belirteci ve son kullanma zamanını döndürür. Ardından ikisini de ProvideToken çağrısına verin. Sunucunuz yanıt veremiyorsa TokenUnavailable çağrısını yapın; böylece belirteç bekleyen çağrılar zaman aşımına uğramak yerine hemen başarısız olur.

Kullandığınız olaylara bağlanın

Çekirdek ağ I/O’sunu kendi iş parçacığında yürütür. Alt sistem onu kendi tick’inde, karede en fazla MaxEventsPerTick olay (bir proje ayarı) olarak boşaltır ve her birini bir delegate üzerinde yayınlar. Oyununuzun ihtiyaç duyduğu delegate’lere oyun başladığında bağlanın, ardından alt sistemi başlatın:

  • OnTokenNeeded, bir belirteç gerektiğinde;
  • OnNpcTurn, akışla gelen bir yanıtın her parçası için (bkz. NPC diyaloğu);
  • OnPractice, her alıştırma güncellemesi için (bkz. alıştırma sonuçları);
  • OnError, bir çağrı başarısız olduğunda.

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