グループ ランキング
このチュートリアルでは、ランキングでグループ エンティティを使用する方法について説明します。 この概念を理解するために、まず、惑星のテラフォーミングに焦点を当てた "RPG" ゲームの例から始めます。 あなたはプレイヤーとして、各惑星上の構造を構築して開発し、リソースを集め、自分の船を作り、また、他のプレイヤーがあなたのものを盗むために攻撃してくる可能性があるため、防御を設置する必要があります。 さて、このゲームの重要な側面の 1 つは、チームを作ってグループとして他のプレイヤーを攻撃する目的で、プレイヤーが同盟を構築できることです。
このコンテキストを念頭に置いて、全宇宙でどの同盟がより強いかを知ることができるように、同盟のランキングを作成したいと思います。
グループ ランキングの仕組みについて詳しく説明する前に、念頭に置いておくべき重要な側面がいくつかあります:
- エンティティ プログラミング モデルの詳細については、「エンティティ プログラミング モデル」を参照してください。
- グループの仕組みについては、「グループ」を参照してください。
ランキングの作成
ゲームやシナリオの種類に応じて、おそらく複数のランキングを作成することになると思います。 この特定のコンテキストでは、このゲームのさまざまなシナリオと、サービスを使用してそれぞれのシナリオに対処する方法を示します。
プレイヤー ランキング
この例では、惑星をテラフォーミングしているプレイヤーがいて、ゲーム内で特定のアクションを実行して経験値を獲得しています。
そのため、プレイヤー レベルでその経験値を追跡するためのランキングを作成します。 このプロセスは、「基本ランキングの作成」などの他のチュートリアルで示されたものと同じ動作に従います。 ここで重要な点は、EntityType パラメーターが "title_player_account"
である必要があるため、プレイヤーのみを対象としているということです。
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
{
AuthenticationContext = context,
Name = leaderboardName,
SizeLimit = 1000,
EntityType = "title_player_account",
VersionConfiguration = new VersionConfiguration()
{
MaxQueryableVersions = 1,
ResetInterval = ResetInterval.Manual,
},
Columns = new List<LeaderboardColumn>()
{
new LeaderboardColumn()
{
Name = "XP",
SortDirection = LeaderboardSortDirection.Descending,
}
}
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
グループ ランキング
次に、例で説明したゲームの側面である "同盟" を見てみましょう。 同盟は、"group"
エンティティを使用して PlayFab で作成できます。 このグループ エンティティは、プレイヤーが参加できる構造を含めることを可能にし、ゲームでこの種類のシナリオを強化するロールやその他の興味深い機能も備えています。 ランキングを作成するには、2 つの条件があります。
- EntityType パラメーターが
"group"
である必要があること。 - このランキングは独立していること。 そのため、同盟のスコアを追加することは、プレイヤーのランキングとは別個の手動プロセスです。 この動作により、さまざまな方法でスコアをプレイヤーに関連付けることができ、グループにのみ適用される新しいメトリックにすることも可能です。
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
{
AuthenticationContext = context,
Name = leaderboardName,
SizeLimit = 1000,
EntityType = "group",
VersionConfiguration = new VersionConfiguration()
{
MaxQueryableVersions = 1,
ResetInterval = ResetInterval.Manual,
},
Columns = new List<LeaderboardColumn>()
{
new LeaderboardColumn()
{
Name = "Group XP",
SortDirection = LeaderboardSortDirection.Descending,
}
}
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
ランキングにデータを追加する
両方のランキングを作成したら、それらにデータを追加する方法を確認する必要があります。 前の例で前述したように、これらのランキングは互いに独立しています。これにより、開発者は、同盟 (グループ) に対するスコアの仕組みに関するカスタム ロジックの適用を制御できます。
public static async Task UpdateLeaderboardForPlayer(PlayFabAuthenticationContext context, string leaderboardName, string entityId, int score)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
UpdateLeaderboardEntriesRequest updateLeaderboardRequest = new UpdateLeaderboardEntriesRequest()
{
Entries = new List<LeaderboardEntryUpdate>()
{
new LeaderboardEntryUpdate()
{
EntityId = entityId,
Scores = new List<string> { score.ToString()}
}
},
AuthenticationContext = context,
LeaderboardName = leaderboardName,
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}
このシナリオでは、プレイヤー ランキングまたはグループ ランキングにエントリを追加するためのコードは同じです。 ただし、この動作は常に当てはまるわけでありません。プレイヤー用のランキングに 5 つの列があっても、グループ用のランキングには 1 つの列しかない場合があるためです。 複数列のランキングの詳細については、チュートリアル「より多くのランキングで実行する」で説明します。
常に留意すべき点は、サービスに正しい EntityId
を提供する必要があるということです。 プレイヤーのランキングがある場合、エンティティは "title_player_account"
で、ランキングがグループで構成されている場合は、"group
のエンティティを指定する必要があります。
ランキングからデータを取得する
ランキングのデータを取得するために、「より多くのランキングで実行する」で説明されているオプションのうち、GetFriendLeaderboard API を除くすべてのオプションを使用できます。
グループ ランキングの表示名
最後に、グループ ランキングに関して説明することができる詳細がもう 1 つあります。エンティティのグループ名を使用して表示名を設定することです。
"Raiders" という同盟がある場合、このグループ名は DisplayName
プロパティを持つエンティティにマップされます。
public static async Task<CreateGroupResponse> CreateGroup(string groupName, PlayFabAuthenticationContext context)
{
var request = new CreateGroupRequest
{
GroupName = groupName,
AuthenticationContext = context
};
var response = await PlayFabGroupsAPI.CreateGroupAsync(request);
SetDisplayNameRequest displayRequest = new SetDisplayNameRequest()
{
AuthenticationContext = context,
DisplayName = groupName,
Entity = new PlayFab.ProfilesModels.EntityKey()
{
Id = response.Result.Group.Id,
Type = "group",
},
};
PlayFabResult<SetDisplayNameResponse> updateNameResult = await PlayFabProfilesAPI.SetDisplayNameAsync(displayRequest);
return response.Result;
}
この例では、
CreateGroupAsync
メソッドを呼び出してグループを作成します。 この実行の最初の手順は、表示名の設定に使用する Group オブジェクトを返すことです。 このプロセスを行うには、SetDisplayNameRequest
オブジェクトを使用してグループ名をエンティティにマップし、次に PlayFabProfilesAPI.SetDisplayNameAsync
メソッドを実行します。
まとめ
このチュートリアルでは、次の操作を行う方法について説明しました:
- グループ ランキングの作成。
- そのランキングにデータをフィードする方法の説明。
- ランキングの取得。
- displayName を変更して、グループ名を表示できるようにすること。