Unity Gaming Services Samples - Game Lobby Sample 에 대해서 알아보자
오늘은 Unity Gaming Services Samples의 두번째 시간입니다.
Game Lobby Sample에 대해서 살펴보도록 하겠습니다.
먼저 github 주소 입니다.
GitHub - Unity-Technologies/com.unity.services.samples.game-lobby: A sample showcasing a minimal implementation of a lobby exper
A sample showcasing a minimal implementation of a lobby experience using the Lobby and Relay packages. - GitHub - Unity-Technologies/com.unity.services.samples.game-lobby: A sample showcasing a min...
github.com
영문을 한글로 번역한 내용입니다.
게임 로비 샘플
PC 및 Mac용 Unity 2020.3으로 테스트했습니다.
이 샘플은 로비 및 릴레이 패키지를 사용하여 일반적인 게임 로비 경험을 만드는 방법을 보여줍니다. Vivox 음성 채팅도 포함됩니다. 플레이어는 공개 로비 목록 또는 로비 코드를 사용하여 다른 플레이어가 참여할 수 있는 로비를 호스팅한 다음 Relay와 연결하여 Unity Transport("UTP")를 사용하여 기본 실시간 통신을 할 수 있습니다. 릴레이를 사용하면 연결 익명성을 유지하면서 플레이어가 서로 안전하게 통신할 수 있습니다. 로비에 연결하면 오디오 입력 장치를 사용할 수 있는 한 Vivox에도 연결되어 음성 채팅이 가능합니다.
참고 : 이것은 "끌어서 놓기" 솔루션이 아닙니다. 게임 로비 샘플은 전체 프로젝트에 완전히 복사하기 위한 최소 코드 샘플이 아닙니다. 그보다는 몇 가지 기본적인 게임 로직 및 인프라를 사용하여 수직 슬라이스에서 여러 서비스를 사용하는 방법을 보여줍니다. Lobby와 Relay가 함께 작동하는 방법과 프로젝트에 통합하는 방법을 배우기 위한 참조 및 시작점으로 사용하십시오.
특징:
- 익명 인증 로그인 : 영구 계정 없이 플레이어 자격 증명을 추적합니다.
- 로비 생성 : 플레이어는 다른 사람들이 참여할 수 있는 로비를 주최합니다.
- 로비 쿼리 : 필터가 있는 로비 목록을 찾거나 로비 코드를 사용합니다.
- 릴레이 난독화 : 로비에 있는 플레이어는 익명의 IP를 통해 연결됩니다.
- UTP 통신 : 플레이어는 실시간으로 로비 구성원에게 기본 데이터를 전송합니다.
- 로비 + 릴레이 연결 관리 : 서비스가 함께 새로운 연결 및 연결 해제를 자동으로 처리합니다.
- Vivox Voice : 사용자별 볼륨 제어 및 음소거를 통해 음성 통신이 가능하도록 로비용 음성 채널을 만듭니다.
서비스 조직 설정
Unity의 멀티플레이어 서비스를 사용하려면 프로젝트에 대한 클라우드 조직 ID가 필요합니다. 현재 조직이 없는 경우 새 조직을 만드는 방법 을 따르십시오 . 클라우드 조직 설정 문서:
https://support.unity.com/hc/en-us/articles/208592876-How-do-I-create-a-new-Organization-
ID가 있으면 편집 > 프로젝트 설정 > 서비스 에서 프로젝트에 연결 하고 Unity 대시보드를 사용하여 프로젝트 서비스를 관리합니다.
서비스 개요
Lobby
로비 서비스를 통해 개발자는 실시간 네트워크 연결이 설정되기 전에 로비를 만들고 플레이어 간에 데이터를 공유할 수 있습니다. 릴레이와 같은 다른 서비스에 사용자를 연결하는 첫 번째 단계를 단순화하고 플레이어가 다른 로비를 찾을 수 있는 도구를 제공합니다.
로비 문서에는 서비스에 대한 코드 샘플과 추가 정보가 포함되어 있습니다. 여기에는 추가 코드 샘플과 함께 로비 사용에 대한 포괄적인 세부 정보가 포함되어 있으며 게임 로비 샘플을 더 잘 이해하는 데 도움이 될 수 있습니다. http://documentation.cloud.unity3d.com/en/articles/5371715-unity-lobby-service
로비 서비스는 Unity 대시보드에서 관리할 수 있습니다.
https://dashboard.unity3d.com/lobby
Relay
릴레이 서비스는 난독화된 호스트 IP를 사용하여 호스트-클라이언트 모델의 플레이어를 연결합니다. 이를 통해 플레이어는 릴레이 자체와 개인 정보만 공유하면서 직접 연결된 것처럼 네트워크 경험을 호스팅할 수 있습니다. \
Relay 설명서에는 서비스에 대한 코드 샘플과 추가 정보가 포함되어 있습니다. 여기에는 추가 코드 샘플과 함께 Relay 사용에 대한 포괄적인 세부 정보가 포함되어 있으며 게임 로비 샘플을 더 잘 이해하는 데 도움이 될 수 있습니다.
http://documentation.cloud.unity3d.com/en/articles/5371723-relay-overview
릴레이 서비스는 Unity 대시보드에서 관리할 수 있습니다.
https://dashboard.unity3d.com/relay
이 샘플에서는 플레이어가 로비에 연결되면 릴레이를 통해 연결되어 UTP를 통한 실시간 데이터 전송을 설정합니다. 로비와 릴레이 모두 자격 증명에 대한 인증에 의존합니다. 이 샘플은 Auth의 익명 로그인 기능을 사용하여 각 플레이어에 고유하지만 개발자가 영구 계정을 유지할 필요가 없는 반영구적 자격 증명을 생성합니다. \
Vivox
The Vivox Service는 인앱 커뮤니케이션을 위한 플레이어 음성 및 문자 채팅방을 제공합니다. 또한 공간 오디오 및 채팅 전사와 같은 유용한 기능을 제공합니다.
Vivox 설명서에는 서비스에 대한 코드 샘플과 추가 정보가 포함되어 있습니다. 여기에는 추가 코드 샘플과 함께 Vivox 사용에 대한 포괄적인 세부 정보가 포함되어 있으며 게임 로비 샘플을 더 잘 이해하는 데 도움이 될 수 있습니다. https://docs.vivox.com/v5/general/unity/5_15_0/en-us/Default.htm
Vivox는 Unity 대시보드에서 관리할 수 있습니다: https://dashboard.unity3d.com/vivox
Setup
Unity 대시보드의 로비 및 릴레이 섹션에는 자체 설정 지침이 포함되어 있습니다. 정보 및 지원 > 시작하기 를 선택 하고 제공된 단계에 따라 서비스를 프로젝트에 통합합니다.
이러한 서비스를 설정하고 프로젝트를 클라우드 조직에 연결한 상태 에서 에디터에서 mainScene 장면을 열고 게임 로비 샘플을 사용하기 시작합니다.
샘플 실행
전체 샘플 기능을 시연하려면 두 명의 "플레이어"가 필요합니다. 플레이 모드에서 에디터와 함께 실행할 독립 실행형 빌드를 만듭니다. Auth가 머신의 레지스트리를 사용하여 익명의 자격 증명을 생성하더라도 에디터와 빌드는 서로 다른 레지스트리 항목을 생성하기 때문에 서로 다른 자격 증명을 갖습니다.
로비 참가 메뉴

