Unity 검색

2022 Boss Room 소개: Netcode for GameObjects, Relay 및 Lobby 사용 사례

2022년 4월 14일 게임 | 13 분 소요
Boss Room boss
Boss Room boss
공유

Is this article helpful for you?

Thank you for your feedback!

2021년 4월, 사전 체험판으로 릴리스된 개발자를 위한 유니티 교육용 툴인 Boss Room에 이제 멀티플레이어 게임 개발을 체험하며 배울 수 있는 UGS(Unity Gaming Services) 요소가 더 많이 포함되었습니다. 

Boss Room은 멀티플레이어 게임 개발을 배우려는 개발자를 위한 샘플 게임으로, 정식 제작에 사용할 수 있는 환경에서 다양한 UGS를 활용합니다. 

Boss Room을 통해 다음 두 가지 목표를 달성할 수 있습니다.

  1. 커뮤니티에게 무료로 제공되는 교육용 자료로 멀티플레이어 게임 개발을 시작해볼 수 있습니다. 또한 제작 중인 Unity 게임에 단편적으로 참고할 수도 있습니다.
  2. 장르 고유의 기본적인 기능을 갖춘 멀티플레이어 게임을 빌드하고 유지 보수하기 위해 샘플 개발 팀이 SDK 및 UGS 팀과 밀접하게 작업한 결과, 유니티 자사 솔루션을 시험하는 데 효과적으로 활용되었습니다. 새로운 툴과 기능이 계속 공개됨에 따라 Boss Room 또한 진화하고 있으며 기능 세트도 확장되고 있습니다.

Boss Room은 지난달에 v1.1.0-pre 릴리스로 업데이트되었으며, 멀티플레이어 게임 개발의 서비스 측면을 살펴보려는 개발자들을 위해 완전히 새로운 기능 세트를 선보이고 있습니다.

이번 포스팅에서 멀티플레이어 경험에 필수적인 로비 기능을 생성하기 위해 Boss Room이 Unity Gaming Services를 활용하는 방식을 자세히 알아보세요. 

이 포스팅 시리즈에서는 서비스를 통합하는 방법 등 Lobby, Relay, Authentication 서비스 기술 자료 페이지에서 상세히 다룬 내용은 생략합니다. 대신 각종 서비스와 솔루션을 프로젝트에 적용하면서 알아낸 사항에 중점을 둘 예정입니다.

Boss Room에서 플레이어 연결하기

Boss Room Characters in a room

Boss Room은 멀티플레이어 게임이므로, 게임이 진행되는 공간을 발견하고 참여할 수 있는 수단이 있어야 합니다.

현재 플레이어는 두 가지 옵션으로 서로를 찾고 게임에 연결할 수 있습니다.

직접 IP 연결을 사용하면 유저는 공개적으로 노출된 IP 주소를 통해 서로 연결할 수 있습니다. 하지만 NAT(Network Address Translation, 네트워크 주소 변환) 시스템이나 라우터에 숨겨진 경우 다른 컴퓨터에 연결하는 일이 생각처럼 간단하지 않습니다. 

포트 포워딩(Port forwarding)을 사용하면 연결을 생성할 수 있지만 다른 플레이어가 연결할 수 있도록 하려면 여전히 호스트에서 추가로 해야 할 작업이 있습니다. 또한 이 솔루션은 게임 세션을 발견할 수 있게 하는 기능은 없으며, 플레이어는 게임 외적 수단을 통해 참여 정보를 공유해야 합니다. 이 연결 모드에는 인터넷 연결이 필요 없으며 LAN 환경에서 작동한다는 장점이 있습니다. 

하지만 Boss Room은 인터넷상에서도 플레이가 가능하도록 만들어진 멀티플레이어 경험으로서 세션을 쉽게 발견할 수 있으며 호스트 플레이어가 포트 포워딩을 수행하지 않아도 됩니다.

바로 Unity Gaming Services의 Authentication, Lobby, Relay의 결합 덕분에 플레이어는 포트 포워딩이나 게임 외적으로 시스템을 만들 필요없이 인터넷상에서 플레이 가능한 게임을 손쉽게 호스팅하고 참여할 수 있습니다.

Authentication, Lobby, Relay 서비스를 Boss Room에 통합하면 게임 호스팅과 참여를 더 간단하게 구현할 수 있으며, 포트 포워딩 및 외부에서 게임에 참여하는 데 필요한 정보 공유의 필요성이 줄어듭니다. 

