Unity Mirror 샘플
Unity Mirror 샘플 프로젝트에 오신 것을 환영합니다. 이 프로젝트는 UTP(Unity Transport 패키지)와 Relay를 Mirror Networking API와 함께 사용하는 방법을 보여 줍니다.
- UTP(Unity Transport 패키지)는 로우레벨 네트워킹 라이브러리로, 안정성, 정렬, 단편화와 같은 추가적인 기능을 갖춘 UDP 소켓을 통해 연결 기반 추상화 레이어를 제공합니다.
- Relay는 전용 게임 서버나 P2P 커뮤니케이션 없이도 참여 코드를 사용하는 형태의 워크플로를 통해 여러 플레이어를 안전하게 연결할 수 있는 Unity 서비스입니다.
- Mirror는 Unity 플랫폼을 위한 하이레벨 네트워킹 라이브러리입니다.
UTP용 파일은 Assets/UTPTransport
디렉토리에 있으며, Mirror용 파일은 Assets/Mirror
디렉토리에 있습니다.
참고: 이 샘플 프로젝트는 Shrine의 YouTube Mirror Networking 시리즈에서 소개한 코드와 정보를 사용합니다.
요구 사항 및 제한 사항
Unity Mirror 샘플에는 다음과 같은 요구 사항이 있습니다.
- 지원되는 Unity 에디터 버전. 샘플 프로젝트는 2020.3 버전 이상에서 지원됩니다.
- UGS(Unity Gaming Services) 계정
- Unity 서비스
- Unity Relay
- Unity Transport 패키지(Relay에 포함)
- Unity Jobs
- UAS(Unity Authentication 서비스)
- Mirror Networking API v67.1.0
제한 사항
이 샘플은 Game Server Hosting에서 바로 사용할 수 없습니다. 하지만 GSH(Game Server Hosting)에서 사용할 수 있게 샘플을 조정할 수 있습니다. GSH에서 사용할 수 있게 샘플을 조정하려는 경우, Relay는 P2P를 모방하는 솔루션으로 GSH와 동일한 역할을 한다는 점을 떠올려 보십시오. 따라서 Relay와 GSH를 함께 사용할 필요는 없습니다.
필수 조건
계속하기 전에 샘플 프로젝트를 사용하기 위한 모든 필수 조건을 갖췄는지 확인하십시오.
- Unity Dashboard 프로젝트 생성
- Relay 서비스 활성화
- Unity 에디터 설치(버전 2020.3 이상)
- Unity 에디터 로그인
- Unity 에디터에 Unity Dashboard 프로젝트 연결
샘플 아키텍처
Unity Mirror 샘플 프로젝트에는 다음 두 가지 컴포넌트가 있습니다.
게임 클라이언트와 게임 서버 컴포넌트는 Unity와 Mirror Networking API를 사용합니다.
게임 클라이언트
게임 클라이언트는 플레이어가 게임 서버와 백엔드 서비스에 연결하기 위해 플레이어의 머신에서 로컬로 실행하는 실행 파일입니다. 게임 클라이언트를 Relay와 함께 실행할 수도 있고 Relay 없이 실행할 수도 있습니다.
게임 서버
게임 서버는 게임 서버 프로세스를 실행하는 빌드 실행 파일입니다.
개발용으로 게임 서버 실행 파일을 로컬에서 실행하거나, 프로덕션용으로 Game Server Hosting 등의 서비스를 통해 호스팅할 수 있습니다.
참고: Relay 서비스의 관점에서 게임 서버는 호스트 플레이어의 게임 클라이언트입니다.
가이드
다음 섹션에서는 샘플 프로젝트와 상호 작용하고, 샘플 프로젝트를 테스트하고 조정하는 방법을 설명합니다.
에셋 스토어에서 Mirror 샘플 설치
다음 단계를 완료하여 샘플 프로젝트의 UTP 전송 구현을 프로젝트에 설치할 수 있습니다. 샘플 프로젝트 코드는 GitHub 저장소에서도 받을 수 있습니다.
- 에셋 스토어의 Mirror 페이지로 이동합니다.
- Add Mirror to My Assets를 선택합니다.
- Unity 에디터를 실행합니다.
패키지 관리자를 사용하여 Mirror를 임포트합니다.
- Window > Package Manager > Packages: My Assets > Mirror > Download/Import를 선택합니다.
패키지 관리자를 사용하여 Relay를 임포트합니다.
- Window > Package Manager > Add > Add package from git URL... > **"com.unity.services.relay@1.0.4"**를 선택합니다.
패키지 관리자를 사용하여 Jobs를 임포트합니다.
- Window > Package Manager > Add > Add package from git URL... > **"com.unity.jobs"**를 선택합니다.
샘플 프로젝트의
Assets\UTPTransport
디렉토리를 프로젝트로 복사합니다.Mirror.NetworkManager
컴포넌트를GameObject
에 연결합니다.UTP.UtpTransport
컴포넌트를GameObject
에 연결합니다.UTP.UtpTransport
컴포넌트를Mirror.NetworkManager
컴포넌트의Transport
필드에 할당합니다.Mirror에서 게임 오브젝트에 자동으로 연결한
kcp2k.KcpTransport
컴포넌트를 제거합니다.
샘플 프로젝트 테스트
경고: 샘플 프로젝트를 테스트하기 전에 Unity Dashboard에서 Relay를 활성화하고 설정했는지 확인하십시오.
테스트 목적으로 샘플 프로젝트의 인스턴스 두 개를 실행하려면, 다음 단계를 완료하십시오.
- Unity 에디터에서 샘플 프로젝트를 엽니다. 프로젝트는 Unity 2020.3 이상을 지원합니다.
- 에디터 드롭다운에서 ParallelSync > Clones Manager를 선택합니다. ParallelSync를 사용하면 같은 프로젝트로 여러 에디터 인스턴스를 실행할 수 있습니다.
- Add new clone을 선택합니다.
- 클론을 생성했으면 Open in New Editor를 선택합니다.
- 두 에디터 인스턴스에서 플레이 버튼을 선택합니다.
- 두 에디터 인스턴스에서 Auth Login을 선택합니다. 이 인증에는 Relay용 UAS(Unity Authentication 서비스)를 사용합니다.
Relay용 UAS로 두 에디터 인스턴스를 모두 인증하고 나면 샘플 프로젝트의 UTP 전송 및 Relay 기능을 테스트할 수 있습니다.
샘플 GUI를 사용하여 다음 기능을 테스트합니다.
- Standard Host를 선택하여 UTP 전송을 통해 서버를 실행합니다.
- **Client (without Relay)**를 선택하여 OTP 전송을 통해 서버에 연결합니다.
- Relay Host를 선택해서 Relay 서버를 할당합니다.
- **Client (with Relay)**를 선택해서 Relay 서버에 연결합니다.
참고: 각 컴포넌트를 테스트할 때 올바른 버튼을 사용하고 있는지 확인해야 합니다.
Linux용 크로스 컴파일
다음과 같이 Unity 에디터를 사용하여 Linux용 게임 클라이언트와 게임 서버 실행 파일을 모두 크로스 컴파일할 수 있습니다.
- Unity Hub를 실행하고 Installs를 선택합니다.
- 버전 2020.3.24f1 옆에 있는 기어를 선택합니다.
- Add modules를 선택합니다.
- Linux Build Support (IL2CPP and Mono) 모듈을 선택하고 Install을 선택합니다.
Linux Build Support 모듈 설치가 끝나면 다음과 같이 Unity 에디터에서 빌드 옵션으로 Linux를 선택합니다.
- Unity 에디터를 실행합니다.
- File > Build Settings를 선택합니다.
- Target Platform으로 Linux를 선택합니다.
- 서버 빌드를 패키징하려면 Server build를 선택합니다. 서버 빌드가 아닌 경우에는 Build를 선택하고 빌드 위치를 선택합니다.
게임 클라이언트 실행
게임 클라이언트 컴포넌트는 로컬에서 스탠드얼론 애플리케이션으로 실행하거나 Unity 에디터를 통해 실행할 수 있습니다.
게임 클라이언트를 스탠드얼론 애플리케이션으로 실행하려면 파일 탐색기나 커맨드 라인 인터페이스를 통해 게임 클라이언트 실행 파일을 선택합니다.
Unity 에디터를 통해 게임 클라이언트를 실행하는 방법은 다음과 같습니다.
- Unity 에디터(버전 2020.3 이상)에서 Unity Mirror 샘플 프로젝트를 엽니다.
- 플레이 버튼을 선택합니다.
참고: Unity Mirror 샘플 프로젝트를 처음 여는 경우, Unity가 모든 파일과 패키지를 임포트하는 데 몇 분 정도 걸릴 수 있습니다.
게임 서버 실행
-server
인수를 사용하여 커맨드 라인 인터페이스를 통해 게임 서버 컴포넌트를 로컬로 실행할 수 있습니다.
게임 클라이언트와 게임 서버 동시 실행
게임 클라이언트와 게임 서버 실행 파일을 하나는 스탠드얼론 애플리케이션으로, 다른 하나는 Unity 에디터를 통해 로컬에서 실행할 수 있습니다.
참고: 게임 클라이언트와 서버를 실행하기 전에 서버와 클라이언트 빌드를 모두 생성해야 합니다.
예를 들어 다음과 같이 게임 서버는 스탠드얼론 애플리케이션으로 실행하고 게임 클라이언트는 Unity 에디터를 통해 실행할 수 있습니다.
- 커맨드 라인 인터페이스를 통해 게임 서버를 시작합니다.
- 로그를 실시간으로 보려면
-log
인수를 추가합니다. - Unity 에디터에서 Start Client를 선택합니다.
참고: 게임 서버의 기본 포트는 7777
입니다. 포트 번호를 변경하려면 -port
인수를 사용하십시오.
샘플 프로젝트 조정
Unity Mirror 샘플 프로젝트는 다음 작업을 수행할 수 있는 샘플 코드를 제공합니다.
Mirror 네트워크 관리자 초기화
Assets/Mirror/Runtime/NetworkManager.cs
의 NetworkManager
클래스는 Mirror 네트워크 관리자의 싱글톤 인스턴스입니다. Mirror 네트워크 관리자 컴포넌트를 사용하여 게임 상태 관리, 생성 관리, 씬 관리 등 멀티플레이어 게임의 네트워킹 요소를 관리할 수 있습니다.
Relay 기능 추가
Assets/UTPTransport/RelayNetworkManager.cs
의 RelayNetworkManager
클래스는 Relay 기능으로 NetworkManager
클래스를 확장합니다. 이 클래스로 다음을 수행할 수 있습니다.
- 참여 코드를 사용합니다.
- Relay 서버 정보를 가져옵니다.
- 사용할 수 있는 Relay 지역을 확인합니다.
- 호스트 플레이어로 NetworkDriver를 시작합니다.
- Relay 서버에 참여합니다.
- 참여 코드를 사용하여 연결합니다.
UTP 기능 추가
Assets/UTPTransport/UtpTransport.cs
의 UtpTransport
클래스는 UTP 및 Relay와 호환되는 Mirror.Transport
의 인스턴스입니다. 이 클래스로 다음을 수행할 수 있습니다.
- Relay 참여 코드로 클라이언트를 설정합니다.
- 참여 코드에서 할당을 가져옵니다.
- Relay 지역을 가져옵니다.
- Relay 서버를 할당합니다.
커스텀 네트워크 관리자 생성
Assets/Scripts/MyNetworkManager.cs
의 MyNetworkManager
클래스는 Mirror와 Relay 서비스의 UTP 전송 기능을 모두 결합하는 RelayNetworkManager
의 인스턴스입니다.
사용자 인터페이스 표시
Assets/Scripts/MenuUI.cs
의 MenuUI
클래스는 샘플을 작동시키는 UI를 표시합니다. 서버를 실행하고 클라이언트에 연결하기 위해 MyNetworkManager
와 인터페이스로 접속합니다.
프로젝트에서 Mirror에 UTP 전송 사용
이 샘플에는 Mirror용 UTP(Unity Transport 패키지) 전송이 포함되어 있습니다. 다음 섹션의 지침에 따라 프로젝트에서 이 샘플의 코드를 사용할 수 있습니다.
참고: 계속하기 전에 요구 사항 및 제한 사항 섹션을 살펴보십시오.
기존 전송을 UTP 전송으로 마이그레이션
이미 Mirror를 사용 중이고 빌트인 전송 중 하나에서 UTP 전송으로 마이그레이션하려는 경우 다음 단계를 완료하십시오.
- Unity 에디터를 실행합니다.
Mirror.NetworkManager
컴포넌트가 포함된 씬을 찾아서 엽니다.UTP.UtpTransport
컴포넌트를GameObject
에 연결합니다.UTP.UtpTransport
컴포넌트를Mirror.NetworkManager
컴포넌트의Transport
필드에 할당합니다.GameObject
에서 기존Mirror.Transport
컴포넌트를 제거합니다.- 포트 및 로그 상세 구성과 같은
UTP.UtpTransport
컴포넌트의 파라미터를 원하는 대로 설정합니다.
UTP와 함께 Relay 사용
Relay를 사용하려면 Mirror.NetworkManager
가 아닌 UTP.RelayNetworkManager
를 사용해야 합니다. 왜냐하면 UTP.RelayNetworkManager
가 Mirror.NetworkManager
를 상속하고 Relay 서비스와 상호 작용하기 위한 기능을 추가하기 때문입니다.
Relay를 사용하기 전에 UAS(Unity Authentication 서비스)로 인증해야 합니다. Relay 서비스를 사용하려면 자체 인증 서비스를 사용하더라도 이 인증 절차가 필요합니다.
다음 코드 스니핏은 Unity Authentication 서비스로 인증하는 방법을 보여 줍니다.
try
{
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();
Debug.Log("Logged into Unity, player ID: " + AuthenticationService.Instance.PlayerId);
}
catch (Exception e)
{
Debug.LogError(e);
}
인증을 마치고 나면 UTP.RelayNetworkManager
를 사용하여 Relay 서버를 할당하거나 참여 코드를 통해 Relay 서버에 참여할 수 있습니다.
도움말
시작하는 데 어려움이 있으신가요? 유니티의 지원을 받으십시오. Relay 지원 포털로 이동하여 티켓을 제출하십시오. 티켓 카테고리에서 Networking Package > Mirror를 선택했는지 확인하십시오.