Mirror
Edgegap에서의 Mirror
이 가이드는 Unity 프로젝트에서 헤드리스 서버를 Edgegap에 생성하는 데 도움을 주며 Mirror 을(를) 네트워킹 솔루션으로 사용합니다.
이 가이드에서는 오픈 소스 샘플 프로젝트 Tanks를 사용할 것입니다. 이 프로젝트는 이미 Mirror 샘플(위치: Assets/Mirror/Examples/Tanks)에 포함되어 있습니다.
최종 샘플은 우리의 GitHub.
게임 서버 빌드하기
게임 준비가 완료되면 빌드 화면으로 이동하세요. Unity 에디터의 파일 -> 빌드 설정 상단 메뉴에서 확인할 수 있습니다. 사용 중인 Unity 버전에 따라 올바른 프리셋을 선택했는지 확인하세요.
2021.2 버전 이전:
다음으로 설정하세요
대상 플랫폼에서Linux;다음으로 설정하세요
아키텍처에서x86_64;다음 항목을 체크하세요
서버 빌드옵션.
그렇지 않은 경우:
다음으로 설정하세요
플랫폼에서전용 서버;다음으로 설정하세요
대상 플랫폼에서Linux.
그런 다음 빌드 버튼을 눌러 새 빈 폴더 linux_server 를 파일 목적지로 선택하세요. 폴더를 두 번째 빈 폴더로 옮기세요. 이 문서에서는 이를 linux_server 폴더라고 부르겠습니다. [SERVER BUILD] 폴더라고 합니다.
전용 게임 서버를 컨테이너화하기
이 부분에서는 전용 게임 서버를 포함하는 도커 이미지를 생성합니다. 또한 읽어보면 도움이 되는 문서가 있습니다: Docker에서의 Unity 서버.
Edgegap과 Docker에 대한 추가 정보가 필요하면 다음을 참조하세요. 이 문서.
Dockerfile
네트워크 통신에 사용하는 포트를 기록해 두세요. 문서에서는 이를 [GAME PORT]라고 합니다. 기본적으로 사용되는 포트는 7777입니다. 이 정보는 Unity 에디터의 을(를) 선택하고 게임 오브젝트 Transport 컴포넌트에서 확인할 수 있습니다.
위의 줄들을 복사하여 Dockerfile에 붙여넣으세요. Dockerfile은
[SERVER BUILD]에 위치해야 합니다. 자리표시자[GAME PORT]를 게임 포트에 맞게 수정하세요.
다음 [GAME PORT] 포트를 TCP와 UDP 둘 다에서 열어두면 Mirror 컴포넌트에서 선호하는 전송 방식을 사용할 수 있습니다. 마지막으로 을(를) 선택하고 라는 이름의 파일을 생성하세요. boot.sh 을(를) [SERVER BUILD] 폴더의 루트에 생성하세요. 이미지를 컨테이너에서 시작할 때 이 파일이 실행됩니다.
다음 두 줄을 복사하고, 생성된 파일 이름으로
[YOUR GAME]자리표시자를 반드시 교체하세요.
이 시점에서 다음과 같은 디렉터리 구조가 있어야 합니다:
[SERVER BUILD] 폴더> > -Dockerfile> > -boot.sh> > -linux_server폴더 > > > - Unity가 생성한 파일들
해당
[SERVER BUILD]폴더에서 명령 프롬프트를 열고 다음 Docker 명령들을 실행하세요:
ARM CPU(Mac M1, M2 등)를 사용하는 경우, 다음 전용 페이지.
를 참조하세요.
docker push <REGISTRY_URL>/<PROJECT_NAME>/<IMAGE_NAME>:<IMAGE_VERSION>
docker login -u <REGISTRY_USERNAME> <REGISTRY_URL>
Powershell 사용 시 이 명령들 실행 후, Edgegap 컨테이너 레지스트리를 사용 중이라면 Edgegap 웹사이트에서 업로드된 이미지를 볼 수 있어야 합니다. Edgegap 레지스트리를 사용하려면 이 문서
를 참조하세요. 다른 개인 레지스트리를 사용할 수도 있습니다.
Edgegap에 배포하기 웹사이트의 애플리케이션 및 게임 페이지로 이동하세요. 우측 상단의 새로 만들기
버튼을 클릭하여 애플리케이션 생성 양식으로 이동합니다. 아래는 각 필드와 올바르게 입력하는 방법입니다:
애플리케이션 이름: 다른 애플리케이션들 사이에서 쉽게 식별할 수 있도록 원하는 이름을 입력하세요.
이미지: 애플리케이션을 쉽게 식별하기 위한 특정 이미지를 지정할 수 있습니다.
버전 이름: 배포하는 버전의 범위를 설명하기 위해 버전 이름을 사용할 수 있습니다. 예: “demo”, “production”, “v1”, “v2”
컨테이너:
레지스트리: “[URL]” — 여기서 [URL]은 컨테이너 리포지토리 페이지에서 표시되는 자격증명 값입니다.
이미지 리포지토리: “[PROJECT]/[YOUR GAME]” — 여기서 [PROJECT]와 [YOUR GAME]은 도커 이미지를 푸시할 때 사용한 값입니다.
태그: “[TAG]” — 여기서 [TAG]는 도커 이미지를 푸시할 때 사용한 값입니다.
“개인 리포지토리 사용”을 체크하세요.
개인 레지스트리 사용자 이름: “[USERNAME]” — 여기서 [USERNAME]은 자격증명에 있는 값입니다.
개인 레지스트리 토큰: “[TOKEN]” — 여기서 [TOKEN]은 자격증명에 있는 값입니다.
요구사항: 그대로 두세요.
포트:
새 포트를 추가하려면+ 포트 추가[GAME PORT]-링크를 클릭하고 다음 항목들을 추가하세요:TCP/UDP- 검증 비활성화
3389 - TCP - 검증 비활성화 Deploy 애플리케이션이 생성되면, 게임 서버를 배포하려면
버튼을 눌러 진행할 수 있습니다. 배포할 리전을 선택하고 게임에 따라 생성할 임의 플레이어 수를 입력하세요. 다음 사항들을 확인하여 모든 것이 정상적으로 실행되는지 확인하세요:
최신 상태는 다음으로 설정되어야 합니다.포트 매핑준비됨