로비 참여 메뉴에는 공개 로비 목록 또는 로비 코드를 사용하여 플레이어가 서로 연결할 수 있는 허브 역할을 하는 로비 목록 UI가 포함되어 있습니다.
A . 공개 로비 목록 : 비공개로 설정되지 않은 모든 로비를 보여줍니다. 로비에는 공개 및 비공개 가시성으로 설정할 수 있는 개발자 정의 데이터가 포함되어 있습니다. 로비 서비스는 "좀비" 방을 정리하여 이 목록에 나타나지 않도록 합니다. 이 샘플의 경우 로비 이름과 플레이어 수가 표시되며 "게임 내" 상태의 로비는 표시되지 않습니다. 로비를 선택한 다음 참가 를 선택할 수 있습니다 .
B . 새로 고침 아이콘 : 로비 목록을 새로 고칩니다. 로비 서비스는 스팸을 방지하기 위해 모든 API 호출에 속도 제한을 적용합니다. 속도 제한 내에서 새로 고침을 시도하면 아무 작업도 수행되지 않습니다(약 1.5초마다, 자세한 내용은 로비 설명서 참조).
C . 필터: 특정 색상의 서버만 표시되도록 로비 목록을 설정합니다. 로비 서비스는 공개 가시성으로 설정된 데이터를 기준으로 모든 쿼리를 필터링할 수 있습니다. 이 샘플의 경우 플레이어는 로비에 대해 호스트가 설정한 색상별로 선택적으로 필터링할 수 있습니다.
D . 빠른 참여 버튼 : 목록에서 필터와 일치하는 첫 번째 사용 가능한 로비에 참여합니다.
E . 로비 코드 필드 : 기존 로비의 로비 코드를 입력합니다. 공개 로비 목록 외에도 모든 로비는 해당 코드를 사용하여 참여할 수 있습니다. 이를 통해 플레이어는 로비에 대한 액세스 권한을 비공개로 공유할 수 있습니다.
F . 가입하다: 공개 로비 목록 선택 또는 로비 코드로 참여를 요청합니다. 플레이어가 버튼을 반복해서 누르면 스팸을 방지하기 위해 실패한 요청도 비율이 제한됩니다.
G . 만들기 : 새로운 로비를 생성할 수 있습니다. 플레이어는 로비 이름과 개인 로비를 만들지 여부를 선택하고 새 로비에 호스트로 연결합니다.
H . 플레이어 이름 : 플레이어 이름을 표시하고 이름을 변경할 수 있습니다. 기본적으로 플레이어는 익명의 인증 자격 증명을 기반으로 이름이 할당되지만 모든 플레이어가 새 이름을 볼 수 있도록 이름 변경은 자격 증명을 따릅니다.
로비 전망

