더 많은 순위표로 작업
이 자습서에서는 다중 열 순위표 만들기, 향상된 연결 끊기 및 순위표를 쿼리하는 여러 가지 방법과 같이 서비스에서 제공해야 하는 고급 기능을 다룹니다.
이 예제에서는 기본 순위표 만들기 에 표시된 모든 항목이 익숙하다고 가정합니다. 우리는 이러한 새로운 기능이 우리가 몇 가지 문제를 해결하는 데 도움이 될 수있는 방법의 예로 매우 경쟁력있는 슈팅으로 시작하려고합니다. 이 게임에는 두 팀이 서로 마주보고 있는 팀 데스 매치라는 모드가 있습니다. 누가 먼저 75 탈락에 도착 승자입니다. 이제 이 게임은 플레이어의 순위를 매기는 단일 점수를 기반으로 하지 않습니다. 대신, 누가 최고인지 정의하는 것은 제거, 지원 및 사망 횟수를 기반으로 합니다.
다중 열 순위표 정의 만들기
이 예제로 시작하려면 이전보다 더 복잡한 순위표 정의를 만들어야 합니다. 게임의 주요 측면인 제거, 어시스트 및 사망을 매핑하기 위해 여러 열을 정의합니다. 다음 예제에서는 C# SDK를 사용하여 순위표 정의를 만드는 방법을 보여줍니다.
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 = "Eliminations",
SortDirection = LeaderboardSortDirection.Descending,
},
new LeaderboardColumn()
{
Name = "Assists",
SortDirection = LeaderboardSortDirection.Descending,
}
new LeaderboardColumn()
{
Name = "Deaths",
SortDirection = LeaderboardSortDirection.Ascending,
}
}
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
이제 이 예제의 몇 가지 주요 요소를 설명해 보겠습니다.
-
SizeLimit
: 이 매개 변수는 순위표에 있을 수 있는 행 수를 제한하는 데 사용됩니다. 여기에 있는 값은 예제일 뿐입니다. -
VersionConfiguration
: 이 매개 변수를 사용하면 순위표에서 버전 관리를 수행할 수 있습니다. 자세한 내용은 다음 페이지를 참조 하세요. 계절 순위표 -
Columns
: 이 매개 변수를 사용하면 여러 열을 정의할 수 있습니다. 여기서 볼 수 있듯이 제거, 지원 및 사망을 설정합니다. 여기서SortDirection
중요한 요소는 순위표의 정렬을 확인할 수 있는 매개 변수입니다. 이 예제에서 플레이어는 더 많은 제거 및 어시스트(SortDirection = 내림차순) 및 더 적은 수의 사망(SortDirection = 오름차순)이 있는 경우 순위가 높습니다.
다른 매개 변수 또는 순위표 정의를 관리하는 방법에 대한 자세한 내용은 기본 순위표 만들기를 참조하세요.
외부 엔터티 가져오기
순위표 서비스는 게임 컨텍스트에서만 의미가 있는 외부 엔터티 가져오기를 지원하는 독립 실행형 구성 요소로 사용할 수 있습니다. 플레이어 ID가 PlayFab 로그인과 연결되지 않은 경우에도 순위표 서비스를 사용할 수 있습니다. PlayFab 시스템 외부의 순위표에 있는 항목의 엔터티 형식은 외부에 있어야 합니다. 그런 다음 entityId는 시스템에서 플레이어의 ID입니다. 이러한 경우 순위표의 모든 항목은 외부 엔터티여야 합니다.
순위표에 데이터 추가
이제 순위표를 만들었으므로 데이터를 추가하겠습니다. 이 주제에 대한 이전 자습서와 기본 차이점은 이제 동일한 행에 세 가지 다른 점수를 추가해야 한다는 것입니다. 다음 예제에서는 C# SDK를 사용하여 순위표에 데이터를 추가하는 방법을 보여줍니다.
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(), (score + 1).ToString(), (score + 2).ToString() },
Metadata = "metadata",
}
},
AuthenticationContext = context,
LeaderboardName = leaderboardName,
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}
그리고 중요한 점은 Scores 매개 변수에 세 가지 값이 주어진다는 것입니다. 모든 항목에 대해 지정된 점수 목록의 길이는 순위표 정의의 열 수와 일치해야 합니다. 각 값은 유효한 64비트 정수여야 합니다(문자열 표현은 모든 클라이언트가 64비트 값을 처리할 수 있도록 하기 위한 것입니다).
순위표에서 데이터 검색
이제 순위표를 쿼리하는 다양한 방법을 알아보겠습니다. 모든 개발자는 개발자가 필요한 플레이어를 게임에 표시할 수 있도록 돕기 위해 특정 목적을 가지고 있습니다.
엔터티 주위에 순위표 가져오기
순위표를 쿼리하는 이 특정 방법을 사용하면 순위표의 섹션을 특정 엔터티에 가깝게 가져올 수 있습니다. 이 시나리오를 볼 수 있는 실용적인 방법은 대규모 순위표가 있고 게임에서 활성 상태인 플레이어에게만 관련 정보를 표시하려는 경우입니다. 플레이어가 1000 위치에 있는 경우 상위 플레이어 대신 가까운 이웃을 표시할 수 있습니다. 다음 예제에서는 C# SDK를 사용하여 엔터티에 대한 순위표를 쿼리하는 방법을 보여 있습니다.
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardAroundEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetLeaderboardAroundEntityRequest getLbRequest = new GetLeaderboardAroundEntityRequest()
{
LeaderboardName = leaderboardName,
AuthenticationContext = context,
Entity = new PlayFab.LeaderboardsModels.EntityKey()
{
Id = entityId,
Type = EntityType
},
MaxSurroundingEntries = 20,
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAroundEntityAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
여기서 MaxSurroundingEntries
가장 중요한 요소는 순위표에서 특정 엔터티 주위에 순위가 지정된 엔터티를 추출할 수 있는 입니다. 예를 들어 위치 100에 플레이어가 있고 = 20을 사용하면 MaxSurroundingEntries
위치 90에서 110으로 플레이어를 검색합니다. 플레이어가 순위표 맨 위에 있으면 상위 20개 결과를 검색합니다. 플레이어가 맨 아래에 있으면 마지막 20개의 결과를 검색합니다. 순위표의 위쪽과 아래쪽에 있는 위치를 제외하고 API는 순위가 요청되는 엔터티가 검색된 위치의 중심에 있는지 확인하려고 합니다.
엔터티에 대한 순위표 가져오기
이 API는 순위표를 쿼리하는 또 다른 방법을 제공합니다. 순위표 내에서 여러 엔터티를 검색하고 정렬하려는 경우가 있을 때마다 작동합니다. 다음 예제에서는 C# SDK를 사용하여 엔터티 목록에 대한 순위표를 쿼리하는 방법을 보여줍니다.
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardForEntities(PlayFabAuthenticationContext context, string leaderboardName, List<string> entityIds)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetLeaderboardForEntitiesRequest getLbRequest = new GetLeaderboardForEntitiesRequest()
{
LeaderboardName = leaderboardName,
AuthenticationContext = context,
EntityIds = entityIds,
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardForEntitiesAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
친구 순위표 가져오기
일부 캐주얼 플레이어가 돌아와 게임을 하는 경우가 있을 수 있습니다. 순위표 맨 위에서 멀리 떨어져 있을 수도 있지만, 친구들 사이에서는 경쟁이 벌어지고 있습니다. 이 API를 사용하여 순위표를 쿼리하고 플레이어의 친구를 찾을 수 있습니다.
public static async Task<List<EntityLeaderboardEntry>> GetFriendLeaderboardForEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetFriendLeaderboardForEntityRequest getLbRequest = new GetFriendLeaderboardForEntityRequest()
{
LeaderboardName = leaderboardName,
Entity = new PlayFab.LeaderboardsModels.EntityKey()
{
Id = entityId,
Type = EntityType
},
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetFriendLeaderboardForEntityAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
PlayFab 서비스에서 친구를 사귀는 방법에는 여러 가지가 있습니다. 사용 가능한 매개 변수에 대한 자세한 내용은 API 참조를 참조하세요.
타이 브레이킹 향상
경쟁이 치열한 슈팅 게임의 예를 고려할 때, 여러 플레이어가 동일한 수의 제거를 가질 수 있는 경우가 있습니다. 이러한 시나리오의 경우 이러한 사례를 묶을 수 있는 다른 방법이 있어야 합니다. 이 시나리오에서는 향상된 타이 브레이킹 기능이 작동합니다.
순위표 정의를 만들 때 여러 열을 가질 수 있습니다. 추가하는 방법은 일부 시나리오를 정렬하고 연결하는 방법을 결정합니다. 추가된 첫 번째 열이 가장 중요한 우선 순위, 두 번째 열 등이 있습니다. 이 시나리오는 제거에 동점이 있을 때마다 두 번째 기준이 어시스트 수이며 최종 기준은 사망이라는 예제로 변환됩니다. 동점이 여전히 지속되는 극단적 인 경우, 먼저 점수를 달성 누구든지 타임스탬프로 기본 설정됩니다.
Rank | 엔터티 ID | 소거 | 지원 | 죽음 | LastUpdated |
---|---|---|---|---|---|
1 | "플레이어 3" | 103 | 24 | 15 | "2024-08-27T20:24:36.738Z" |
2 | "플레이어 2" | 102 | 30 | 20 | "2024-08-27T20:24:29.251Z" |
3 | "플레이어 1" | 100 | 25 | 18 | "2024-08-27T19:52:26.642Z" |
4 | "플레이어 4" | 100 | 25 | 18 | "2024-08-27T20:24:44.552Z" |
4 | "플레이어 5" | 100 | 25 | 19 | "2024-08-27T20:25:47.552Z" |
이 예제에서는 다음 세 명의 플레이어 간에 동률을 이을 수 있습니다.
- "플레이어 5": 같은 양의 제거 및 어시스트가 있음에도 불구하고 더 많은 사망자가 발생하므로 순위표 맨 아래에 있습니다.
- "플레이어 4": 이 플레이어는 "플레이어 5"보다 사망자 수가 적고 "플레이어 1"과 동일한 양이지만 플레이어 1은 먼저 이러한 숫자를 얻었습니다.
- "플레이어 1": "플레이어 4"와 같은 숫자를 가지고 있음에도 불구하고 이 플레이어는 게임에서 이 점수를 가장 먼저 달성했기 때문에 이 타이 브레이크 시나리오에서 더 높은 순위를 차지했습니다.
결론
이 자습서에서는 다음 작업을 수행하는 방법을 알아보았습니다.
- 다중 열 순위표를 만듭니다.
- 여러 가지 쿼리 방법을 확인합니다.
- 연결 끊기 메커니즘 향상을 이해합니다.