Unreal
यह पेज अंग्रेज़ी से अनुवादित है। अगर दोनों में अंतर हो, तो अंग्रेज़ी पेज सही है। अंग्रेज़ी पेज पढ़ें
Unreal Engine 5 के लिए Lingara प्लगइन प्लेयर कोर के C इंटरफ़ेस पर बना एक गेम-इंस्टेंस सबसिस्टम है। यह उन पाँच प्लेटफ़ॉर्म पर चलता है जिन्हें प्लेयर किट सपोर्ट करते हैं: Windows, macOS, Linux, Android और iOS। कंसोल अभी सपोर्टेड नहीं हैं।
प्लगइन इंस्टॉल करें
हर रिलीज़ में हर सपोर्टेड इंजन वर्शन के लिए प्लगइन की एक zip होती है, जिसका नाम LingaraEmbed-<semver>-UE5.<m>.zip होता है। अपने इंजन वाली zip को अपने प्रोजेक्ट के Plugins/ फ़ोल्डर में अनज़िप करें, फिर एडिटर में प्लगइन सक्षम करें। इसके अलावा कुछ भी इंस्टॉल नहीं करना है।
अपने सर्वर से टोकन पाएँ
प्लगइन कभी कोई सीक्रेट नहीं रखता। जब उसे टोकन चाहिए होता है, तो वह OnTokenNeeded ब्रॉडकास्ट करता है। इसका जवाब अपने ही सर्वर के टोकन रूट पर पोस्ट करके दें, जो सर्वर किट से मिंट करता है और टोकन तथा उसकी समाप्ति के साथ जवाब देता है, फिर दोनों को ProvideToken को सौंप दें। अगर आपका सर्वर जवाब नहीं दे सकता, तो TokenUnavailable को कॉल करें ताकि टोकन की प्रतीक्षा कर रहे कॉल टाइम आउट होने के बजाय तुरंत विफल हो जाएँ।
जिन इवेंट का आप उपयोग करते हैं उन्हें बाइंड करें
कोर अपना नेटवर्क I/O अपने ही थ्रेड पर चलाता है। सबसिस्टम उसे अपने ही टिक से खाली करता है, एक फ़्रेम में अधिकतम 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);
}