

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 게임 클라이언트에 FlexMatch 추가
<a name="match-client"></a>

이 주제에서는 클라이언트 측 게임 구성 요소에 FlexMatch 매치메이킹 기능을 추가하는 방법을 설명합니다.

게임 클라이언트에서 백엔드 게임 서비스를 통해 매치메이킹 요청을 수행하는 것이 좋습니다. Amazon GameLift Servers 서비스와 소통하기 위해 신뢰할 수 있는 소스를 사용하면 해킹 시도 및 가짜 플레이어 데이터를 보다 쉽게 막을 수 있습니다. 게임에 세션 디렉터리 서비스가 있는 경우 매치메이킹 요청을 처리하기 위한 좋은 옵션이 됩니다. Amazon GameLift Servers 서비스에 대한 모든 호출에 백엔드 게임 서비스를 사용하는 것이 Amazon GameLift Servers 호스팅과 FlexMatch를 사용하거나 독립 실행형 서비스로 사용할 때 가장 좋습니다.

Amazon GameLift Servers 관리형 호스팅과 FlexMatch를 함께 사용하든 다른 호스팅 솔루션과 함께 독립 실행형 서비스로를 사용하든 클라이언트 측 업데이트가 필요합니다. AWS SDK의 일부Amazon GameLift Servers인 용 서비스 API를 사용하여 다음 기능을 추가합니다.
+ 한 명 또는 여러 명의 플레이어에 대한 매치메이킹 요청(필수). 매치메이킹 규칙 세트에 따라 이 요청에는 플레이어 속성 및 지연 시간을 포함한 특정 플레이어별 데이터가 필요할 수 있습니다.
+ 매치메이킹 요청 상태 추적(필수). 일반적으로 이 작업을 수행하려면 이벤트 알림을 설정해야 합니다.
+ 제안된 매치에 대한 플레이어 수락 요청(선택 사항). 이 기능을 사용하려면 매치 세부 정보를 표시하고 플레이어가 매치를 수락하거나 거부할 수 있도록 플레이어와의 추가 상호 작용이 필요합니다.
+ 게임 세션 연결 정보를 가져오고 게임에 조인(필수). 새 매치에 대해 게임 세션이 시작된 후 게임 세션의 연결 정보를 검색하고 이를 사용하여 게임 세션에 연결합니다.

## 사전 조건 클라이언트 측 작업
<a name="match-client-setup"></a>

