Lingara Lingara 說明文件 學習指南 API 函式庫 App 建立 嵌入 網頁版
語言: 客家話

Unreal

這頁係對英文翻譯過來个。若係兩片無共樣,以英文頁為準。 看英文頁

Unreal Engine 5 个 Lingara 外掛程式係一隻 game-instance 子系統,建立在玩家核心个 C 介面頂高。佢在玩家套件支援个五隻平台頂高行:Windows、macOS、Linux、Android 摎 iOS。主機還吂支援。

安裝外掛程式

每隻發行版都會為每隻支援个引擎版本附一隻外掛程式个 zip,名喊 LingaraEmbed-<semver>-UE5.<m>.zip。將你个引擎對應个該隻解壓縮到你專案个 Plugins/ 資料夾,過後在編輯器肚啟用外掛程式。無其他東西愛安裝。

從你个伺服器拿權杖

外掛程式從來毋會保管密鑰。佢需要權杖个時節,會廣播 OnTokenNeeded。送請求到你自家伺服器个權杖路由來回應佢;你个伺服器用一隻伺服器套件簽發,再用權杖摎佢个到期時間來回應,過後將兩樣交分 ProvideToken。若係你个伺服器無辦法回應,就呼叫 TokenUnavailable,恁樣在該等權杖个呼叫就會馬上失敗,毋使等到逾時。

綁定你用个事件

核心在佢自家个執行緒頂高行網路 I/O。子系統在佢自家个 tick 肚將佢清出來,一格最多 MaxEventsPerTick 隻事件(一隻專案設定),再將每隻在一隻 delegate 頂高廣播。在遊戲開始个時節綁定你个遊戲需要个 delegate,過後正啟動子系統:

  • OnTokenNeeded,需要權杖个時節;
  • OnNpcTurn,串流回覆个每節(請看 NPC 對話);
  • OnPractice,每隻練習个更新(請看練習結果);
  • OnError,呼叫失敗个時節。

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