Lingara Lingara لارښود لارښودونه API کتابتونونه اپلیکیشنونه جوړول ځای پر ځای کول ویب اپلیکیشن
ژبه: پښتو

Unreal

دا پاڼه له انګلیسي ژبې ژباړل شوې ده. که دواړه سره توپیر ولري، انګلیسي پاڼه سمه ده. انګلیسي پاڼه ولولئ

د Unreal Engine 5 لپاره د Lingara پلګ‌ان د game-instance یو subsystem دی چې د لوبغاړي د هستې د C انټرفېس پر سر جوړ دی. دا په هغو پنځو پلاتفورمونو چلېږي چې د لوبغاړي کیټونه یې ملاتړ کوي: Windows، macOS، Linux، Android او iOS. کنسولونه لا تر اوسه نه ملاتړ کېږي.

پلګ‌ان نصب کړئ

هره خپرونه د انجن د هرې ملاتړ شوې نسخې لپاره د پلګ‌ان یو zip لري، چې نوم یې LingaraEmbed-<semver>-UE5.<m>.zip دی. د خپل انجن لپاره یې د خپلې پروژې په Plugins/ فولډر کې خلاص کړئ، بیا پلګ‌ان په اډیټر کې فعال کړئ. د نصبولو لپاره بل هېڅ شی نشته.

ټوکنونه له خپل سرور څخه واخلئ

پلګ‌ان هېڅکله راز نه ساتي. کله چې ټوکن ته اړتیا ولري، OnTokenNeeded خپروي. ورته د خپل سرور د ټوکن لارې ته د غوښتنې په لېږلو ځواب ورکړئ، چې د یوه سرور کیټ په مرسته ټوکن جوړوي او د ټوکن او د هغه د پای ته رسېدو د وخت په لېږلو ځواب ورکوي، بیا دواړه ProvideToken ته ورکړئ. که ستاسو سرور ځواب ورنه کړای شي، TokenUnavailable کال کړئ ترڅو هغه کالونه چې د ټوکن انتظار باسي د وخت د تېرېدو پر ځای سمدستي ناکام شي.

هغه پېښې وتړئ چې کاروئ یې

هسته د شبکې خپل I/O په خپل جلا تار کې چلوي. subsystem هغه د خپل tick څخه خالي کوي، په یوه چوکاټ کې تر MaxEventsPerTick پېښو پورې (د پروژې یو تنظیم)، او هره یوه په یوه delegate خپروي. هغه delegates چې ستاسو لوبه یې اړتیا لري د لوبې د پیل پر مهال وتړئ، بیا subsystem پیل کړئ:

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