매치메이킹 #

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

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