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