로비 보기 UI는 로비에 있는 모든 플레이어의 로비 및 릴레이 정보를 표시합니다. 새로운 플레이어가 합류하면 즉시 호스트에 연결하기 시작하며, 그 후 다른 로비 구성원과 감정 표현 및 상태 변경 사항을 동기화합니다.
A . 로비 이름 : 로비 생성 시 설정되며 변경할 수 없습니다.
B . 로비 코드 : 로비 서비스에서 생성한 공유 가능한 코드입니다. 이것은 다른 플레이어가 이 로비에 참여할 수 있도록 외부적으로 제공될 수 있습니다.
C . 로비 사용자 : 로비에 있는 플레이어입니다. 플레이어의 이름, 상태 및 이모티콘이 표시됩니다. 이 데이터는 Relay + UTP를 통해 동기화되므로 플레이어가 변경한 사항은 연결된 모든 플레이어에게 즉시 나타납니다. 들어오는 플레이어는 연결되면 현재 데이터가 전송됩니다.
D . 이모티콘 : 플레이어의 이모티콘과 사용자가 마이크를 연결한 경우 음성 채팅 컨트롤을 표시합니다.
E. Vivox 음성 제어 : 오디오 아이콘을 클릭하면 해당 사용자를 음소거/음소거 해제합니다.
F . Relay IP : Relay가 생성하는 익명의 서버 IP. 이것은 플레이어에게 표시될 필요가 없으며 단순히 릴레이가 작동 중임을 나타내기 위해 여기에 표시됩니다.
G . Relay Code : Relay 연결 시 사용하는 Relay 가 생성한 내부 Join 코드. 이것은 플레이어에게 표시될 필요가 없으며 단순히 릴레이가 작동 중임을 나타내기 위해 여기에 표시됩니다.
H . 이모티콘 버튼: : 플레이어의 이모티콘을 설정하고 UTP를 사용하여 동기화됩니다.
I . 로비 색상: (호스트만 해당) 로비 목록에서 필터링할 로비 색상을 설정합니다. 이것은 로비를 통해 동기화되므로 로비 쿼리는 속도 제한이 있기 때문에 모든 플레이어에게 변경 사항이 즉시 표시되지는 않습니다. 속도 제한을 참조하십시오.
J . 준비 버튼 : 플레이어의 준비 상태를 설정합니다. 모든 플레이어가 준비되면 호스트는 "게임 내" 상태로 카운트다운을 시작하고 로비는 공개 로비 목록에서 숨겨집니다.
Architecture
게임 로비 샘플은 멀티플레이어 로비의 수직 조각으로 설계되었으므로 전체 게임 제작에서 예상할 수 있는 추가 인프라와 여러 서비스가 함께 작동할 수 있도록 하는 일부 구성 요소가 있습니다. 따라서 필요에 따라 모든 코드베이스가 관련이 있는 것은 아닙니다. 대부분의 콘텐츠는 자체 문서화되지만 일부 상위 수준 요점은 다음과 같습니다.
- Auth, Lobby 및 Relay 서비스를 사용하기 위한 로직은 자체 디렉토리에 캡슐화되어 있습니다. API 사용의 대부분은 편의를 위해 추상화되어 있습니다.
- 예를 들어 LobbyAPIInterface 에는 Lobby API에 대한 실제 호출이 포함되어 있지만 LobbyAsyncRequests 에는 이러한 호출 결과에 대한 추가 처리와 API 호출 타이밍에 필요한 일부 구조가 있습니다.
- Relay 디렉토리에는 UTP(Unity Transport)를 사용하기 위한 로직도 포함되어 있습니다.
- Game 디렉토리에는 게임 의 간단한 프레임워크를 나타내는 샘플 자체를 실행하기 위한 핵심 "접착제" 클래스가 포함되어 있습니다.
- GameManager 에는 샘플 실행을 위한 모든 핵심 로직이 있습니다. 서비스와 UI를 설정하고 게임 상태를 관리하며 다른 구성 요소의 메시지를 입력합니다.
- 샘플의 여러 구성 요소 상태를 유지 관리하고 로비 및 릴레이 데이터에 대한 샘플의 요구 사항과 서비스에서 원격으로 해당 데이터 구조 간의 인터페이스를 위해 다양한 다른 클래스가 있습니다.
- Infrastructure 디렉토리에는 특정 서비스가 아닌 전체 기능과 관련된 필수 작업에 사용되는 클래스가 포함되어 있습니다 .
- 로케이터 는 서비스 로케이터 패턴을 모방하여 싱글톤일 수 있는 동작을 쉽게 교체할 수 있습니다.
- Messenger 는 관련 없는 클래스를 분리된 상태로 유지하는 데 사용되는 간단한 메시징 시스템을 만들어 흥미로운 일이 발생할 때 임의의 리스너에게 대신 메시지를 보낼 수 있도록 합니다. 예를 들어 로비가 업데이트되거나 플레이어가 릴레이에서 연결을 끊습니다.
- 관찰자 패턴 은 모든 UI 요소와 원격 로비 및 릴레이 데이터의 로컬 복사본에 사용됩니다. Observer는 관찰된 데이터가 변경될 때마다 경고를 받으며 해당 데이터의 소유자는 누가 관찰하고 있는지 알 필요가 없습니다.
- UI 디렉토리에는 샘플 UI에 대한 로직과 관련 데이터 관찰이 엄격하게 포함되어 있습니다 . 서비스 자체를 사용하는 방법을 이해하기 위해 이러한 파일을 볼 필요는 없지만 Observer 패턴의 사용을 보여줍니다.
- 단순히 ObserverBehaviour 를 구현하는 클래스와 함께 여러 파일이 존재합니다 . Unity는 MonoBehaviours 가 동일한 이름의 파일에 존재 해야 하기 때문 입니다.
- UI의 대부분은 가시성을 위해 CanvasGroup 알파 에 의해 구동됩니다 . 즉, 일부 동작은 플레이어에게 보이지 않는 경우에도 계속 실행됩니다.
- 여러 테스트 디렉토리가 포함되어 일부 코드에 대한 핵심 동작과 엣지 케이스를 보여줍니다. 특히 로비 및 릴레이에 대한 플레이 모드 테스트를 사용하여 서비스에 대한 연결이 올바르게 작동하는지 확인할 수 있습니다. ( 창 > 일반 > 테스트 실행기에서 액세스할 수 있는 테스트 실행기를 사용하여 테스트를 실행합니다 .)
- Editor에서 프로젝트 자산은 샘플 개발 중에 변경할 때 편의를 위해 중첩된 프리팹으로 나뉩니다. 직렬화되는 이벤트 핸들러에 의존하는 UI 요소가 있기는 하지만 세부 정보가 중요한 것으로 간주되어서는 안 됩니다.
고려 사항
게임 로비 샘플은 로비 및 릴레이 서비스의 최소한의 구현 이상을 나타내지만 포괄적이지 않으며 더 빠르고 읽기 쉬운 개발을 위해 일부 디자인 결정이 내려졌습니다.
- Lobby 및 Relay를 사용하는 모든 작업은 비동기 API 호출에 의존합니다. 샘플 코드에는 임의의 시간에 결과를 수신할 때 발생할 수 있는 문제를 처리하기 위한 몇 가지 논리가 있지만 설정 및 정리 중에 사용자가 시작하는 호출을 대기열에 넣는 논리는 없습니다. 로비에 들어가고 나갈 때 신속한 작업으로 인해 예기치 않은 동작이 발생할 수 있습니다.
- 릴레이는 호스트 마이그레이션을 지원하지 않지만 로비는 지원합니다. 로비 호스트의 연결이 끊어지면 로비가 연결 해제를 감지할 때까지 로비가 클라이언트에게 계속 작동하는 것처럼 보일 수 있습니다. 실제로 데이터가 빠르게 동기화되지 않을 수 있는 경우 호스트와 클라이언트 간에 주기적으로 추가 핸드셰이크를 구현하고자 할 수 있습니다.
- 샘플은 연결을 유지하기 위해 로비 및 릴레이를 사용하여 하트비트 핑을 설정하지만 로비 기간에 제한을 두지 않습니다. 최대 게임 시간과 같이 실제 사용 시 최대 지속 시간을 고려하십시오.
- HTTP 오류가 콘솔에 나타납니다. 이는 다양한 이유로 로비 및 릴레이 API 호출에 의해 반환됩니다. 일반적으로 샘플 실행에는 영향을 미치지 않지만 이러한 오류가 발생할 때 샘플에서 설명 UI를 제공하지 않기 때문에 플레이어에게 예기치 않은 동작이 발생할 수 있습니다.
- HTTP 오류 목록:
- 404("Not Found") 오류 는 로비 서비스가 일반적으로 로비를 나갈 때 들어오는 여러 API 호출을 임의의 순서로 처리할 때 발생할 수 있습니다. 삭제되었지만 새로 고침하기 전에 로비 목록에 계속 표시되는 것과 같이 잘못된 로비에 참여하려고 하는 경우에도 발생합니다.
- 429("Too Many Requests") 오류 는 속도 제한 작업이 너무 빨리 발생하면 발생합니다. 특히 로비 목록을 너무 빨리 새로 고치면 QueryLobbiesAsync 호출에서 429 오류가 발생합니다. 자세한 내용은 로비 문서를 참조하십시오.
- 401("Unauthorized") 오류 는 모든 로비 및 릴레이 작업에 인증 자격 증명이 필요하기 때문에 인증 로그인이 완료되기 전에 사용자가 로비 메뉴에 들어가면 발생합니다.
- 409("Conflict") 오류 는 플레이어가 다른 플레이어와 동일한 자격 증명을 사용하여 로비에 참여하려고 하면 발생합니다. 특히, 여러 독립 실행형 빌드를 사용하여 테스트하려는 경우 이러한 문제가 발생합니다. 이러한 빌드는 시스템에서 동일한 레지스트리 항목을 공유하기 때문입니다. 한 컴퓨터에서 3명 이상의 플레이어로 테스트하려면:
- 동일한 자산을 사용하도록 원본 **Assets **및 Packages 에 대한 심볼릭 링크가 있는 복제 프로젝트를 만듭니다 . ProjectSettings 도 복사 하지만 원본에 연결하지 마십시오. 심볼릭 링크를 만드는 프로세스는 운영 체제에 따라 다릅니다.
- 두 번째 편집기에서 이 프로젝트를 엽니다.
- 편집 > 프로젝트 설정 > 플레이어 에서 제품 이름 을 수정합니다 . 이로 인해 중복 프로젝트에 새 레지스트리 항목이 생기므로 Auth가 새 자격 증명을 할당합니다.
- 재생 모드 또는 독립 실행형 빌드에서 샘플을 실행하면 원본과 다른 기본 플레이어 이름이 할당되는지 확인합니다. 이는 409 오류를 방지하는 다른 인증 자격 증명을 나타냅니다.
- HTTP 오류 목록:
이제 Github 소스를 다운받아 실행해 보도록 하겠습니다.

이제 유니티로 프로젝트를 열어봅니다.
Package Manager 에서 프로젝트를 연결합니다.

Project Setting 창에서 Dashboard를 클릭하면 Unity Dashboard로 이동합니다.

3번 스탭에서 Lobby를 On으로 변경합니다.

그다음 vivox도 설정합니다.

vivox 설정에서 3번 스탭을 잘 설정해야 합니다.

탐색기에서 프로젝트 폴더->Packages->manifest.json 파일을 열어봅니다.

그리고 유니티에서 vivox Environment를 Automatic으로 변경합니다.

실행을 해보겠습니다.

플레이 영상입니다. 감상해 보시죠..