전체적으로 훨씬 더 원활하고 빠른 경험이 가능해졌으며 이는 정식 제작하는 게임 프로젝트에서는 필수적인 요소입니다.

지금까지 학습한 내용은 다음과 같습니다.

Boss Room 앱 플로 개요

게임플레이의 관점에서 Boss Room은 호스트를 중심으로 한 완전한 협동 멀티플레이어 RPG이며 최대 8명의 플레이어를 수용합니다. 여기에서 기능과 게임플레이에 대해 자세히 알아볼 수 있습니다.

첫 번째 단계: Authentication, UGS, 로컬 반복 워크플로

사용자는 Unity Gaming Services와 상호 작용하기 위해 인증 절차를 걸쳐야 하며, 게임이 시작되고 메인 메뉴 씬이 로드되면 곧바로 Authentication 서비스로 연결됩니다.

Authentication 서비스는 익명 로그인을 지원하므로 플레이어가 추가로 정보를 입력할 필요가 없습니다.

Authentication API는 기본적으로 같은 머신에서 실행되는 동일한 프로젝트를 여러 인스턴스로 구분하지 않기 때문에 다양한 인스턴스에 동일한 유저로 로그인하게 됩니다. 이 경우 ParrelSync 클론과 실제 게임 빌드가 모두 영향을 받아 로컬에서 게임을 테스트하기 어려워집니다.

다행히 Authentication 서비스는 간단하게 프로필 기능을 지원하여 이를 통해 실질적으로 서로 다른 유저가 동일한 물리적 머신에서 활동할 수 있습니다. 로컬에서 테스트하려면 빌드와 에디터 플레이어가 다른 프로필로 전환할 수 있어야 합니다.

ProfileManager 클래스는 어떤 프로필을 사용해야 하는지 결정하는 로직을 래핑합니다. 빌드에서 '-AuthProfile' 커맨드 라인 인수를 사용하여 새 프로필 ID를 지정합니다. 에디터에서 반복 작업을 수행할 때는 ParrelSync를 사용하므로 이 클래스는 ParrelSync의 'CloneManager' 커스텀 인수를 사용하여 어떤 사용자 프로필을 사용할지 결정할 수 있습니다.

다음과 같이 'ProfileManager.Profile'을 사용해 커스텀 'InitializationOptions'를 생성합니다.

이 코드는 프로필 전환 및 로그인 로직을 실행합니다.

위 작업이 완료되면 다른 서비스를 사용할 수 있게 됩니다. 이제 ParrelSync 및 커스텀 프로필을 사용할 때 어느 정도 자동화된 로컬 반복 워크플로를 사용할 수 있습니다. 최근에 Boss Room은 툴에 구애받지 않게 이를 dataPath 기반으로 변경했으나, 위 솔루션은 여전히 ParrelSync 사용자에게 유효합니다.

Lobby 생성: 호스트 플로

  • 예비 호스트가 로비 이름을 입력하고 공개 또는 비공개 중 하나를 지정한 다음 'create' 버튼을 누릅니다.
  • Lobby 생성 API 호출이 만들어집니다. 새로 생성된 로비는 아래의 릴레이 할당 및 넷코드 시작 단계를 완료할 때까지 '잠긴 상태'로 있으며, 설정이 완료된 참여 가능한 공개 게임 목록에 나타나지 않습니다.
  • 호스트는 Relay 서비스에 릴레이 할당을 요청합니다.
  • UTP가 시작되며 호스트가 캐릭터 선택 씬으로 전환됩니다. 이제 로비는 잠겨 있지 않으며 다른 클라이언트가 참여할 수 있게 됩니다.
Lobby menu in Boss Room

Lobby 참여: 클라이언트 플로

  • 다음과 같은 여러 방법으로 로비에 연결할 수 있습니다.
    • Lobby 서비스에서 주기적으로 가지고 오는 공개 로비 목록 중 하나를 선택
    • 공개 로비를 무작위로 선택하는 빠른 참여 사용
    • 게임 외적 수단을 통해 공유되는 로비 키 사용 이는 공개 및 비공개 로비 모두에서 가능합니다.
  • 로비에 참여한 후에는 로비 메타데이터를 통해 전달된 릴레이 참여 코드를 사용하여 UTP Relay 전송을 통해 호스트에 연결합니다.
  • 호스트는 요청을 받아 클라이언트 연결을 승인하며, 모든 절차가 원활히 진행되면 호스트는 서버 권한으로 플레이어를 적절한 씬으로 전환합니다.