탭에서 애플리케이션 생성 양식에서 설정한 포트를 확인할 수 있습니다:
다음을 설정하십시오:
클라이언트 애플리케이션에 샘플 HUD 추가하기포트Transport컴포넌트를을(를) 선택하고값을포트 매핑배포의
탭에서 정의된 외부 포트로 설정하세요. 31887이 예시에서는 포트가
로 설정되었습니다. 이는 주로 개발 중인 게임에 따라 다르며 보통 게임 코드베이스에서 프로그래밍적으로 설정됩니다.
다음의 값을 설정하세요:네트워크 주소의네트워크 매니저를 배포의호스트값으로 설정하세요. 이 URL은 대시보드의배포 요약
에서 또는 API를 통해 확인할 수 있습니다. 이 예시에서는 주소가0ace560706a5.pr.edgegap.net
로 설정되었습니다. 다시 말하지만, 이 값은 클라이언트가 매치메이커/마스터 서버나 API와 통신할 때 프로그래밍적으로 설정되는 경우가 대부분입니다.
올바른 정보가 있으면 게임 서버에 정상적으로 연결하여 바로 플레이를 시작할 수 있을 것입니다.
이제 온디맨드로 배포할 수 있는 Mirror 프로젝트가 준비되었습니다! 을(를) 선택하고 시트 기반 배포에서는 플레이어가 서버에서 연결을 끊을 때 Edgegap 세션을 자동으로 제거하는 시스템을 Mirror로 구현할 수 있습니다. 이때 콜백 함수 와 플레이어 프리팹에 첨부된
NetworkBehaviour 을(를) 선택하고 스크립트에서 원격 절차 호출(RPC) 함수와 커맨드 함수를 사용합니다. 서버가 시작되면, 는 Edgegap API에서 해당 배포와 연결된 세션 ID들 목록을 가져와 저장합니다. 이후 새로운 플레이어가 서버에 연결되면, 클라이언트 측 함수가 RPC 를 통해 호출되어 플레이어의 IP 주소를 서버로 커맨드 로 전송합니다. 플레이어의 IP를 가진 서버는 각 세션 데이터에서 일치하는 IP가 있는지 확인합니다. 서버는 캐시된 ID로 Edgegap API를 통해 세션 데이터를 가져옵니다. 일치하는 항목이 발견되면, 세션 ID.
가 해당 플레이어의
NetworkConnectionToClient 세션 ID 에 매핑됩니다. 커맨드서버가 시작된 후에도 새로운 세션이 추가될 수 있으므로 세션 ID 목록은 업데이트되며, 처음에 매핑을 찾지 못한 경우 새로 추가된 세션들도 확인됩니다.
마지막으로 플레이어가 서버에서 연결을 끊으면, 서버는 해당 플레이어의
if (conn != null)
UnityWebRequest request = UnityWebRequest.Delete(url);
Debug.Log("세션이 성공적으로 삭제되었습니다.");
Debug.LogError($"세션 삭제 오류: {request.error}"); 선택적 기능 이 스크립트는 특정 상황에서 세션을 관리하는 데 유용한 선택적이고 독립적인 기능들로 확장할 수 있습니다. 예를 들어, 타임아웃 을 설정하여빈 좌석 세션
을(를) 제거할 수 있습니다. 이는 전체 서버 초기화 후 일정 시간 후에 이루어집니다. 이 기능은 매치메이커 티켓이 해결되기 전에 플레이어가 떠나 매칭이 이루어졌을 때 빈 세션이 생성되는 경우에 유용합니다. 플레이어가 타임아웃이 끝나기 전에 자신의 IP 주소를 세션 ID에 매핑하기 위해 보내지 않으면 해당 세션은 삭제되어 소켓이 해제됩니다. 또 다른 기능으로는 비활성 플레이어 연결 해제 를 통해 소켓을 확보하는 방법이 있습니다. 서버에 연결된 이후 클라이언트는간단한 하트비트 메시지 를 몇 초마다서버로 전송해야 하며, 그렇지 않으면 연속으로 너무 많은
하트비트 누락이 발생하면
clientTimeSinceLastHeartbeat += Time.deltaTime;
마지막 업데이트
도움이 되었나요?

