Unreal
Αυτή η σελίδα έχει μεταφραστεί από τα αγγλικά. Αν οι δύο διαφέρουν, η αγγλική σελίδα είναι η σωστή. Διαβάστε την αγγλική σελίδα
Το plugin του Lingara για το Unreal Engine 5 είναι ένα υποσύστημα game instance πάνω από τη διεπαφή C του πυρήνα παίκτη. Εκτελείται στις πέντε πλατφόρμες που υποστηρίζουν τα κιτ παίκτη: Windows, macOS, Linux, Android και iOS. Οι κονσόλες δεν υποστηρίζονται ακόμη.
Εγκατάσταση του plugin
Κάθε έκδοση περιέχει ένα zip του plugin για κάθε υποστηριζόμενη έκδοση της μηχανής, με όνομα LingaraEmbed-<semver>-UE5.<m>.zip. Αποσυμπιέστε αυτό που αντιστοιχεί στη μηχανή σας στον φάκελο Plugins/ του έργου σας και έπειτα ενεργοποιήστε το plugin στον editor. Δεν χρειάζεται να εγκαταστήσετε τίποτα άλλο.
Λήψη token από τον διακομιστή σας
Το plugin δεν κρατά ποτέ κανένα μυστικό. Όταν χρειάζεται ένα token, εκπέμπει το OnTokenNeeded. Απαντήστε σε αυτό στέλνοντας αίτημα στη διαδρομή token του δικού σας διακομιστή, ο οποίος εκδίδει με ένα κιτ διακομιστή και απαντά με το token και τη λήξη του, και έπειτα δώστε και τα δύο στο ProvideToken. Αν ο διακομιστής σας δεν μπορεί να απαντήσει, καλέστε το TokenUnavailable, ώστε οι κλήσεις που περιμένουν token να αποτύχουν αμέσως αντί να λήξει ο χρόνος τους.
Σύνδεση των συμβάντων που χρησιμοποιείτε
Ο πυρήνας εκτελεί το δικτυακό του I/O στο δικό του νήμα. Το υποσύστημα τον αδειάζει από το δικό του tick, το πολύ MaxEventsPerTick συμβάντα ανά καρέ (μια ρύθμιση του έργου), και εκπέμπει το καθένα σε ένα delegate. Συνδέστε τα delegates που χρειάζεται το παιχνίδι σας όταν ξεκινά το παιχνίδι και έπειτα εκκινήστε το υποσύστημα:
OnTokenNeeded, όταν χρειάζεται token·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);
}