Lingara Lingara Dokumentasi Panduan API Pustaka Aplikasi Buat Sematkan Aplikasi web
Bahasa: Bahasa Indonesia

Unreal

Halaman ini diterjemahkan dari bahasa Inggris. Jika keduanya berbeda, halaman bahasa Inggris yang benar. Baca halaman bahasa Inggris

Plugin Lingara untuk Unreal Engine 5 adalah subsistem game-instance di atas antarmuka C inti pemain. Plugin ini berjalan di lima platform yang didukung kit pemain: Windows, macOS, Linux, Android, dan iOS. Konsol belum didukung.

Instal plugin

Setiap rilis membawa zip plugin untuk setiap versi engine yang didukung, bernama LingaraEmbed-<semver>-UE5.<m>.zip. Ekstrak zip untuk engine Anda ke folder Plugins/ proyek Anda, lalu aktifkan plugin di editor. Tidak ada lagi yang perlu diinstal.

Dapatkan token dari server Anda

Plugin tidak pernah menyimpan secret. Saat membutuhkan token, plugin menyiarkan OnTokenNeeded. Jawab dengan mengirim ke rute token server Anda sendiri, yang mencetak dengan kit server dan menjawab dengan token beserta waktu kedaluwarsanya, lalu serahkan keduanya ke ProvideToken. Jika server Anda tidak dapat menjawab, panggil TokenUnavailable agar panggilan yang menunggu token langsung gagal alih-alih kehabisan waktu.

Ikat event yang Anda gunakan

Inti menjalankan I/O jaringannya di thread-nya sendiri. Subsistem mengosongkannya dari tick-nya sendiri, paling banyak MaxEventsPerTick event per frame (sebuah pengaturan proyek), dan menyiarkan masing-masing pada sebuah delegate. Ikat delegate yang dibutuhkan game Anda saat permainan dimulai, lalu jalankan subsistem:

  • OnTokenNeeded, saat token dibutuhkan;
  • OnNpcTurn, untuk setiap potongan balasan yang dialirkan (lihat dialog NPC);
  • OnPractice, untuk setiap pembaruan latihan (lihat hasil latihan);
  • OnError, saat sebuah panggilan gagal.

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