Skip to main content
이 튜토리얼에서는 다중 열 리더보드 만들기, 향상된 동점 처리, 리더보드를 쿼리하는 여러 방법 등 서비스가 제공하는 고급 기능을 다룹니다. 이 예시에서는 기본 리더보드 만들기에 제시된 내용을 이미 익숙하다고 가정합니다. 이러한 새로운 기능이 문제 해결에 어떻게 도움이 되는지 보여주기 위해 매우 경쟁적인 슈터 게임을 예로 들어 보겠습니다. 이 게임에는 Team Death match라는 모드가 있으며, 두 팀이 서로 대결합니다. 75킬(elimination)을 먼저 달성한 팀이 승리합니다. 이 게임은 플레이어의 순위를 매기기 위한 단일 점수 기반이 아니라, 킬 수(eliminations), 어시스트 수(assists), 데스 수(deaths)를 기준으로 누가 최고인지 결정합니다.

다중 열 리더보드 정의 만들기

이 예시를 시작하려면 이전보다 더 복잡한 리더보드 정의를 만들어야 합니다. 게임의 주요 요소인 eliminations, assists, deaths를 매핑하기 위한 여러 열을 정의합니다. 다음 예시는 C# SDK를 사용하여 리더보드 정의를 만드는 방법을 보여줍니다.
이 예시의 주요 요소를 설명하면 다음과 같습니다.
  • SizeLimit: 이 매개 변수는 리더보드가 가질 수 있는 행의 수를 제한하는 데 사용됩니다. 여기의 값은 단지 예시입니다.
  • VersionConfiguration: 이 매개 변수를 통해 리더보드에 버전 관리를 적용할 수 있습니다. 자세한 정보는 Seasonal Leaderboards 페이지를 참조하세요.
  • Columns: 이 매개 변수를 통해 여러 열을 정의할 수 있으며, 정의당 최대 5개까지 가능합니다. 위에서 볼 수 있듯이 Eliminations, Assists 및 Deaths를 설정했습니다. 여기서 중요한 요소는 SortDirection 매개 변수로, 리더보드 정렬 방식을 결정할 수 있게 해줍니다. 이 예시에서 플레이어는 킬과 어시스트가 더 많고(SortDirection = Descending) 데스가 더 적을 때(SortDirection = Ascending) 더 상위에 오르게 됩니다.
다른 매개 변수나 리더보드 정의를 관리하는 방법에 대한 자세한 내용은 기본 리더보드 만들기를 참조하세요.

외부 엔티티 가져오기

리더보드 서비스는 독립 실행형 구성 요소로 사용할 수 있으며, 게임의 컨텍스트에서만 의미가 있는 외부 엔티티를 가져오는 것을 지원합니다. 플레이어 ID가 PlayFab 로그인과 연결되지 않은 경우에도 리더보드 서비스를 사용할 수 있습니다. PlayFab 시스템 외부의 리더보드 항목에 대한 엔티티 유형은 external이어야 합니다. entityId는 여러분 시스템 내 플레이어의 ID입니다. 이러한 경우 리더보드의 모든 항목은 external 엔티티여야 합니다.

리더보드에 데이터 추가하기

리더보드를 만들었으므로 이제 데이터를 추가합니다. 이 주제에 관한 이전 튜토리얼과의 주요 차이점은 이제 한 행에 세 개의 서로 다른 점수를 추가해야 한다는 것입니다. 다음 예시는 C# SDK를 사용하여 리더보드에 데이터를 추가하는 방법을 보여줍니다.
중요한 점은 Scores 매개 변수에 세 개의 값이 지정된다는 것입니다. 어떤 항목에 대해서든 지정되는 점수 목록의 길이는 리더보드 정의의 열 수와 일치해야 합니다. 각 값은 유효한 64비트 정수여야 합니다(문자열 표현은 모든 클라이언트가 64비트 값을 처리할 수 있도록 하기 위한 것뿐입니다).

리더보드에서 데이터 검색

이제 리더보드를 쿼리하는 다양한 방법을 배워보겠습니다. 각 방법은 개발자가 게임에 표시할 필요한 플레이어를 얻는 데 도움이 되도록 특정 목적을 가지고 있습니다.

엔티티 주변의 리더보드 가져오기

