Lingara Lingara Dokumentasi Panduan API Pustaka Aplikasi Bina Benam Apl web
Bahasa: Bahasa Melayu

Unreal

Halaman ini diterjemahkan daripada bahasa Inggeris. Jika kedua-duanya berbeza, halaman bahasa Inggeris adalah yang betul. Baca halaman bahasa Inggeris

Pemalam Lingara untuk Unreal Engine 5 ialah subsistem game-instance di atas antara muka C teras pemain. Ia berjalan pada lima platform yang disokong oleh kit pemain: Windows, macOS, Linux, Android dan iOS. Konsol belum disokong.

Pasang pemalam

Setiap keluaran membawa zip pemalam untuk setiap versi enjin yang disokong, dinamakan LingaraEmbed-<semver>-UE5.<m>.zip. Nyahzip yang sepadan dengan enjin anda ke dalam folder Plugins/ projek anda, kemudian dayakan pemalam dalam editor. Tiada apa-apa lagi yang perlu dipasang.

Dapatkan token daripada pelayan anda

Pemalam tidak pernah menyimpan rahsia. Apabila ia memerlukan token, ia menyiarkan OnTokenNeeded. Jawabnya dengan menghantar ke laluan token pelayan anda sendiri, yang mencetak dengan kit pelayan dan menjawab dengan token serta tempoh tamatnya, kemudian serahkan kedua-duanya kepada ProvideToken. Jika pelayan anda tidak dapat menjawab, panggil TokenUnavailable supaya panggilan yang menunggu token gagal serta-merta dan bukannya tamat masa.

Ikat acara yang anda gunakan

Teras menjalankan I/O rangkaiannya pada benangnya sendiri. Subsistem mengosongkannya daripada tick sendiri, paling banyak MaxEventsPerTick acara satu bingkai (tetapan projek), dan menyiarkan setiap satu pada delegate. Ikat delegate yang diperlukan oleh permainan anda apabila permainan bermula, kemudian mulakan subsistem:

  • OnTokenNeeded, apabila token diperlukan;
  • OnNpcTurn, untuk setiap cebisan balasan yang distrim (lihat dialog NPC);
  • OnPractice, untuk setiap kemas kini latihan (lihat hasil latihan);
  • OnError, apabila 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);
}