Lingara Lingara المستندات أدلة التعلّم API المكتبات التطبيقات البناء التضمين تطبيق الويب
اللغة: العربية

Unreal

هذه الصفحة مترجمة من الإنجليزية. إذا اختلفت النسختان، فالصفحة الإنجليزية هي الصحيحة. اقرأ الصفحة الإنجليزية

إضافة Lingara لـ Unreal Engine 5 هي نظام فرعي على مستوى مثيل اللعبة، مبني فوق واجهة C الخاصة بنواة اللاعب. تعمل على المنصات الخمس التي تدعمها حِزم اللاعب: Windows وmacOS وLinux وAndroid وiOS. أجهزة الألعاب المنزلية غير مدعومة بعد.

ثبّت الإضافة

يتضمّن كل إصدار ملف zip للإضافة لكل نسخة مدعومة من المحرّك، باسم LingaraEmbed-<semver>-UE5.<m>.zip. فكّ ضغط الملف المخصّص لمحرّكك في مجلد Plugins/ في مشروعك، ثم فعّل الإضافة في المحرّر. لا يوجد شيء آخر لتثبيته.

احصل على الرموز من خادمك

لا تحتفظ الإضافة بأي سرّ أبدًا. عندما تحتاج إلى رمز، تبثّ OnTokenNeeded. أجب عنه بإرسال طلب إلى مسار الرموز في خادمك، الذي يُصدر الرمز باستخدام حزمة خادم ويجيب بالرمز وموعد انتهاء صلاحيته، ثم سلّم كليهما إلى ProvideToken. إذا لم يستطع خادمك الإجابة، فاستدعِ TokenUnavailable حتى تفشل الاستدعاءات المنتظرة لرمز فورًا بدلًا من أن تنتهي مهلتها.

اربط الأحداث التي تستخدمها

تشغّل النواة عمليات الإدخال والإخراج الشبكية على خيطها الخاص. يُفرغها النظام الفرعي من نبضته الخاصة، بحد أقصى MaxEventsPerTick حدثًا في الإطار (إعداد في المشروع)، ويبثّ كل حدث على مفوَّض. اربط المفوَّضات التي تحتاجها لعبتك عند بدء اللعب، ثم شغّل النظام الفرعي:

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