Skip to content

In-Game Leaderboard

Leaderboards can be easily created within GameFuse from the Unreal Engine game client. A leaderboard entry can be added with:

  • leaderboard_name
  • score
  • extra_attributes (metadata)

for the current signed in user.

Leaderboards can be downloaded for a specific leaderboard_name, which would gather and sort the high scores for all users in the game. Leaderboards can also be downloaded for a specific user.

Adding Leaderboard Entries

The example below shows submitting leaderboard entries for the current user.

C++ Example

void UMyObject::AddLeaderboard()
{
    // Get the GameFuse User subsystem
    UGameFuseUser* GameFuseUser = GetGameInstance()->GetSubsystem<UGameFuseUser>();

    // Create metadata for the leaderboard entry
    TMap<FString, FString> ExtraAttributes;
    ExtraAttributes.Add("deaths", "15");
    ExtraAttributes.Add("jewels", "12");

    // Create callback for the operation
    FGFInternalSuccessCallback CompletionCallback;
    CompletionCallback.BindLambda([this](bool bSuccess)
    {
        if(bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Leaderboard entry added successfully"));
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to add leaderboard entry"));
        }
    });

    // Add leaderboard entry with metadata
    GameFuseUser->AddLeaderboardEntry("leaderboard_name", GameFuseUser->GetCurrentUserData().Score, ExtraAttributes, CompletionCallback);

    // Or add leaderboard entry without metadata
    // GameFuseUser->AddLeaderboardEntry("leaderboard_name", GameFuseUser->GetCurrentUserData().Score, CompletionCallback);
}

Fetching Leaderboard Entries

Fetching Current User's Leaderboard Entries

C++ Example

void UMyObject::GetMyLeaderboards()
{
    // Get the GameFuse User subsystem
    UGameFuseUser* GameFuseUser = GetGameInstance()->GetSubsystem<UGameFuseUser>();

    // Create callback for the operation
    FGFLeaderboardEntriesCallback CompletionCallback;
    CompletionCallback.BindLambda([this](bool bSuccess, const TArray<FGFLeaderboardEntry>& LeaderboardEntries)
    {
        if(bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Fetched %d leaderboard entries"), LeaderboardEntries.Num());

            for(const FGFLeaderboardEntry& Entry : LeaderboardEntries)
            {
                UE_LOG(LogTemp, Display, TEXT("Leaderboard: %s, Score: %d, Username: %s"), 
                    *Entry.LeaderboardName, Entry.Score, *Entry.Username);
            }
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to fetch leaderboard entries"));
        }
    });

    // Fetch current user's leaderboard entries
    GameFuseUser->FetchMyLeaderboardEntries(12, false, CompletionCallback);
}

Fetching Other Users' Leaderboard Entries

C++ Example

void UMyObject::GetUserLeaderboards(int32 UserId)
{
    // Get the GameFuse User subsystem
    UGameFuseUser* GameFuseUser = GetGameInstance()->GetSubsystem<UGameFuseUser>();

    // Create callback for the operation
    FGFLeaderboardEntriesCallback CompletionCallback;
    CompletionCallback.BindLambda([this](bool bSuccess, const TArray<FGFLeaderboardEntry>& LeaderboardEntries)
    {
        if(bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Fetched %d leaderboard entries for user"), LeaderboardEntries.Num());

            for(const FGFLeaderboardEntry& Entry : LeaderboardEntries)
            {
                UE_LOG(LogTemp, Display, TEXT("Leaderboard: %s, Score: %d, Username: %s"), 
                    *Entry.LeaderboardName, Entry.Score, *Entry.Username);
            }
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to fetch user leaderboard entries"));
        }
    });

    // Fetch specific user's leaderboard entries
    GameFuseUser->FetchUserLeaderboardEntries(UserId, 12, false, CompletionCallback);
}

Fetching Global Leaderboard Entries

C++ Example