게임에 클라이언트 측 기능을 추가하려면 먼저 다음 작업을 수행해야 합니다.
+ **SDK를 AWS 백엔드 서비스에 추가합니다.** 백엔드 서비스는 AWS SDK에 속한 Amazon GameLift Servers API의 기능을 사용합니다. [Amazon GameLift Servers SDKs에 대해 자세히 알아보고 최신 버전을 다운로드하려면 클라이언트 서비스용](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-supported.html#gamelift-supported-clients) AWS SDK를 참조하세요. API 설명 및 기능은 [Amazon GameLift Servers FlexMatch API 참조(AWS SDK)](reference-awssdk-flex.md) 섹션을 참조하세요.
+ **매치메이킹 티켓 시스템을 설정합니다.** 모든 매치메이킹 요청에 고유 티켓 ID를 보유해야 합니다. 고유 티켓 ID를 생성하고 매치 요청에 할당하는 메커니즘을 만듭니다. 티켓 ID는 최대 128자까지 어떤 문자열 형식도 사용 가능합니다.
+ **매치메이커에 대한 정보를 수집합니다.** 매치메이킹 구성 및 규칙 세트에서 다음 정보를 가져옵니다.
  + 매치메이킹 구성 리소스의 이름입니다.
  + 규칙 세트에 정의된 플레이어 속성 목록입니다.
+ **플레이어 데이터를 검색합니다.** 매치메이킹 요청에 포함할 각 플레이어에 대한 관련 데이터를 가져오는 방법을 설정합니다. 플레이어 ID와 플레이어 속성 값이 필요합니다. 규칙 세트에 지연 시간 규칙이 있거나 게임 세션을 배치할 때 지연 시간 데이터를 사용하려는 경우 플레이어가 게임에 슬롯될 가능성이 있는 각 지리적 위치에 대한 지연 시간 데이터를 수집합니다. 정확한 지연 시간 측정값을 얻으려면 Amazon GameLift Servers의 UDP 핑 비콘을 사용합니다. 이러한 엔드포인트를 사용하면 플레이어 디바이스와 각 잠재적 호스팅 위치 간의 실제 UDP 네트워크 지연 시간을 측정할 수 있으므로 ICMP Ping을 사용하는 것보다 더 정확한 배치 결정을 내릴 수 있습니다. UDP 핑 비콘을 사용하여 지연 시간을 측정하는 방법에 대한 자세한 내용은 [UDP 핑 비콘](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/reference-udp-ping-beacons.html) 섹션을 참조하세요.

# 플레이어에 대해 매치메이킹 요청
<a name="match-client-start"></a>

FlexMatch 매치메이커에 대한 매치메이킹 요청을 관리하기 위해 게임 백엔드 서비스에 코드를 추가합니다. FlexMatch 매치메이킹을 요청하는 프로세스는 FlexMatch를 Amazon GameLift Servers 호스팅과 함께 사용하는 게임과 FlexMatch를 독립형 솔루션으로 사용하는 게임의 경우 동일합니다.

## 매치메이킹 요청을 생성하려면:
<a name="match-client-start-request"></a>

Amazon GameLift Servers API [StartMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StartMatchmaking.html)을 호출합니다. 각 요청에는 다음 정보가 포함되어야 합니다.

**매치메이커**  
요청에 사용할 매치메이킹 구성 이름입니다. FlexMatch가 각 요청을 지정된 매치메이커에 대한 풀에 배치하며 요청은 매치메이커의 구성 방법에 따라 처리됩니다. 여기에는 시간 제한 적용, 매치에 대한 플레이어 수락 요청 여부, 결과 게임 세션을 배치할 때 사용할 대기열 등이 포함됩니다. [FlexMatch 매치메이커 설계](match-configuration.md)에서 매치메이커 및 규칙 세트에 대해 자세히 알아보세요.

**티켓 ID**  
요청에 할당된 고유 티켓 ID입니다. 이벤트 및 알림 등 요청과 관련된 모든 항목이 티켓 ID를 참조합니다.

**플레이어 데이터**  
생성할 매치의 대상인 플레이어 목록입니다. 요청에 속한 플레이어 중 한 명이라도 매치 규칙 및 최소 지연 시간에 따라 매치 요구 사항을 충족하지 않는 경우, 매치메이킹을 요청해도 성공적으로 매칭되지 않습니다. 매치 요청에 최대 10명의 플레이어를 포함시킬 수 있습니다. 요청에 여러 플레이어가 속해 있는 경우, FlexMatch는 단일 매치를 생성하여 모든 플레이어를 동일한 팀에 할당하려고 시도합니다(무작위 선택). 매치 팀 중 하나에 맞추기에는 요청에 플레이어가 너무 많이 포함되어 있는 경우, 요청이 매칭되지 않습니다. 예를 들어 2v2 매치(2명의 플레이어가 있는 2개의 팀)를 생성하도록 매치메이커를 설정하는 경우, 플레이어가 셋 이상 포함된 매치메이킹 요청을 전송할 수 없습니다.  
한 플레이어(플레이어 ID로 식별)는 한 번에 하나의 액티브 매치메이킹 요청에만 포함될 수 있습니다. 플레이어에 대해 새 요청을 생성할 때 동일한 플레이어 ID와 연결된 모든 활성 매치메이킹 티켓이 자동으로 취소됩니다.
나열된 각 플레이어에 대해 다음 데이터를 포함합니다.  
+ 플레이어 ID - 각 플레이어는 사용자가 생성한 고유 플레이어 ID를 가지고 있어야 합니다.** [플레이어 ID 생성](https://docs.aws.amazon.com/gamelift/latest/developerguide/player-sessions-player-identifiers.html)을 참조하세요.
**중요**  
기존 활성 매치메이킹 요청에 이미 포함된 플레이어 ID가 포함된 새 매치메이킹 요청을 생성하면 기존 요청이 자동으로 취소됩니다. 그러나 취소된 요청에 대해서는 `MatchmakingCancelled` 이벤트가 전송되지 않습니다. 기존 매치메이킹 요청 상태를 모니터링하려면 [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)을 사용하여 자주 발생하지 않는 간격(30\$160초)으로 요청 상태를 폴링합니다. 취소된 요청은 `Cancelled due to duplicate player` 이유인 `CANCELLED` 상태로 표시됩니다.
+ 플레이어 속성 - 사용 중인 매치메이커가 플레이어 속성을 요청하는 경우 해당 요청은 각 플레이어에게 해당 속성을 제공해야 합니다.** 필수 플레이어 속성은 매치메이커의 규칙 세트에 정의되어 있으며, 이 규칙 세트는 속성에 대한 데이터 형식도 지정합니다. 플레이어 속성은 규칙 세트가 해당 속성에 대해 기본값을 지정할 때에만 선택 사항입니다. 매치 요청이 모든 플레이어에게 필수 플레이어 속성을 제공하지 않는 경우 매치메이킹 요청이 성공할 수 없습니다. [FlexMatch 규칙 세트 빌드](match-rulesets.md) 및 [FlexMatch 규칙 세트 예제](match-examples.md)에서 매치메이커 규칙 세트 및 플레이어 속성에 대해 자세히 알아보십시오.
+ 플레이어 지연 시간 - 사용 중인 매치메이커에 플레이어 지연 시간 규칙이 있는 경우 요청은 각 플레이어에 대한 지연 시간을 보고해야 합니다.** 플레이어 지연 시간 데이터는 플레이어당 하나 이상의 값 목록입니다. 이 데이터는 매치메이커 대기열에서 플레이어가 리전에 대해 경험하는 지연 시간을 나타냅니다. 요청에 플레이어에 대한 지연 시간 값이 포함되어 있지 않는 경우 플레이어가 매칭될 수 없으며 요청이 실패합니다. 정확한 지연 시간 측정값을 얻으려면 Amazon GameLift Servers의 UDP 핑 비콘을 사용합니다. 이러한 엔드포인트를 사용하면 플레이어 디바이스와 잠재적 호스팅 위치 간의 실제 UDP 네트워크 지연 시간을 측정할 수 있으므로 ICMP Ping을 사용하는 것보다 더 정확한 배치 결정을 내릴 수 있습니다. UDP 핑 비콘을 사용하여 지연 시간을 측정하는 방법에 대한 자세한 내용은 [UDP 핑 비콘](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/reference-udp-ping-beacons.html) 섹션을 참조하세요.

## 매치 요청 세부 정보를 검색하려면
<a name="match-client-start-retrieve"></a>

매치 요청이 전송된 후 요청의 티켓 ID로 [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)을 호출하여 요청 세부 정보를 볼 수 있습니다. 이 요청은 현재 상태를 포함한 요청 정보를 반환합니다. 요청이 성공적으로 완료되면 티켓에도 게임 클라이언트가 매치에 연결하는 데 필요한 정보가 포함됩니다.

## 매치 요청을 취소하려면
<a name="match-client-start-cancel"></a>

요청의 티켓 ID로 [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)을 호출하여 언제든지 매치메이킹 요청을 취소할 수 있습니다.

# 매치메이킹 이벤트 추적
<a name="match-client-track"></a>

매치메이킹 프로세스에 대해 Amazon GameLift Servers가 방출하는 이벤트를 추적하도록 알림을 설정합니다. 직접 알림을 설정하거나 SNS 주제를 생성하거나 Amazon EventBridge를 사용하여 알림을 설정할 수 있습니다. 알림 설정에 대한 자세한 내용은 [FlexMatch 이벤트 알림 설정](match-notification.md) 섹션을 참조하세요. 알림을 설정하면 이벤트를 감지하고 필요할 경우 응답하기 위해 클라이언트 서비스에 리스너를 추가합니다.

또한 알림 없이 상당한 시간이 경과하면 상태 업데이트를 정기적으로 폴링하여 알림을 백업하는 것이 좋습니다. 매치메이킹 성능에 미치는 영향을 최소화하려면 매치메이킹 티켓을 제출한 후 30초 이상 기다린 후 또는 마지막으로 알림을 받은 후에만 폴링해야 합니다.

요청의 티켓 ID로 [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)을 호출하여 현재 상태를 포함한 매치메이킹 요청 티켓을 검색합니다. 폴링은 10초에 1회가 넘지 않도록 하는 것이 좋습니다. 이 접근 방식은 소량 개발 시나리오에서만 사용할 수 있습니다.

**참고**  
프로덕션 전 부하 테스트와 같이 대량의 매치메이킹을 사용하기 전에 이벤트 알림을 사용하여 게임을 설정해야 합니다. 공개 버전의 모든 게임은 볼륨에 관계없이 알림을 사용해야 합니다. 지속적인 폴링 접근 방식은 매치메이킹 사용량이 낮은 개발 중인 게임에만 적합합니다.

# 플레이어 수락 요청
<a name="match-client-accept"></a>

플레이어 수락이 설정되어 있는 매치메이커를 사용 중인 경우 플레이어 수락 프로세스를 관리하기 위해 코드를 클라이언트 서비스에 추가합니다. 플레이어 수락을 관리하는 프로세스는 FlexMatch를 Amazon GameLift Servers 관리형 호스팅과 함께 사용하는 게임과 FlexMatch를 독립형 솔루션으로 사용하는 게임의 경우 동일합니다.

**제안된 매치에 대한 플레이어 수락 요청:**

1. **제안된 매치에 플레이어 수락이 필요할 때를 감지합니다.** 매치메이킹 티켓을 모니터링하여 상태가 `REQUIRES_ACCEPTANCE`로 변경되는 때를 감지합니다. 이 상태가 변경되면 FlexMatch 이벤트 `MatchmakingRequiresAcceptance`가 트리거됩니다.

1. **모든 플레이어로부터 수락을 취득합니다.** 매치메이킹 티켓의 모든 플레이어에게 제안된 매치 세부 정보를 제공하는 메커니즘을 생성합니다. 플레이어는 제안된 매치를 수락할지 아니면 거부할지를 나타낼 수 있어야 합니다. [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html) 호출을 통해 매치 세부 정보를 검색할 수 있습니다. 매치메이커가 제안된 매치를 철회하고 나가기 전에 플레이어가 응답할 수 있는 시간에는 제한이 있습니다.

1. **FlexMatch에 대한 플레이어의 응답을 보고합니다.** 수락 또는 거부로 [AcceptMatch](https://docs.aws.amazon.com/gamelift/latest/apireference/API_AcceptMatch.html)를 호출하여 플레이어 응답을 보고합니다. 매치가 성사되려면 매치메이킹 요청에 포함된 모든 플레이어가 매치를 수락해야 합니다.

1. **수락이 안 된 티켓을 처리합니다.** 제안된 매치의 플레이어가 매치를 거부하거나 수락 시간 제한 내에 응답하지 못하면 요청이 실패합니다. 매치를 수락한 플레이어의 티켓은 자동으로 티켓 풀로 반환됩니다. 매치를 수락하지 않은 플레이어의 티켓은 FAILURE 상태로 바뀌고 더 이상 처리되지 않습니다. 플레이어가 여러 명인 티켓의 경우 티켓에 있는 플레이어가 매치를 수락하지 않으면 티켓 전체가 실패합니다.

# 매치 연결
<a name="match-client-connect"></a>

성공적으로 구성된 매치(상태 `COMPLETED` 또는 이벤트 `MatchmakingSucceeded`)를 처리하기 위한 코드를 클라이언트 서비스에 추가합니다. 여기에는 매치의 플레이어에게 알리고 해당 게임 클라이언트에게 연결 정보를 전달하는 작업이 포함됩니다.

Amazon GameLift Servers 관리형 호스팅을 사용하는 게임의 경우 매치메이킹 요청이 성공적으로 처리되면 게임 세션 연결 정보가 매치메이킹 티켓에 추가됩니다. [DescribeMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)을 호출하여 완료된 매치메이킹 티켓을 검색합니다. 연결 정보에는 게임 세션의 IP 주소 및 포트는 물론 각 플레이어 ID에 대한 플레이어 세션 ID도 포함됩니다. [GameSessionConnectionInfo](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSessionConnectionInfo.html)에서 자세히 알아보세요. 게임 클라이언트는 이 정보를 사용하여 매치의 게임 세션에 직접 연결합니다. 연결 요청에는 플레이어 세션 ID와 플레이어 ID가 포함되어야 합니다. 이 데이터는 연결된 플레이어를 팀 할당을 포함한 게임 세션의 매치 데이터에 연결합니다([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html) 참조).

Amazon GameLift Servers FleetIQ를 비롯한 다른 호스팅 솔루션을 사용하는 게임의 경우 매치 플레이어가 적절한 게임 세션에 연결할 수 있는 메커니즘을 구축해야 합니다.

# 샘플 매치메이킹 요청
<a name="match-client-sample"></a>

다음 코드 조각은 서로 다른 여러 매치메이커에 대한 매치메이킹 요청을 빌드합니다. 설명에 따라 요청은 매치메이커의 규칙 세트에 정의된 대로 사용 중인 매치메이커가 필요로 하는 플레이어 속성을 제공해야 합니다. 제공된 속성은 규칙 세트에 정의된 동일한 데이터 형식인 숫자(N) 또는 문자열(S)을 사용해야 합니다.

```
# Uses matchmaker for two-team game mode based on player skill level
def start_matchmaking_for_cowboys_vs_aliens(config_name, ticket_id, player_id, skill, team):
    response = gamelift.start_matchmaking(
        ConfigurationName=config_name,
        Players=[{
            "PlayerAttributes": {
                "skill": {"N": skill}
            },
            "PlayerId": player_id,
            "Team": team
        }],
        TicketId=ticket_id)

# Uses matchmaker for monster hunter game mode based on player skill level
def start_matchmaking_for_players_vs_monster(config_name, ticket_id, player_id, skill, is_monster):
    response = gamelift.start_matchmaking(
        ConfigurationName=config_name,
        Players=[{
            "PlayerAttributes": {
                "skill": {"N": skill},
                "desiredSkillOfMonster": {"N": skill},
                "wantsToBeMonster": {"N": int(is_monster)}
            },
            "PlayerId": player_id
        }],
        TicketId=ticket_id)

# Uses matchmaker for brawler game mode with latency
def start_matchmaking_for_three_team_brawler(config_name, ticket_id, player_id, skill, role):
    response = gamelift.start_matchmaking(
        ConfigurationName=config_name,
        Players=[{
            "PlayerAttributes": {
                "skill": {"N": skill},
                "character": {"S": [role]},
            },
            "PlayerId": player_id,
            "LatencyInMs": { "us-west-2": 20}
        }],
        TicketId=ticket_id)

# Uses matchmaker for multiple game modes and maps based on player experience
def start_matchmaking_for_multi_map(config_name, ticket_id, player_id, skill, maps, modes):
    response = gamelift.start_matchmaking(
        ConfigurationName=config_name,
        Players=[{
            "PlayerAttributes": {
                "experience": {"N": skill},
                "gameMode": {"SL": modes},
                "mapPreference": {"SL": maps}
            },
            "PlayerId": player_id
        }],
        TicketId=ticket_id)
```