게임 세션 가시성 및 참가 가능성
Xbox One(또는 이후 버전)의 경우, 게임 세션 및 게임 파티를 위한 가시성 및 참가 가능성 설정이 멀티 플레이어 경험에 대한 액세스를 제어합니다. 세션 참가에 대해 훌륭한 사용자 환경을 제공하고 플레이어를 게임 세션 및 파티에 초대하려면 이 설정을 이해해야 합니다.
이 항목에서는 가시성과 참가 가능성의 차이점을 검토합니다. 또한 이 항목에서는 타이틀이 소비자에게 최상의 멀티 플레이어 사용자 흐름을 제공하는 데 사용하면 좋은 특정 설정을 살펴봅니다.
게임 세션 가시성
멀티 플레이어 세션 디렉터리(MPSD) 세션 액세스는 세션 가시성 및 세션 참가 가능성 두 가지 설정에 의해 열립니다. 이 설정은 MPSD 수준에서 세션 액세스를 제한하는 데 사용할 수 있습니다.
액세스 제어의 첫 번째 측면은 세션 가시성입니다. 세션 가시성은 세션 생성 시 설정된 상수입니다.
세션 가시성은 일반적으로 세션 템플릿에서 정의되고 세션에 대한 읽기 및 쓰기 액세스 권한을 어떤 유형의 사용자에게 부여할지 결정합니다.
가시성 설정의 값은 다음과 같습니다.
Open: 모든 사용자가 세션에 대해 읽기 및 쓰기를 할 수 있습니다.
Visible: 모든 사용자가 세션에 대해 읽기를 할 수 있지만 쓰기는 가입한 예약 플레이어만 할 수 있습니다.
Private: 가입한 예약 플레이어만 세션에 대해 읽기 및 쓰기를 할 수 있습니다.
참고 항목
가시성을 "비공개"로 설정하면 초대 받은 플레이어의 join()
호출에서 재시도가 필요할 수 있습니다. 초대를 플랫폼 UI를 통해 전송하는 경우 플레이어가 세션에 예약되기 전에 다른 플레이어가 이 초대를 수신할 수 있습니다. 이러한 경합 조건으로 인해 "비공개" 세션 또는 "보이는" 세션에서 참가하는 플레이어를 예약해야 하므로 초대 받은 플레이어에 대한 join()
호출이 실패할 수 있습니다.
예약이 없는 경우 (HTTP/403) 세션에서 액세스 오류가 발생합니다. 초대된 플레이어는 join()
작업을 다시 시도해야 합니다. 그러나 재시도는 5초 간격보다 더 자주 시도해서는 안 됩니다. 플레이어를 위한 가입 흐름 도중에 경합 조건이 발생하지 않도록 타이틀에서 세션 가시성을 "공개"로 설정하는 것이 좋습니다.
게임 세션 참가 가능성
액세스 제어에 대한 두 번째 측면은 참가 가능성입니다. 세션 수명 기간 동안 동적으로 설정할 수 있으며 어떤 유형의 사용자가 세션에 참가할 수 있는지 결정합니다.
세션 참가 가능성의 값은 다음과 같습니다.
None:(기본값) 세션에 참가 자격에 제한이 없습니다.
Local: 로컬 사용자만 세션에 참가할 수 있습니다.
Followed: 로컬 사용자 및 다른 세션 멤버가 팔로우하는 사용자만 예약 없이 세션에 참가할 수 있습니다.
세션 중재자 또는 호스트는 참가 가능성 설정을 통해 "비공개" 세션을 만들 수 있습니다. 즉 참가 가능성을 local 또는 followed로 설정하여 게임 세션에 대한 액세스를 제한하고 세션을 비공개 상태로 만들 수 있습니다.
뿐만 아니라 세션 중재자 또는 호스트는 세션의 참가 가능성을 추적하여 필요한 경우 이전 세션 초대가 호스트 수준에서 거부될 수 있게 해야 합니다. 예를 들어, 초대된 플레이어가 세션이 이미 가득 찰 때까지 세션이나 파티에 참가하지 않은 경우, 중재자 또는 호스트는 참가 중인 플레이어에게 세션이 잠겼음을 알릴 수 있습니다. 세션 또는 파티를 자동으로 나가야 합니다.
참고 항목
파티 앱 UI에는 게임 세션 참가 가능성이 반영되지 않습니다. 참가 가능성이 제한되더라도 파티 앱 초대 UI 및 ShowSendInvitesAsync
에서 게임 세션 초대를 허용합니다.
게임 파티 참가 가능성
타이틀은 MPSD 세션 제어뿐 아니라 게임 파티 참가 가능성 상태에 대한 제어 권한도 있습니다. 이 설정을 사용해 파티 수준에서 게임 파티 액세스를 제한할 수 있습니다.
게임 파티가 생성되면 파티 참가 가능성을 동적으로 변경할 수 있습니다. 게임 파티의 참가 가능성 상태는 파티 초대 UI에 반영됩니다.
조인 가능성 상태는 다음으로 설정할 수 있습니다.
Invite-only: 이렇게 설정하면 초대가 있어야 게임 파티에 참가할 수 있습니다.
Joinable by Friends:(기본값) 이렇게 설정하면 친구 관계인 플레이어만 게임 파티에 참가할 수 있습니다(파티에 참가하려면 파티 멤버가 참가하는 플레이어를 팔로우해야 함).
참가 가능성은 초대 전용 게임 파티를 만들기 위해 사용할 수 있습니다. 파티에 대한 액세스를 제한하고 그 플레이어가 참가 초대를 받도록 하려면, 참가 가능성을 "초대 전용"으로 설정해야 합니다.
참고 항목
파티 참가 가능성은 세션 참가 가능성에 영향을 주지 않습니다. 그러나 파티 참가 가능성은 파티 앱 UI에 반영됩니다. 플레이어는 타이틀 밖의 파티 앱에서 수동으로 파티 참가 가능성을 변경할 수 있습니다.
추천 사항
다음 권장 사항은 가장 일반적인 타이틀 시나리오에 적용됩니다. 타이틀은 가급적 이러한 설정을 따라야 하고, 타이틀 내 논리를 사용하여 새 플레이어가 세션에 참가 가능한지에 대해 최종적이고 권한 있는 결정을 내려야 합니다.
권장되는 게임 세션 가시성은 open입니다.
공개 게임 세션에는 플레이어 예약이 필요하지 않습니다. 이렇게 하면 초대에 대한 흐름이 간소화됩니다.
세션 중재자 또는 호스트는 초대를 보낸 후에는 세션 문서에 플레이어를 예약하지 않습니다. 그 대신에 세션 중재자 또는 호스트는 초대 받은 플레이어에 대한 로컬 추적만 수행합니다. 이를 통해 플레이어는 즉시 호스트와 연결하여 세션에 참가해야 하는지, 참가가 거부되어야 하는지, 대기해야 하는지(대기 중인 플레이어가 지원되는 경우) 여부를 결정할 수 있습니다.
중재자 또는 호스트가 최종 권한을 보유하고, 세션에 머물지 또는 떠날지에 대해 응답하고 새 멤버에게 지시합니다.
참고 항목
이를 위해서는 최종 결정이 내려지기 전에 초대 받은 플레이어가 타이틀을 실행하고 중재자 또는 호스트와 연결해야 합니다. 세션이 가득 차거나 초대가 거부된 경우 사용자에게 오류 메시지를 표시하는 것이 허용됩니다.
참고 항목
중재자 또는 호스트와의 연결을 설정하려면 보안 장치 주소가 필요합니다. 어떤 세션 멤버가 세션의 현재 중재자 또는 호스트이고, 초대 받은 플레이어가 연결해야 할 보안 장치 주소인지 표시하려면 세션의 HostDeviceToken
을(를) 사용해야 합니다.
권장되는 게임 세션 참가 가능성: 기본값(설정하지 않음)
현재 게임 세션 참가 가능성은 파티 앱 UI에 영향을 주지 않고 사용자에게 노출되지 않습니다. 타이틀 흐름을 간소화하려면 게임 참가 가능성을 기본값으로 유지해야 하고 모든 참가 권한은 중재자 또는 호스트를 통해 처리해야 합니다.
권장되는 게임 파티 참가 가능성
게임 파티 참가 가능성은 타이틀이 사용자에게 제공하려고 하는 세션의 유형에 따라 달라집니다.
두 가지 시나리오는 다음과 같습니다.
오픈 게임: 오픈 게임의 경우 게임 파티 참가 가능성은 기본값인 "친구 참가 가능"으로 유지해야 합니다. 이렇게 하면 친구가 초대 없이 게임 파티(및 확장, 게임 세션)에 참가할 수 있습니다.
프라이빗 게임: 프라이빗 또는 비공개 게임의 경우 게임 파티 참가 가능성을 "초대 전용"으로 설정해야 합니다. 이렇게 하면 다른 플레이어가 초대 없이 파티(및 확장, 게임 세션)에 참가할 수 없습니다.
참고 항목
플레이어는 파티 앱을 통해 게임 세션의 참가 가능성을 수동으로 변경할 수 있습니다.
두 가지 게임 유형 모두에 대해 중재자 또는 호스트는 세션에 누구를 받아들여야 할지 결정할 수 있는 최종 권한을 여전히 유지해야 합니다. 이를 통해 게임 흐름을 공개에서 비공개로 전환함으로 인해 발생할 수 있는 모든 경합 조건에 대처할 수 있습니다. 중재자 또는 호스트가 플레이어를 거부하는 경우 거부된 타이틀 인스턴스는 세션에서 플레이어를 제거하고 게임 내 UI를 표시하여 플레이어가 파티를 떠날 수 있게 해야 합니다.
최대 세션 크기
세션의 최대 멤버 크기를 사용해 게임 세션에 참가하는 플레이어의 수를 제한할 수 있습니다.
그러나 이 제한으로 인해 특정 연결 해제 시나리오 중에 빈 슬롯이 여전히 가득 찬 것으로 표시될 수 있습니다. 예를 들어 플레이어가 네트워크 또는 전원 오류로 인해 연결이 끊어지면 지연이 세션에 즉시 반영되지 않습니다.
프레즌스 서비스가 연결 끊기를 감지하는 즉시(최대 20초) 멤버가 비활성 상태로 설정됩니다. 그러면 비활성 시간 제한이 만료된 후 플레이어가 제거됩니다.
이에 반해 하트비트를 사용하여 연결 해제를 감지하는 피어 메시는 2-3초 내에 연결 해제를 인지하는 경우가 많고 즉시 플레이어 슬롯을 열 수 있습니다. 하지만 중재자 또는 호스트는 다른 멤버를 제거할 수 없습니다.
이 문제를 해결하려면 세션의 최대 멤버 크기가 타이틀에서 실제로 지원하는 플레이어의 최대 수보다 항상 크도록 설정해야 합니다. 예를 들어 플레이어 번호가 8이면 타이틀은 최대 세션 크기를 12로 설정해야 합니다. 이런 방식으로, 이전 플레이어의 시간이 초과되지 않아도 새로운 플레이어가 참가할 수 있습니다.
중재자 또는 호스트는 세션이 꽉 찼는지 확인한 다음, 새 플레이어가 참가할 수 있는지 여부(IsFull
: "true")를 결정하는 사용자 지정 세션 속성을 설정합니다.
이렇게 하여 세션이 참가 가능한 경우 플레이어 참가를 빠르게 점검할 수 있습니다.
또한, 중재자 또는 호스트는 인덱스를 사용하여 멤버의 시간이 초과된 것을 의미하는 사용자 지정 속성을 유지해야 합니다(예를 들어, TimedOutPlayers
: "3, 5, 9").
이렇게 하여 새로운 플레이어가 현재 세션 멤버를 올바르게 식별할 수 있습니다.
대기 플레이어에게 알리기
타이틀은 게임 파티뿐 아니라 대기 중인 플레이어 목록을 관리하여 대기 플레이어를 지원할 수 있습니다. 플레이어가 호스트에 연결하고 게임 세션이 가득 차 있는 경우 플레이어는 호스트의 내부 대기 목록에 추가됩니다.
대기 중인 플레이어는 게임 세션에 참가하지는 않지만 게임 파티에 그대로 유지됩니다. 이 때 네트워크 트래픽을 최소화하기 위해 대기 플레이어와 호스트 연결을 끊습니다.
게임 세션의 슬롯이 대기 플레이어를 위해 열리면, 중재자 또는 호스트는 XblMultiplayerSessionAddMemberReservation을 호출하여 이 플레이어를 위한 예약을 추가합니다.
이 시점에서 대기 중인 플레이어는 아직 이 예약을 인식하지 못합니다. 결과적으로 중재자 또는 호스트는
PullReservedPlayersAsync
메서드를 호출해야 합니다. 이로 인해 알림 구성 및 타이틀 포커스 상태에 따라 예약된 모든 플레이어에게 UI 알림 또는GameSessionReady
알림이 발생됩니다.이 알림이 수신되면 새로운 플레이어는 호스트에 다시 연결되고, 새로운 플레이어는 세션에 참가합니다.
또는 플레이어가 호스트에 연결된 상태를 유지할 수 있고 호스트가 플레이어에게 슬롯을 사용할 수 있다는 것을 알리면 플레이어는 세션에 참가할 수 있습니다. 그러나 이 흐름에서는 타이틀 외부의 UI 알림을 표시할 수 없습니다.
참고 항목
타이틀이 일시 중단되거나 종료되면 플레이어가 게임 파티에서 자동으로 제거됩니다. 플레이어는 더 이상 알림을 받지 않습니다.
클라이언트 멀티 플레이어 흐름