void UMyObject::GetGlobalLeaderboards()
{
    // Get the GameFuse Manager subsystem
    UGameFuseManager* GameFuseManager = GetGameInstance()->GetSubsystem<UGameFuseManager>();

    // Create callback for the operation
    FGFApiCallback CompletionCallback;
    CompletionCallback.AddLambda([this, GameFuseManager](const FGFAPIResponse& Response)
    {
        if(Response.bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Global leaderboard entries fetched successfully"));

            // Get the leaderboard entries from the manager
            const TArray<FGFLeaderboardEntry>& Entries = GameFuseManager->GetLeaderboardEntries("leaderboard_name");

            for(const FGFLeaderboardEntry& Entry : Entries)
            {
                UE_LOG(LogTemp, Display, TEXT("Leaderboard: %s, Score: %d, Username: %s"), 
                    *Entry.LeaderboardName, Entry.Score, *Entry.Username);
            }
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to fetch global leaderboard entries: %s"), *Response.ResponseStr);
        }
    });

    // Fetch global leaderboard entries
    GameFuseManager->FetchLeaderboardEntries(15, false, "leaderboard_name", CompletionCallback);
}

Clearing Leaderboard Entries

You can clear all leaderboard entries in a specific leaderboard for the current user:

C++ Example

void UMyObject::ClearMyLeaderboards()
{
    // Get the GameFuse User subsystem
    UGameFuseUser* GameFuseUser = GetGameInstance()->GetSubsystem<UGameFuseUser>();

    // Create callback for the operation
    FGFInternalSuccessCallback CompletionCallback;
    CompletionCallback.BindLambda([this](bool bSuccess)
    {
        if(bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Leaderboard entries cleared successfully"));
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to clear leaderboard entries"));
        }
    });

    // Clear current user's leaderboard entries
    GameFuseUser->ClearLeaderboardEntry("leaderboard_name", CompletionCallback);
}

}

UFUNCTION(BlueprintCallable) void UMyObject::OnMyLeaderboardsClearedBlueprint(const FGFAPIResponse& Response) { if(Response.bSuccess) { UE_LOG(LogTemp, Display, TEXT("Leaderboard entries cleared successfully")); } else { UE_LOG(LogTemp, Error, TEXT("Failed to clear leaderboard entries: %s"), *Response.ResponseStr); } } ```

Function Parameters

Adding Leaderboard Entries

Parameter Type Description
LeaderboardName FString The name of the leaderboard
Score int32 The score to add
Metadata TMap<FString, FString> Optional metadata for the entry
Callback FGFInternalSuccessCallback / FBP_GFApiCallback Callback function to handle the response

Fetching Leaderboard Entries

Parameter Type Description
Limit int32 Maximum number of entries to fetch
bOnePerUser bool Whether to fetch only one entry per user
LeaderboardName FString The name of the leaderboard (for global fetch)
UserId int32 The user ID to fetch entries for (for user-specific fetch)
Callback FGFLeaderboardEntriesCallback / FBP_GFApiCallback Callback function to handle the response

Function Return Values

GameFuseUser->AddLeaderboardEntry / GameFuseUser->BP_AddLeaderboardEntryWithAttributes

HTTP status code Description
200 OK - Entry added successfully
400 Invalid extra attributes
401 Can only add entries for current user
500 Unknown server error

GameFuseUser->FetchMyLeaderboardEntries / GameFuseUser->FetchUserLeaderboardEntries

HTTP status code Description
200 OK - Entries fetched successfully
401 Unauthorized - User not signed in
404 User not found (for user-specific fetch)
500 Unknown server error

GameFuseManager->FetchLeaderboardEntries

HTTP status code Description
200 OK - Entries fetched successfully
404 No entries for this leaderboard name
500 Unknown server error

GameFuseUser->ClearLeaderboardEntry / GameFuseUser->BP_ClearLeaderboardEntry

HTTP status code Description
200 OK - Entries cleared successfully
401 Can only clear entries for the current user
500 Unknown server error