본문 바로가기

Unreal/에픽 온라인 서비스

EOS: Redpoint Games 플러그인 QueryStats, Leaderboards 작동 문제

https://www.unrealengine.com/marketplace/ko/product/eos-online-subsystem

 

EOS Online Subsystem, 카테고리 코드 플러그인 - UE 마켓플레이스

Use Epic Online Services in your Unreal Engine game! This plugin provides an online subsystem for Epic Online Services.

www.unrealengine.com

 

언리얼 엔진 EOS 플러그인으로 판매되고 있습니다.

 

https://gitlab.com/redpointgames/eos-online-subsystem-example/-/tree/main/ExampleCPP_EOS_4.26

 

ExampleCPP_EOS_4.26 · main · RedpointGames / EOS Online Subsystem Example Projects

Example projects for the EOS Online Subsystem and Online Subsystem Blueprints plugins.

gitlab.com

 

깃랩에 예제 프로젝트도 공개되어 있습니다.

 


예제 프로젝트에 플러그인을 넣고 컴파일해 데모를 돌리면 모든 데이터를 잘 받아옵니다.

그러나 예제에 포함되지 않은 다른 제품의 키를 넣고 테스트하면 스탯과 리더보드 부분이 작동되지 않습니다.

 

그 이유는 이 예제가 모든 제품에 대해 대응하도록 설계되지 않고, 지정된 이름의 스탯으로만 동작하도록 설계되었기 때문인데요. 소스 코드를 수정해 BP대응을 추가적으로 해 주어야 합니다.

 

QueryStats, HandleLeaderboardResult 함수를 보시면 Score와 TestScore가 하드코딩으로 박혀있습니다. 파라미터를 받는 함수로 적절히 수정하여 사용하시면 됩니다.

 

 

코드 전문 

더보기
// ExampleCPPSubsystem.h
	UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"))
    void QueryStatsByName(const UObject *WorldContextObject,
        const FString &StatName, FExampleCPPSubsystemQueryStatsComplete OnDone);

    UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"))
    void QueryStatsByNames(const UObject *WorldContextObject,
        const TArray<FString> &StatNames, FExampleCPPSubsystemQueryStatsComplete OnDone);
        
 // ExampleCPPSubsystem.Stats.cpp
 void UExampleCPPSubsystem::QueryStatsByName(const UObject *WorldContextObject,
    const FString &StatName, FExampleCPPSubsystemQueryStatsComplete OnDone)
{
    IOnlineSubsystem *Subsystem = Online::GetSubsystem(WorldContextObject->GetWorld());
    if (Subsystem == nullptr)
    {
        OnDone.ExecuteIfBound(false, TArray<FExampleCPPStat>());
        return;
    }
    IOnlineIdentityPtr Identity = Subsystem->GetIdentityInterface();
    IOnlineStatsPtr Stats = Subsystem->GetStatsInterface();

    TArray<TSharedRef<const FUniqueNetId>> Users;
    Users.Add(Identity->GetUniquePlayerId(0).ToSharedRef());

    TArray<FString> StatNames;
    StatNames.Add(StatName);

    Stats->QueryStats(
        Identity->GetUniquePlayerId(0).ToSharedRef(),
        Users,
        StatNames,
        FOnlineStatsQueryUsersStatsComplete::CreateUObject(
            this,
            &UExampleCPPSubsystem::HandleQueryStats,
            WorldContextObject,
            OnDone));
}

void UExampleCPPSubsystem::QueryStatsByNames(const UObject *WorldContextObject,
    const TArray<FString> &StatNames, FExampleCPPSubsystemQueryStatsComplete OnDone)
{
    IOnlineSubsystem *Subsystem = Online::GetSubsystem(WorldContextObject->GetWorld());
    if (Subsystem == nullptr)
    {
        OnDone.ExecuteIfBound(false, TArray<FExampleCPPStat>());
        return;
    }
    IOnlineIdentityPtr Identity = Subsystem->GetIdentityInterface();
    IOnlineStatsPtr Stats = Subsystem->GetStatsInterface();

    TArray<TSharedRef<const FUniqueNetId>> Users;
    Users.Add(Identity->GetUniquePlayerId(0).ToSharedRef());

    Stats->QueryStats(
        Identity->GetUniquePlayerId(0).ToSharedRef(),
        Users,
        StatNames,
        FOnlineStatsQueryUsersStatsComplete::CreateUObject(
            this,
            &UExampleCPPSubsystem::HandleQueryStats,
            WorldContextObject,
            OnDone));
}