View as Markdown

매치메이킹

많은 멀티플레이어 게임의 핵심 기능은 임의의 상대방을 찾아 플레이하는 기능입니다.

Nakama는 다른 온라인 플레이어를 알고 있기 때문에 플레이어 간의 대결을 주선하는 가장 좋은 장소입니다. Nakama 매치메이킹 기능은 대결 생성 및 관리를 단순화하므로 인프라를 직접 구축할 필요가 없습니다.

서버 측 설정 #

Nakama는 클라이언트에서 플레이어가 제출한 티켓을 폴링하여 서버 측에서 매치메이킹을 처리합니다. 이러한 티켓에는 일반적으로 플레이어와 이들이 찾고 있는 대결 유형에 대한 정보가 포함되어 있습니다.

먼저, 들어오는 티켓을 수락할 수 있도록 서버에서 매치메이킹 설정을 지정해 보겠습니다. 서버가 대결 요청을 처리하는 방법과 관련하여 변경할 수 있는 세 가지 옵션이 있습니다:

  • max_tickets: 플레이어(또는 그룹)가 한 번에 제출할 수 있는 총 티켓 수를 제한합니다.
  • interval_sec: 새로운 대결을 만들기 위한 각 시도 사이의 시간(초)을 변경합니다. 간격이 짧을수록 대기 시간이 짧으며 요청을 처리하기 위해 더 많은 서버 리소스가 필요할 수 있습니다.
  • max_intervals: 최소 플레이어 제한을 사용하기 전에 최대 플레이어 제한 상태에서 시도하는 횟수를 설정합니다.

이는 모두 플레이어가 변경할 수 없는 서버 설정입니다. 이러한 옵션을 구성하기 위해 구성 파일을 생성합니다.

Pirate Panic에서 구성 파일은 local.yml이지만 게임에서는 원하는 대로 지정할 수 있습니다. 구성 파일 내에서 매치메이커 섹션을 생성합니다:

local.yml

1
2
3
4
matchmaker:
  max_tickets: 2
  interval_sec: 15
  max_intervals: 3

매개변수의 전체 목록과 서버 구성의 다른 부분에 대한 기본값은 문서를 참조하세요.

대결 요청 #

요청을 처리하도록 서버를 설정했으므로 플레이어가 AddMatchmakerAsync을(를) 사용하여 티켓을 생성하도록 만들 수 있습니다:

1
2
3
4
5
6
_ticket = await _connection.Socket.AddMatchmakerAsync(
    query: "*",
    minCount: 2,
    maxCount: 2,
    stringProperties: null,
    numericProperties: null);

이 티켓은 전체 플레이어가 2명 뿐인 대결(* 와일드카드 쿼리)을 찾는 플레이어를 나타냅니다. 속성이 일치하는 특정 플레이어를 찾기 위해 쿼리를 제한할 수도 있습니다. 예를 들어 유럽 내 플레이어와만 대결하려면 query = "+region:europe"을(를) 만들 수 있습니다. 더 많은 예는 매치메이커 문서를 참조하세요

stringPropertiesnumericProperties은(는) 매치메이커와 함께 사용할 사용자 데이터(예: 이름, 지역 또는 순위)를 저장하는 데 사용할 수 있습니다. 기본 설정이 없기 때문에 이 예에서는 이 null을(를) 그대로 둘 수 있습니다.

대결이 아직 발견되지 않은 경우 플레이어에게 매치메이킹 요청을 취소할 수 있는 옵션을 제공하려면 AddMatchmakerAsync에서 반환된 티켓에 RemoveMatchmakerAsync을(를) 사용합니다:

1
await _connection.Socket.RemoveMatchmakerAsync(_ticket);

대결 참여 #

서버는 티켓이 제출되면 매치메이킹을 처리하고, 새로운 대결을 찾았을 때 대결에 참여한 모든 플레이어를 새로운 대결로 지정합니다.

클라이언트 측에서 작동되도록 콜백 함수를 등록하여 장면을 전환하거나 대결 참여를 위해서 게임을 준비할 수 있습니다:

1
2
3
4
5
6
7
8
9
_connection.Socket.ReceivedMatchmakerMatched += OnMatchmakerMatched;
...
private void OnMatchmakerMatched(IMatchmakerMatched matched)
{
    ...
    _connection.Socket.ReceivedMatchmakerMatched -= OnMatchmakerMatched; // Unregister callback function

    SceneManager.LoadScene(GameConfigurationManager.Instance.GameConfiguration.SceneNameBattle); // Switch scene to battle scene
}

이 경우, ReceivedMatchmakerMatched은(는) 서버가 상대방을 발견한 경우 자동으로 발화되는 등록 후크입니다.

다음 주제 #

실시간 멀티플레이어

Related Pages