Unreal
این صفحه از انگلیسی ترجمه شده است. اگر این دو با هم فرق داشته باشند، صفحهٔ انگلیسی درست است. صفحهٔ انگلیسی را بخوانید
افزونهٔ Lingara برای Unreal Engine 5 یک زیرسیستم در سطح نمونهٔ بازی است که بالای رابط C هستهٔ بازیکن ساخته شده است. این افزونه روی پنج پلتفورمی که کیتهای بازیکن پشتیبانی میکنند اجرا میشود: Windows، macOS، Linux، Android و iOS. کنسولها هنوز پشتیبانی نمیشوند.
نصب افزونه
هر نشر برای هر نسخهٔ پشتیبانیشدهٔ انجن یک فایل zip از افزونه دارد، با نام LingaraEmbed-<semver>-UE5.<m>.zip. فایل مربوط به انجن خود را در پوشهٔ Plugins/ پروژهٔ خود از حالت فشرده بیرون کنید، بعد افزونه را در ویرایشگر فعال کنید. چیز دیگری برای نصب وجود ندارد.
گرفتن توکن از سرور شما
افزونه هرگز رمزی نگه نمیدارد. وقتی به توکن ضرورت دارد، OnTokenNeeded را منتشر میکند. با فرستادن درخواست به مسیر توکن سرور خودتان به آن پاسخ دهید، که با یک کیت سرور توکن صادر میکند و با توکن و زمان انقضای آن پاسخ میدهد، بعد هر دو را به ProvideToken بدهید. اگر سرور شما نتواند پاسخ دهد، TokenUnavailable را فراخوانی کنید تا فراخوانیهایی که منتظر توکن هستند به جای تمام شدن مهلت آنها فوراً ناکام شوند.
وصل کردن رویدادهایی که استفاده میکنید
هسته ورودی/خروجی شبکهٔ خود را روی رشتهٔ اجرایی خودش اجرا میکند. زیرسیستم آن را در 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);
}