플레이어가 호스팅하거나 게임에 연결된 경우

연결 후에 플레이어는 캐릭터 선택 씬에서 8명의 영웅 중 하나를 선택하게 됩니다. 모든 플레이어의 준비가 완료되면 짧은 타이머가 표시되고 모든 영웅들이 실제 게임플레이가 이뤄지는 Boss Room 환경으로 이동합니다.

UGS Lobby와 게임 내 '로비', 즉 캐릭터 선택 씬이 구분되어야 합니다. Boss Room의 캐릭터 선택 씬은 넷코드에 기반을 둡니다.

Lobby 서비스를 통해서도 임의의 메타데이터를 전달할 수 있기 때문에 해당 기능을 사용하여 유사한 캐릭터 선택 씬을 구현할 수 있습니다. 

현재 Lobby 서비스는 업데이트를 위해 폴링(polling)을 해야 합니다. 이는 캐릭터 선택에 대한 반응성 측면에서 최상의 방법은 아니지만 향후 Lobby 서비스에서 실시간 업데이트 수행에 관한 옵션이 생긴다면 적절한 대안책으로 활용할 수 있습니다.

연결 해제 및 재연결 처리하기

플레이어 연결 해제 및 재연결 처리는 멀티플레이어 게임에서 필수적인 작업입니다.

Boss Room은 플레이어의 연결 해제 시 일부 데이터를 유지하여 재연결 시 해당 플레이어에게 정확히 다시 할당되도록 하는 세션 관리 시스템을 사용합니다(SessionManager.cs – OnClientDisconnect 참조). 

Unity에서 재연결 시 사용자 데이터 복원을 처리하는 방식은 SessionManager.cs - SetupConnectingPlayerSessionData에서 확인할 수 있으며, 이는 호스트가 처리하는 연결 승인 확인 과정에서 호출됩니다(ServerGameNetPortal.s – ApprovalCheck 참조).

연결 해제된 플레이어는 로비에서 즉시 제거할 수 있어야 합니다. 그렇게 하지 않으면 연결이 해제된 플레이어가 아직 로비에 있는 것으로 간주되므로 로비에 다시 참여할 수 없게 됩니다.

플레이어가 Relay에서 연결 해제되면 결국 Lobby 및 Relay 서비스 통합(UTP 연결을 실행하기 전에 활성화해야 함)에 의해 연결 해제된 플레이어가 퇴장되지만, 연결 해제 시간이 최대 2분으로 상당히 길어 이 메커니즘에만 의존할 수는 없습니다.

로비 퇴장 과정의 안정성을 높이려면, 다음과 같은 여러 추가적인 클린업 메커니즘을 사용할 수 있습니다.

  • 플레이어를 로비에서 제거하라는 요청을 전송하는 애플리케이션 종료 로직(ApplicationController.cs - OnWantToQuit 및 LeaveSession 참조)을 클라이언트 코드에 포함합니다.
  • 연결 해제된 플레이어를 호스트가 'NetworkManager.OnClientDisconnectCallback'을 통해 인식하자마자 로비에서 제거하는 특별한 로직을 호스트에 포함합니다. 이는 클라이언트에 크래시가 발생하여 '로비 퇴장' 요청을 전송할 수 없는 경우에 유용합니다. 이 메커니즘이 작동하려면 호스트가 SessionManager를 사용하여 UGS playerId 및 해당 NGO clientId 간의 매핑을 저장하고 있어야 합니다. ServerGameNetPortal.cs - OnClientDisconnect에서 이 로직을 확인할 수 있습니다.

마지막으로, 클라이언트에는 호스트가 로비를 떠났는지 확인하는 검사가 포함되며, 호스트가 떠난 경우 클라이언트도 로비를 떠납니다. 이를 위한 코드는 ClientGameNetPortal.cs - OnDisconnectOrTimeout에서 확인할 수 있습니다.

향후 계획

유니티의 UGS 포트폴리오와 네트워킹 솔루션이 개선됨에 따라 Boss Room 샘플도 함께 업데이트될 예정입니다. 아래와 같은 방법으로 기술 개선에 동참해주세요.

네트워킹 프로젝트를 제작하고 싶으신가요? DiscordUnity Multiplayer 포럼에서 유니티 담당자와 채팅하고, 개발 경험을 공유하거나 도움을 요청하세요.

2022년 4월 14일 게임 | 13 분 소요

Is this article helpful for you?

Thank you for your feedback!

포럼에서 토론에 참여하기