はじめに
「UE5でEpic Online Services(EOS)を使ってみる」の続きです。
ログインの実装が必要なので、未実装の方は準備編・ログイン編をご確認ください。
リーダーボード(ランキング)は、統計データに対して期間を指定することで、その間のリーダーボードを作成できます。
今回は前回作成した統計データのリーダーボードを作成します。
目次
この章では、リーダーボード機能に必要な実装を行っていきます。
ポータルサイトにて、リーダーボードに必要な設定を行い、
必要なクラスを作成してC++を実装し、Blueprintで実行出来る状態にしてテストを行います。
1.Developer Portal
Developer Portalでリーダーボードを作成します。
ゲームサービス>リーダーボードに遷移して、「リーダーボード作成」をボタンを押します。
作成窓が開くので、各項目に以下を入力して作成。
・リーダーボード名:SCORE_RANK
・統計データ:SCORE_SUM
・開始日:今日の日付
・このリーダーボードの期限が切れないようにしてください:チェック


2.クラス作成
リーダーボードの取得用のクラスを作成します。
2-1.C++クラス
OnlineBlueprintCallProxyBaseを親クラスに指定して、EOS_GetLeaderboardをC++クラスで作成します。
3.C++
C++を以下で実装します。
EOS_DataDefinition.h(以下を追加)
USTRUCT(BlueprintType)
struct FRankingData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Rank;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString NickName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Score;
};
EOS_GetLeaderboard.h
#pragma once
#include "CoreMinimal.h"
#include "Net/OnlineBlueprintCallProxyBase.h"
#include "Interfaces/OnlineLeaderboardInterface.h"
#include "EOS_DataDefinition.h"
#include "EOS_GetLeaderboard.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnGetLeaderboardRetrieved, const TArray<FRankingData>&, RankingData);
UCLASS()
class EOS_API UEOS_GetLeaderboard : public UOnlineBlueprintCallProxyBase
{
GENERATED_BODY()
UPROPERTY(BlueprintAssignable)
FOnGetLeaderboardRetrieved OnSuccess;
UPROPERTY(BlueprintAssignable)
FOnGetLeaderboardRetrieved OnFailure;
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"), Category = "EOS")
static UEOS_GetLeaderboard* GetLeaderboard(UObject* WorldContextObject, FName LeaderboardName, int32 Range, int32 AroundRank);
virtual void Activate() override;
private:
void OnGetLeaderboardComplete(const bool bWasSuccessful, FOnlineLeaderboardReadRef LeaderboardRef);
private:
UWorld* World;
TWeakObjectPtr<UObject> WorldContextObject;
FName Leaderboard Name;
int32 Range;
int32 Around Rank;
TArray<FRankingData> RankingData;
};
EOS_GetLeaderboard.cpp
#include "OnlineSubsystemUtils.h"
#include "EOS_GetLeaderboard.h"
UEOS_GetLeaderboard* UEOS_GetLeaderboard::GetLeaderboard(UObject* WorldContextObject, FName LeaderboardName, int32 Range, int32 AroundRank)
{
UEOS_GetLeaderboard* Leaderboard = NewObject<UEOS_GetLeaderboard>();
Leaderboard->WorldContextObject = WorldContextObject;
Leaderboard->LeaderboardName = LeaderboardName;
Leaderboard->Range = Range;
Leaderboard->AroundRank = AroundRank;
return Leaderboard;
}
void UEOS_GetLeaderboard::Activate()
{
RankingData.Empty();
World = GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull);
if (!World)
{
UE_LOG(LogTemp, Error, TEXT("Leaderboard:Worldの取得に失敗"));
OnFailure.Broadcast(RankingData);
return;
}
IOnlineSubsystem* SubsystemRef = Online::GetSubsystem(World);
IOnlineIdentityPtr IdentityPointerRef = SubsystemRef->GetIdentityInterface();
IOnlineLeaderboardsPtr LeaderboardsPointerRef = SubsystemRef->GetLeaderboardsInterface();
if (LeaderboardsPointerRef)
{
FOnlineLeaderboardReadRef LeaderboardReadRef = MakeShared<FOnlineLeaderboardRead, ESPMode::ThreadSafe>();
LeaderboardReadRef->LeaderboardName = LeaderboardName;
LeaderboardsPointerRef->OnLeaderboardReadCompleteDelegates.AddUObject(this, &UEOS_GetLeaderboard::OnGetLeaderboardComplete, LeaderboardReadRef);
LeaderboardsPointerRef->ReadLeaderboardsAroundRank(AroundRank, Range, LeaderboardReadRef);
return;
}
OnFailure.Broadcast(RankingData);
}
void UEOS_GetLeaderboard::OnGetLeaderboardComplete(const bool bWasSuccessful, FOnlineLeaderboardReadRef LeaderboardReadRef)
{
if (bWasSuccessful)
{
UE_LOG(LogTemp, Warning, TEXT("ランキング取得成功"));
RankingData.Empty();
for (auto Row : LeaderboardReadRef->Rows)
{
FRankingData RankData;
RankData.Rank = Row.Rank;
RankData.NickName = Row.NickName;
Row.Columns[FName("None")].GetValue(RankData.Score);
RankingData.Add(RankData);
}
FString log = LeaderboardReadRef->ToLogString();
UE_LOG(LogTemp, Warning, TEXT("%s"), *log);
OnSuccess.Broadcast(RankingData);
}
else
{
FString log = LeaderboardReadRef->ToLogString();
UE_LOG(LogTemp, Warning, TEXT("ランキング取得失敗 - %s"), *log);
OnFailure.Broadcast(RankingData);
}
}
5.Blueprint
Blueprintを以下で実装します。
OnLeaderboardButton:EOSからランキングデータを配列で取得します。各項目に以下を入力します。
・LeaderBoardName:リーダーボード名
・Range:取得する順位の範囲
・AroundRank:基準となる順位

6.テスト
6-1.リーダーボード取得
ログイン後にOnLeaderboardButtonを実行します。
ここで取得しているNameはEpicアカウントのニックネームになります。

6-2.Developer Portal
ゲームサービス>リーダーボード>詳細の表示から、Developer Portal上でランキングを確認できます。
ここで表示される名前は製品ユーザーIDになります。


おわり
お疲れ様です。
以上でリーダーボード備は終わりです、次はプレイヤーデータ編です。