이 특정한 쿼리 방식은 리더보드에서 특정 엔티티에 가까운 구간을 가져올 수 있게 해줍니다. 이 시나리오를 이해하는 실용적인 방법은 대규모 리더보드가 있고 현재 게임을 플레이 중인 플레이어에게 관련 정보만 표시하고 싶은 경우를 생각해보는 것입니다. 플레이어가 1000위에 있는 경우, 상위 플레이어 대신 근접한 이웃을 보여줄 수 있습니다. 다음 예시는 C# SDK를 사용하여 엔티티 주변의 리더보드를 쿼리하는 방법을 보여줍니다.
여기서 가장 중요한 요소는 MaxSurroundingEntries로, 리더보드에서 특정 엔티티 주변에 순위가 매겨진 엔티티를 추출할 수 있게 해줍니다. 예를 들어, 어떤 플레이어가 100위에 있고 MaxSurroundingEntries = 20을 사용하면 90위부터 110위까지의 플레이어를 가져옵니다. 플레이어가 리더보드 최상단에 있다면 상위 20개 결과를 가져옵니다. 플레이어가 최하단에 있다면 마지막 20개 결과를 가져옵니다. 리더보드의 최상단과 최하단 위치를 제외하면, API는 순위를 요청한 엔티티가 검색된 위치의 가운데에 오도록 보장하려 합니다.

엔티티들에 대한 리더보드 가져오기

이 API는 리더보드를 쿼리하는 또 다른 방법을 제공합니다. 리더보드 내에서 여러 엔티티를 검색하고 정렬하려는 경우에 사용됩니다. 다음 예시는 C# SDK를 사용하여 엔티티 목록에 대한 리더보드를 쿼리하는 방법을 보여줍니다.

친구 리더보드 가져오기

일부 캐주얼 플레이어들이 잠깐 들러 게임을 즐기는 경우가 있을 수 있습니다. 이들은 리더보드 상단과는 거리가 멀 수 있지만, 친구들 사이에서는 경쟁을 벌이고 있을 수 있습니다. 이 API를 사용하면 리더보드를 쿼리하여 플레이어의 친구를 찾을 수 있습니다.
PlayFab 서비스에서 친구를 가져오는 방법에는 여러 가지가 있습니다. 사용 가능한 매개 변수에 대한 자세한 내용은 API 참조를 참조하세요.

향상된 동점 처리

매우 경쟁적인 슈터 게임의 예를 생각해 봤을 때, 여러 플레이어가 같은 킬 수를 가질 수 있는 경우가 있습니다. 이러한 시나리오에서는 다른 방식으로 동점을 처리해야 합니다. 이 시나리오가 바로 향상된 동점 처리 기능이 활용되는 곳입니다. 리더보드 정의를 만들 때 여러 열을 가질 수 있습니다. 열을 추가하는 순서에 따라 정렬 방식과 일부 시나리오의 동점 처리 방식이 결정됩니다. 우선순위 순서가 있어서, 처음 추가된 열이 가장 중요하고, 그 다음이 두 번째, 이런 식으로 이어집니다. 이 시나리오를 예시에 적용하면, kills에서 동점일 경우 두 번째 기준은 assists이고, 마지막 기준은 deaths가 됩니다. 극단적인 경우 여전히 동점이 지속되면, 타임스탬프를 기본값으로 사용하여 먼저 점수를 달성한 사람에게 우선순위를 부여합니다. | 순위 | Entity Id | Eliminations| Assists | Deaths | LastUpdated
|----------------------|------------------------------------|-------------------|-------------------------- |1 | “player 3” | 103 |24 | 15|“2024-08-27T20:24:36.738Z” |2 | “player 2” | 102 | 30| 20 |“2024-08-27T20:24:29.251Z” |3 | “player 1” | 100 | 25 |18 |“2024-08-27T19:52:26.642Z”
|4 | “player 4” | 100 | 25 | 18 |“2024-08-27T20:24:44.552Z” |4 | “player 5” | 100 | 25 | 19 |“2024-08-27T20:25:47.552Z”
이 예시에서는 세 플레이어 간의 동점 상황이 있습니다.
  • “player 5”: 같은 수의 kills와 assists를 가졌지만 deaths가 더 많으므로 리더보드에서 가장 아래에 위치합니다.
  • “player 4”: 이 플레이어는 “player 5”보다 deaths가 적고, “player 1”과 같지만, player 1이 이 수치를 먼저 달성했습니다.
  • “player 1”: “player 4”와 같은 수치를 가지지만, 이 플레이어가 게임에서 먼저 이 점수를 달성했기 때문에 이 동점 처리 시나리오에서 더 상위에 랭크됩니다.

결론

이 튜토리얼에서 우리는 다음 작업을 수행하는 방법을 배웠습니다.
  • 다중 열 리더보드 만들기.
  • 여러 쿼리 방식 확인.
  • 향상된 동점 처리 메커니즘 이해.

함께 보기

마지막 수정일 2026년 8월 13일