게임 로비 샘플
Explore a sample project demonstrating how to use Lobby and Relay, along with Vivox, to create a typical multiplayer game lobby experience.
읽는 시간 2분최근 업데이트: 11시간 전
본 샘플은 Lobby 및 Relay 패키지를 사용하여 일반적인 게임 로비 경험을 생성하는 방법을 보여 줍니다. 또한 Vivox Voice 채팅 기능이 포함되어 있습니다. 플레이어는 공개 로비 목록이나 로비 코드를 사용하여 다른 플레이어가 참여할 수 있는 로비를 호스팅한 후 Relay와 연결한 다음, UTP(Unity Transport)를 사용해 플레이어 간의 기본적인 실시간 커뮤니케이션을 진행할 수 있습니다. Relay를 사용하면 플레이어가 연결에서 익명성을 유지하면서 서로 간에 안전하게 커뮤니케이션할 수 있습니다. 또한 로비 연결이 완료되면 Vivox에 연결하여 음성 채팅을 활성화할 수 있습니다. 그러려면 오디오 입력 기기가 사용 가능한 상태여야 합니다.
기능
- 익명 Auth 로그인: 영구 계정이 없는 플레이어 자격 증명을 트래킹합니다.
- 로비 생성: 플레이어는 다른 플레이어가 참여할 로비를 호스팅합니다.
- 로비 쿼리: 필터링으로 로비 목록을 찾거나 로비 코드를 사용합니다.
- Relay 난독화: 로비에 있는 플레이어는 익명 IP를 통해 연결됩니다.
- UTP 커뮤니케이션: 플레이어는 실시간으로 로비 멤버에게 기본 데이터를 전송합니다.
- Lobby 및 Relay 연결 관리: 두 서비스는 자동으로 새 연결과 연결 해제를 처리합니다.
- Vivox Voice: 사용자별 볼륨 제어 및 음소거를 사용하여 음성 커뮤니케이션을 활용할 수 있도록 로비에서 사용할 음성 채널을 생성합니다.
서비스 조직 설정
Unity의 멀티플레이어 서비스를 사용하려면 프로젝트에 클라우드 조직 ID가 필요합니다. 현재 조직 ID가 없는 경우 새로운 조직은 어떻게 만드나요? 문서를 참고하여 클라우드 조직을 설정하십시오. ID를 보유하고 있다면 Edit > Project Settings > Services에서 프로젝트에 연결하고 Unity Dashboard를 사용해 프로젝트 서비스를 관리하십시오.서비스 개요
Lobby
Lobby 서비스를 사용하면 실시간 네트워크 연결이 설정되기 전에 개발자가 로비를 생성하고 플레이어 간에 데이터를 공유할 수 있습니다. Relay와 같은 다른 서비스에 사용자를 연결하는 첫 번째 단계를 간소화하고, 플레이어가 다른 로비를 찾을 수 있게 해 주는 툴을 제공합니다. 본 Lobby 기술 자료에서 서비스 관련 코드 샘플과 추가 정보를 확인할 수 있습니다. 기술 자료는 Lobby를 사용하는 방법에 대한 포괄적인 정보와 더불어 코드 샘플을 추가로 제공하며, 이 자료를 참고하면 게임 로비 샘플을 더 잘 이해할 수 있습니다. Lobby 서비스는 Unity Dashboard(https://dashboard.unity3d.com/lobby)에서 관리할 수 있습니다.Relay
Relay 서비스는 난독화된 호스트 IP를 사용해 호스팅 클라이언트 모델에서 플레이어를 연결합니다. 이렇게 하면 플레이어는 Relay와만 비공개 정보를 공유하면서 플레이어가 직접 연결된 것처럼 네트워크 경험을 호스팅할 수 있습니다. Relay 기술 자료에서 서비스 관련 코드 샘플과 추가 정보를 확인할 수 있습니다. 기술 자료는 Relay를 사용하는 방법에 대한 포괄적인 정보와 더불어 코드 샘플을 추가로 제공하며, 이 자료를 참고하면 게임 로비 샘플을 더 잘 이해할 수 있습니다. Relay 서비스는 Unity Dashboard(https://dashboard.unity3d.com/relay)에서 관리할 수 있습니다. 본 샘플에서 플레이어가 로비에 연결되면 Relay를 통해 플레이어가 연결되어 UTP를 통해 실시간으로 데이터를 전송하도록 설정됩니다. Lobby 및 Relay 모두 자격 증명용 Auth를 활용합니다. 이 샘플은 Auth의 익명 로그인 기능을 사용해 플레이어별로 고유한 반영구 자격 증명을 생성하지만, 개발자가 플레이어의 영구 계정을 유지할 필요는 없습니다.Vivox
Vivox 서비스는 인앱 커뮤니케이션이 가능하도록 플레이어 음성 및 텍스트 채팅방을 제공합니다. 또한 입체 음향 및 채팅 트랜스크립션 등의 유용한 기능을 자랑합니다. Vivox 개발자 기술 자료(https://docs.vivox.com/v5/general/unity/5_15_0/en-us/Default.htm)에서 게임 로비 샘플을 더 깊이 있게 이해하는 데 도움이 되는 Vivox 사용에 관한 포괄적인 정보뿐 아니라 코드 샘플을 확인할 수 있습니다. 앱용 Vivox 서비스는 Unity Dashboard(https://dashboard.unity3d.com/vivox)에서 관리할 수 있습니다.설정
Unity Dashboard의 Lobby 및 Relay 섹션에서 각각의 설정 지침을 확인할 수 있습니다. About & Support > Get Started를 선택하고 표시되는 단계에 따라 프로젝트에 서비스를 연동하십시오. 이러한 서비스가 설정되고 클라우드 조직에 프로젝트가 연결되면 에디터에서 mainScene 씬을 열고 게임 로비 샘플을 사용해 시작합니다.샘플 실행
전체 샘플 기능을 모두 시연하려면 플레이어 두 명이 필요합니다. 플레이 모드에서 에디터와 함께 실행할 스탠드얼론 빌드를 생성합니다. Auth는 시스템의 레지스트리를 사용해 익명의 자격 증명을 생성하지만 에디터와 빌드는 서로 다른 레지스트리 엔트리를 생성하므로 보유하는 자격 증명이 서로 다릅니다.Lobby Join 메뉴
Lobby Join 메뉴에는 플레이어가 공개 로비 목록이나 로비 코드를 사용해 플레이어끼리 연결하는 데 허브 역할을 하는 로비 목록 UI가 포함되어 있습니다.
Lobby Join 메뉴 UI
Lobby 뷰
Lobby 뷰 UI는 로비에 있는 모든 플레이어에 대한 Lobby 및 Relay의 정보를 보여 줍니다. 새 플레이어가 참여하면 곧장 호스트 연결이 시작되고, 이어서 이모티콘 및 상태 변경 사항이 다른 로비 멤버와 동기화됩니다.
Lobby 뷰 UI
아키텍처
게임 로비 샘플은 멀티플레이어 로비의 버티컬 슬라이스로 설계되었기 때문에 전체 게임 제작에서 예상할 수 있는 추가 인프라뿐 아니라 여러 서비스가 함께 작동할 수 있는 몇 가지 컴포넌트를 갖추고 있습니다. 따라서 사용자의 요구 사항에 따라 일부 코드베이스는 관련이 없을 수 있습니다. 대부분의 콘텐츠가 부연 설명이 필요 없지만 다음과 같은 몇 가지 중요한 포인트가 있습니다.-
Auth, Lobby, Relay 서비스 사용 로직이 각각의 디렉토리에 압축되어 있습니다. 대부분의 API 사용은 편의성을 위해 추상화되어 있습니다.
- 예를 들어 LobbyAPIInterface에는 Lobby API에 대한 실제 호출이 포함되어 있지만, LobbyAsyncRequests에는 해당 호출의 결과에 대한 추가 처리 작업과 API 호출의 적절한 타이밍에 필요한 몇 가지 구조가 포함되어 있습니다.
- Relay 디렉토리는 작동하는 데 전송 작업이 필요하기 때문에 UTP(Unity Transport)를 사용하는 로직도 포함되어 있습니다.
-
게임 디렉토리에는 게임용의 간단한 프레임워크를 나타내는 샘플을 실행하기 위한 코어 ‘glue’ 클래스가 포함되어 있습니다.
- GameManager가 갖춘 모든 코어 로직으로 샘플을 실행할 수 있습니다. 이를 통해 서비스와 UI를 설정하고 게임 상태를 관리하고 다른 컴포넌트의 메시지를 처리합니다.
- 샘플의 여러 컴포넌트의 상태를 유지하고, Lobby 및 Relay 데이터에 대한 샘플의 요구 사항과 서비스에서 해당 데이터의 구조를 원격으로 인터페이스하고자 여기에 다양한 기타 클래스가 포함되어 있습니다.
-
인프라 디렉토리에는 특정 서비스가 아닌 전반적인 함수와 관련된 필수 작업에 사용되는 클래스가 포함되어 있습니다.
- 로케이터는 서비스 로케이터 패턴을 모방하여 싱글톤일 수 있는 동작을 쉽게 교체할 수 있도록 합니다.
- 메신저는 관련성 없는 클래스를 분리된 상태로 유지하는 데 사용되는 간단한 메시징 시스템을 생성하여 관심 있는 일이 발생할 때 임의의 청취자에게 대신 메시지를 보내는 역할을 합니다. 로비가 업데이트되거나 플레이어가 Relay에서 연결을 해제하는 경우가 그러한 예입니다.
- 관찰자 패턴은 모든 UI 요소와 원격 Lobby 및 Relay 데이터의 로컬 복사에 사용됩니다. 관찰된 데이터에 변경이 있을 때마다 관찰자에게 경고가 전달되지만 해당 데이터의 소유자는 누가 관찰하고 있는지 알 필요가 없습니다.
-
UI 디렉토리에는 샘플 UI의 로직과 관련 데이터를 관찰하는 로직만 포함되어 있습니다. 서비스를 사용하는 방법을 파악하기 위해 이러한 파일을 반드시 볼 필요는 없지만 이를 통해 관찰자 패턴이 사용되는 것을 확인할 수 있습니다.
- ObserverBehaviour를 간단히 구현하는 클래스에 여러 파일이 포함되어 있습니다. 이는 Unity에서 동일한 이름의 파일에 MonoBehaviours가 존재해야 하기 때문입니다.
- UI의 대부분은 확인을 위해 CanvasGroup 알파에서 구동됩니다. 즉, 일부 동작은 플레이어에게 보이지 않더라도 계속 실행된다는 뜻입니다.
- 일부 코드의 주요 동작과 최신 사례를 보여 주기 위해 여러 테스트 디렉토리가 포함되어 있습니다. 특히 Lobby 및 Relay용 플레이 모드 테스트를 사용하여 서비스에 대한 연결이 제대로 작동하는지 확인할 수 있습니다.
- 에디터에서 샘플 개발 도중 변경 사항이 있을 때 편의성을 위해 프로젝트 에셋이 네스티드 프리팹(nested prefab)으로 세분화됩니다. 직렬화된 이벤트 핸들러를 사용하는 UI 요소가 있더라도 해당 세부 사항을 중요한 것으로 간주해서는 안 됩니다.
고려 사항
게임 로비 샘플은 Lobby 및 Relay 서비스를 최소로 구현한 것 이상을 담고 있지만 포괄적이지는 않으며, 설계 중 일부는 더 빠르거나 더 읽기 쉬운 방향으로의 개발에 초점을 맞추고 있습니다.- Lobby 및 Relay를 사용하는 모든 작업은 비동기 API 호출을 기반으로 합니다. 샘플 코드에는 임의의 시간에 결과를 수신함에 따라 발생할 수 있는 문제를 처리하기 위한 일부 로직이 적용되지만, 설정 및 정리 도중에 사용자가 시작하는 호출을 대기열에 추가하는 로직은 제외되어 있습니다. 로비를 들어오고 나가는 빠른 작업으로 인해 예상치 못한 동작이 발생할 수 있습니다.
- Relay는 호스트 마이그레이션을 지원하지 않지만 Lobby는 지원합니다. 로비 호스트 연결이 끊길 경우 Lobby에서 연결 해제가 감지될 때까지 로비에서는 클라이언트가 계속 작동하는 것처럼 보일 수 있습니다. 실제로 데이터 동기화가 빠르게 이뤄지지 않으면 호스트와 클라이언트 간의 주기적인 핸드셰이크를 추가로 구현하는 것이 좋습니다.
- 샘플은 Lobby 및 Relay를 사용하여 하트비트 핑을 설정함으로써 연결을 계속 유지하지만 로비 지속 시간에는 제한을 두지 않습니다. 실제 사용 시 최대 게임 시간 등 최대 지속 시간을 고려하시기 바랍니다.
-
HTTP 오류는 콘솔에 표시됩니다. Lobby 및 Relay API 호출로 인해 반환되는 이유는 다양합니다. 일반적으로 샘플 실행에는 영향을 미치지 않지만 플레이어에게 예상치 못한 동작이 나타날 수 있습니다. 샘플은 이러한 오류가 발생할 때 이유를 알려 주는 UI를 제공하지 않기 때문입니다.
- 404(“Not Found”) 오류는 Lobby 서비스가 임의의 순서로 여러 수신 API 호출을 처리할 때 발생하며, 대부분 로비를 나갈 때 발생하는 오류입니다. 또한 로비가 삭제되었지만 새로 고치기 전에 로비 목록에 그대로 표시되어 있는 경우처럼 유효하지 않은 로비에 참여하려고 할 때 발생합니다.
- 429(“Too Many Requests”) 오류는 속도 제한 작업이 너무 빠르게 발생할 때 나타납니다. 특히 너무 빨리 로비 목록을 새로 고치면 QueryLobbiesAsync 호출에서 429 오류가 발생합니다. Lobby 기술 자료에서 세부 정보를 살펴보십시오.
- 401(“Unauthorized”) 오류는 사용자가 Auth 로그인이 완료되기 전에 로비 메뉴에 입장할 때 발생합니다. 모든 Lobby 및 Relay 작업을 수행하려면 Auth 자격 증명이 완료되어야 합니다.
-
409(“Conflict”) 오류는 다른 플레이어와 동일한 자격 증명으로 로비에 참여하려고 할 때 나타납니다. 특히 여러 스탠드얼론 빌드로 테스트하려고 할 때 나타나는데, 시스템에서 동일한 레지스트리 엔트리를 공유하기 때문입니다. 시스템 한 대에서 플레이어 세 명 이상으로 테스트하려면 다음을 수행하십시오.
- 동일한 에셋을 사용하도록 원본 에셋과 패키지에 대해 심볼릭 링크를 사용하여 복제 프로젝트를 생성합니다. ProjectSettings를 복사하되 원본에는 연결하지 않습니다. 심볼릭 링크를 생성하는 프로세스는 운영체제에 따라 다르다는 점을 염두에 두시기 바랍니다.
- 다른 에디터에서 이 프로젝트를 엽니다.
- Edit > Project Settings > Player에서 Product Name을 수정합니다. 이렇게 하면 복제 프로젝트에 새 레지스트리 엔트리가 생기므로 Auth에서 새 자격 증명이 생성됩니다.
- 플레이 모드 또는 스탠드얼론 빌드 중 하나에서 샘플을 실행할 때 원본과 다른 기본값 플레이어 이름이 할당되는지 확인하십시오. 이는 Auth 자격 증명이 다름을 나타내며, 409 오류를 방지할 수 있습니다.