unityUnity

실습을 통해 배우고 Edgegap에서 첫 전용 서버를 배포해 보세요. 이 가이드를 끝까지 따라가면 비용 없이 Edgegap으로 전용 서버를 배포하게 됩니다.

✔️ 준비

chevron-rightEdgegap의 Unity 전용 서버 빠른 시작 플러그인 설치arrow-up-righthashtag

circle-info

서버 빌드에 자신 있으신가요? 로 이동 Unity 또는 고급 기능 더 자세히 보려면.

⚙️ 1. 계정 연결

☑️ 로그인하고 Unity 콘솔에 Edgegap 플러그인과 관련된 새 오류가 없는지 확인하세요.

✅ 이제 다음 단계로 진행할 수 있습니다.

chevron-right문제 해결 및 FAQhashtag

!Success: 400 BAD REQUEST - POST | https://api.edgegap.com/v1/wizard/init-quick-start - {"message": "브라우저(또는 프록시)가 이 서버가 이해할 수 없는 요청을 보냈습니다."}

  • ZIP 파일을 복사하여 설치했거나 이런 방식으로 설치된 플러그인이 포함된 샘플 프로젝트를 사용했다면 Newtonsoft JSON 라이브러리를 포함한 패키지 종속성을 수동으로 설치해야 합니다. 다음을 참조하세요. 공식 플러그인 저장소arrow-up-right.

  • 이 경우가 아니라면 커뮤니티 디스코드arrow-up-right 에서 도움을 요청해 주세요.

🔧 2. 게임 서버 빌드

Windows, Mac, Linux 어떤 머신을 사용하든 Linux 런타임용으로 서버를 빌드해야 합니다, 왜냐하면 오늘날 대부분의 클라우드 제공업체(Edgegap 포함)는 Linux에서 실행되기 때문입니다. 걱정하지 마세요. 이 플러그인을 사용하면 Linux 지식이 없어도 됩니다.

☑️ 필수 Unity Linux 빌드 도구가 설치되어 있는지 확인하세요.

☑️ 빌드 설정을 편집하여 필수 게임 씬이 모두 포함되었는지 확인하세요.

circle-info

고급 Unity 사용자 - 선택적으로 변경 Unity 빌드 설정arrow-up-right. 주의! 이로 인해 빌드가 손상될 수 있습니다.

☑️ 선택 사항: Edgegap Server Hosting 메뉴(계층 창에서 마우스 오른쪽 버튼 클릭 / 에서)에서 포트 검증 및 환경 부트스트래핑을 위한 netcode 전용 스크립트를 초기 서버 씬에 추가하세요.

circle-info

단계 Unity를 완료하면 포트 검증 스크립트가 netcode 주소 또는 포트가 Edgegap의 앱 버전 포트 매핑 구성과 일치하지 않을 경우 경고를 로그에 남깁니다.

circle-check

☑️ 구성이 만족스러우면 서버 빌드를 클릭하고 프로세스가 끝날 때까지 기다린 뒤 Unity 콘솔에 새 오류가 없는지 확인하세요. 이 단계를 완료하면 프로젝트 루트에 새 폴더가 생성됩니다 - Builds/EdgegapServer/ServerBuild .

✅ 이제 다음 단계로 진행할 수 있습니다.

chevron-right문제 해결 및 FAQhashtag

Unity: 지원되는 단독 대상은 OpenXR이 있는 Windows x64와 OSX뿐입니다.

  • 서버를 빌드하기 전에 패키지를 열고 OpenXR을 비활성화하세요.

  • OpenXR 플러그인은 클라이언트에만 필요하며 Linux 서버 빌드와 호환되지 않습니다. 서버 빌드에서 제외해도 기능은 손실되지 않습니다.

🐋 3. 서버 컨테이너화

개발자 팀에서 작업한다는 것은 코드를 공유한다는 뜻입니다. 문제가 생겼을 때 듣고 싶지 않은 말은 “내 컴퓨터에서는 잘 되는데요”일 것입니다. 게임 서버는 어떤 머신에서도 안정적으로 실행되어야 합니다. 성공적인 게임의 서버는 전 세계 수천 대의 서버 머신에서 실행되기 때문입니다.

서버의 안정성을 높이기 위해 Docker를 사용합니다. Docker는 운영체제 수준까지 모든 서버 코드 종속성이 서버가 어디서 어떻게 시작되든 항상 정확히 동일하도록 보장하는 가상화 소프트웨어입니다.

☑️ 우선 검증 버튼을 눌러 다음을 완료했는지 확인하세요. 개발자 도구.

☑️ 다음 옵션을 구성할 수 있습니다(또는 기본값 유지):

  • 빌드 경로 는 서버 빌드 산출물의 상대 경로입니다. 우선 기본값을 유지합시다.

circle-exclamation
  • 이미지 이름 은 출시에 앞서 서버 빌드를 식별하는 고유한 이름입니다.

    • 보통 게임 이름을 포함합니다. 예: “my-game-server”.

  • 이미지 태그 는 이미지의 특정 버전을 가리키는 식별자입니다.

    • “빌드 산출물”이라는 용어는 때때로 이미지의 특정 버전을 의미하는 데 사용됩니다.

    • 타임스탬프는 태그로 아주 좋습니다. 예: 2024.01.30-16.23.00-UTC .

  • Dockerfile 경로 는 이미지의 레시피를 사용자 지정하는 데 사용할 수 있습니다.

    • 지금은 기본 설정을 유지하는 것을 권장합니다. 나중에 섹션에서 더 읽어볼 수 있습니다. Unity.

  • 선택적 Docker 빌드 매개변수 는 Docker에 더 세부적인 지침을 주는 데 사용할 수 있습니다.

☑️ 구성이 만족스러우면 Docker로 컨테이너화를 클릭하고 프로세스가 끝날 때까지 기다린 뒤 Unity 콘솔에 새 오류가 없는지 확인하세요. 이 단계를 완료하면 로컬 머신에 새 이미지가 나타납니다. Docker Desktop의 Local(기본값) 아래 Images 탭에서 확인하거나, docker CLI에서 다음을 실행해 확인할 수 있습니다. docker images .

✅ 이제 다음 단계로 진행할 수 있습니다.

chevron-right문제 해결 및 FAQhashtag

/bin/bash: docker: command not found 또는 Packages\com.edgegap.unity-servers-plugin\Editor를 찾을 수 없습니다

  • 먼저, 다음을 완료했는지 확인하세요. 개발자 도구.

  • Edgegap 계정 인증을 완료했는지 확인하세요. 이메일로 인증 링크를 받았어야 합니다.

  • Docker Desktop을 업데이트한 후 일부 설정이 초기화되었을 수 있습니다. Docker Desktop 설정 / 고급으로 이동하여 “Docker CLI 도구 설치를 구성하는 방법 선택:”에서 “System (requires password)”를 선택해 보세요.


docker build에는 정확히 1개의 인수가 필요합니다

  • 이미지 태그에 공백 문자(스페이스, 탭)가 포함되지 않았는지 확인하세요. 이미지 태그 값을 다시 입력하면 실수로 그런 문자를 복사하지 않았는지 확인할 수 있습니다.


(HTTP code 400) unexpected - invalid tag format


ERROR: failed to solve: ubuntu:22.04: failed to resolve source metadata for http://docker.io/library/ubuntu:22.04: failed to authorize: failed to fetch oauth token

  • 중국에 계신가요? Great Firewall 때문에 연결이 끊길 수 있습니다. 명령줄에서 수동으로 다음을 실행해 보세요. docker pull ubuntu:22.04 (Win+R을 눌러 명령줄을 열고 그다음 다음을 입력하세요 cmd 그리고 Enter).


System.IndexOutOfRangeException: 배열의 범위를 벗어난 인덱스입니다.

  • ZIP을 다운로드하여 Unity 빠른 시작 플러그인을 설치했다면 Unity Editor 캐시가 손상되었을 수 있습니다. 플러그인 복사본을 삭제하고 git URL 또는 Unity Asset Store를 통해 다시 설치해 보세요. 이제 Newtonsoft.JSON 패키지는 다른 소스와 함께 자동으로 포함되므로 더 이상 필요하지 않아야 합니다.


내 Docker 이미지 크기가 매우 큽니다(1GB 초과) / 너무 작습니다(100mb 미만). 괜찮은가요?

  • 서버를 실행하고 성공적으로 연결할 수만 있다면(다음을 참조) 일부 경우에는 괜찮을 수 있습니다. Unity). 그렇지 않다면 빌드 옵션을 검토하고 기본값으로 재설정한 다음, 옵션을 하나씩 추가하며 빌드 크기에 어떤 영향을 주는지 확인해 보세요. 또한 다음도 참조하세요. Unity.


이 문서 어디에도 언급되지 않은 다른 문제가 발생하고 있습니다.

🧪 4. 로컬에서 서버 테스트

☑️ 다음 옵션을 구성할 수 있습니다(또는 기본값 유지):

  • 서버 이미지 태그 를 이전 단계에서.

    • 플러그인으로 마지막으로 빌드한 태그를 기본값으로 사용합니다.

  • 선택적 Docker 실행 매개변수 는 여러 포트를 노출하거나 macOS 머신에서 이미지를 실행할 때 사용할 수 있습니다.

    • 필요한 경우 컨테이너에 여러 포트를 게시할 수 있으며, 매개변수 -p {internal port}/{protocol} 을 각 포트마다 추가하면 됩니다. 예를 들어 -p 8080/tcp -p 7770/udp 를 사용하여 서버 포트를 게시하고 매핑하여 8080 TCP 연결용 임의의 외부 포트와 서버 포트 7777 를 UDP 연결용 임의의 외부 포트에 동시에 연결할 수 있습니다.

    • Transport 또는 netcode 전용 설정에서 서버 포트 구성을 찾으세요.

    • ARM 아키텍처 머신(macOS M1, M2, M3 등)을 사용 중이라면 선택적 Docker 빌드 매개변수에 다음 옵션이 포함되어 있는 것을 볼 수 있어야 합니다: --platform=linux/amd64 .

☑️ 구성이 만족스러우면 로컬 컨테이너 배포를 클릭하고 프로세스가 끝날 때까지 기다린 뒤 Unity 콘솔에 새 오류가 없는지 확인하세요. 이 단계를 완료하면 새 컨테이너가 시작됩니다 개발 머신에서.

circle-info

자세한 내용은 Docker Desktop / Containers 또는 Docker CLI 명령을 참조하세요. docker ps .

☑️ 이제 다음 단계입니다. Unity Editor 게임 클라이언트를 로컬 Docker 컨테이너에 연결하여 서버 이미지가 제대로 작동하는지 확인하세요. netcode 클라이언트 설정을 찾아 다음을 입력합니다:

  • localhost 또는 127.0.0.1 (대부분의 경우 동일) 을 서버 IP 대신 사용하고,

  • Docker Desktop / Containers / edgegap-server-test에서 확인되는 무작위 외부 포트 값.

✅ 이제 다음 단계로 진행할 수 있습니다.

chevron-right문제 해결 및 FAQhashtag

Unity Editor 게임 클라이언트를 사용해 로컬 Docker 컨테이너에 연결할 수 없습니다.

  • 먼저 컨테이너 상태가 Up인지, Restarting 또는 Exited가 아닌지 확인하세요. 이는 런타임 예외를 의미합니다. 컨테이너가 실행 중이 아니라면 Docker Desktop의 Containers 탭(컨테이너를 클릭) 또는 다음을 사용해 로그를 확인하세요. docker logs {container_id} --timestamps 를 docker CLI에서 실행하세요.

  • 다음으로 서버 빌드의 Network Manager 포트 설정이 선택적 Docker 실행 매개변수에 게시된 포트와 일치하는지 확인하세요. 일치하지 않으면 이 입력 필드의 값을 재설정하거나 수동으로 변경하여 {container} 포트를 Network Manager 설정과 맞추세요. netcode 설정에서 프로토콜을 찾으세요.

  • 마지막으로 Unity Editor 게임 클라이언트 netcode 설정이 선택적 Docker 실행 매개변수 에 게시된 포트를 사용하고 있는지 확인하세요(위 스크린샷 참조).


(Segmentation fault) - core dumped

  • ARM 아키텍처 머신(macOS M1, M2, M3 등)을 사용 중이라면 선택적 Docker 빌드 매개변수에 다음 옵션이 포함되어 있는 것을 볼 수 있어야 합니다: --platform=linux/amd64 . 일치하지 않으면 이 입력 필드의 값을 재설정해 보세요.


SceneObjects에서 9120233082191360994의 SceneId를 찾을 수 없습니다.

  • 이는 로드하려는 씬이 빌드에 올바르게 포함되지 않았음을 의미할 수 있습니다. 이는 이전 플러그인 버전에서 알려진 문제입니다. 해결하려면 netcode 통합 버전을 업데이트하거나 Edgegap 플러그인 업데이트arrow-up-right.


http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed


Curl error 35: Cert handshake failed. Fatal error. UnityTls error code: 7

☁️ 5. Edgegap에 업로드

☑️ 다음 옵션을 구성할 수 있습니다(또는 기본값 유지):

  • 애플리케이션 이름 은 Edgegap에서 이미지 이름과 같을 수도 있고 사용자 지정할 수도 있습니다.

    • 우선은 이미지 이름을 복사하도록 선택했습니다.

  • 애플리케이션 버전 은 Edgegap에서 태그와 같을 수도 있고 사용자 지정할 수도 있습니다.

    • 타임스탬프는 앱 버전 이름으로 아주 좋습니다. 예: 2024.01.30-16.50.20-UTC .

    • 여러 애플리케이션 버전이 같은 이미지 태그를 가리킬 수 있습니다. 예: v1.1.0dev .

    • 다음에서 더 알아보기 앱 및 버전 나중에.

  • 서버 이미지 이름 단계에서 Unity.

  • 서버 이미지 태그 단계에서 Unity.

circle-check

☑️ 구성이 만족스러우면 이미지 업로드 및 앱 버전 생성를 클릭하고 프로세스가 끝날 때까지 기다린 뒤 Unity 콘솔에 새 오류가 없는지 확인하세요.

☑️ 다음으로 이동합니다. 대시보드arrow-up-right에서 선택적 설정을 구성할 수 있습니다. 이 단계를 완료하면 새 애플리케이션 버전이 생성되고arrow-up-right또한 빌드 산출물에 태그가 지정되어 Edgegap의 컨테이너 레지스트리에 업로드됩니다arrow-up-right.

☑️ 이제 새 애플리케이션 버전에 사용할 포트를 정의하라는 안내가 표시됩니다. 단계 Unity 에서 Transport 또는 netcode 전용 설정과 동일한 서버 포트 값을 설정하세요.

✅ 이제 다음 단계로 진행할 수 있습니다.

🚀 6. 클라우드에 배포

☑️ 이제 최종 테스트를 수행하고 Unity Editor 게임 클라이언트를 클라우드 배포에 연결합니다. 배포의 다음 항목에서 게임 클라이언트 연결 정보를 입력하세요:

  • Host URL 서버 IP를 가리키는 값으로, 보통 NetworkManager 컴포넌트에 있습니다.

  • 외부 포트 다음에 매핑되는 서버의 내부 리스닝 포트이며, 보통 Transport 컴포넌트에 있습니다.

chevron-right문제 해결 및 FAQhashtag

클라이언트를 서버에 연결할 수 없음 - 요청 시간이 초과되었습니다. , 요청 시간이 초과되었습니다 , ConnectionFailed 또는 포트 검증 실패


배포가 중지/재시작되었고 더 이상 로그에 접근할 수 없습니다.


내 배포가 X분 후 자동으로 중지되었습니다.

  • 무료 요금제 배포는 60분 제한이 있습니다. 계정을 업그레이드하는 것을 고려해 주세요.

  • 모든 배포는 서버 정리 정책에 따라, 인프라 유지보수 및 배포가 제대로 종료되지 않았을 때 예상치 못한 비용이 발생하는 것을 방지하기 위해 24시간 실행 후 종료됩니다. 장시간 실행되는 서버의 경우 프라이빗 플릿지속성.

  • 다음을 참조하세요. 배포 배포가 중지되는 모든 원인을 알아보세요.


와 함께 사용해 보세요.

  • 내 배포는 Ready 상태이지만 그 이후에도 몇 분 동안 연결할 수 없습니다.

  • 배포가 Ready가 되면 게임 엔진 초기화가 시작됩니다. 이 과정은 수초에서 수분까지 걸릴 수 있으며, 그 동안 서버는 플레이어 연결을 받지 않습니다.

  • 이 시간을 줄이기 위해 서버 초기화를 최적화하는 것을 고려하세요.

  • 클라이언트와 서버가 동시에 초기화(언리얼 엔진의 경우 이동 포함)하면서 상태를 동기화할 수 있도록 로딩 씬을 추가하는 것을 고려하세요.


내 Meta Quest 기기에서 다음 오류가 발생합니다. HTTP 0: 대상 호스트를 확인할 수 없습니다 .

  • Unity 앱을 Android 대상으로 빌드할 때, Internet Access 권한이 출력 APK 클라이언트 빌드 산출물에서 자동으로 제거될 수 있습니다.

  • 권한을 다시 추가하세요(이후 클라이언트를 다시 빌드해야 합니다):

    • Project Settings / OpenXR / ⚙️ Meta Quest Support / Force Remove Internet Permissions(체크 해제).

    • Player Settings / Internet Access(필수로 설정).


플레이어가 내 배포를 떠나면 어떻게 되나요?

  • 기본적으로 서버는 플레이어 연결을 거부하지 않습니다. 플레이어 인증은 개발자 몫입니다. 다양한 방법과 플레이어 인증 제공업체를 사용할 수 있기 때문입니다.

  • 게임 클라이언트는 예기치 않은 클라이언트 충돌 시 재연결을 시도하기 위해 연결 정보를 로컬에 저장할 수 있습니다.

  • 플레이어가 진행 중인 게임에 참여할 수 있도록 하려면 심층 살펴보기 또는 세션arrow-up-right.


내 서버는 Ready 상태가 된 후 CPU 사용률이 100%로 표시됩니다.

  • 게임 엔진은 서버 초기화 중 CPU 집약적인 작업을 수행하는 경향이 있으므로 이는 문제가 아닐 수 있습니다. 배포 시작 후 2~3분이 지나도 CPU 사용량이 떨어지지 않으면 서버를 최적화하거나 앱 버전 리소스를 늘려야 할 수 있습니다.

  • 틱 속도를 낮추면 서버가 수행하는 메시징 작업이 줄어들어 CPU 사용량에 영향을 줄 수 있습니다.

  • Mirror netcode를 사용 중이라면 “Auto Start Server”arrow-up-rightNetworkManager 에서 선택되어 있어야 합니다. 서버를 다시 빌드하고, 업로드하고, 재배포하세요.

  • FishNet netcode를 사용 중이라면 “Start on Headless”arrow-up-rightServerManager에서 선택되어 있어야 합니다. 서버를 다시 빌드하고, 업로드하고, 재배포하세요.

  • 무료 요금제에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.

  • 새 앱 버전을 만들 때 할당된 리소스를 늘릴 수 있습니다. 서버나 이미지를 다시 빌드하지 않고도 대시보드에서 앱 버전을 복제하여 필요에 따라 이 값을 조정할 수 있습니다.


내 배포가 반복적으로 재시작되며 오류가 표시됩니다. OOM kill

  • 할당된 메모리 양을 초과해서 발생합니다. 오브젝트 풀링, 압축, 또는 씬에서 불필요한 오브젝트 제거를 통해 메모리 사용을 최적화하는 것을 고려하세요.

  • 프로젝트가 다음을 포함하는 기본 씬을 로드하고 있는지 확인하세요. NetworkManager 그리고 해당 씬이 Unity의 Build Settings에 포함되어 있는지 확인하세요.

  • 무료 요금제에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.

  • 새 앱 버전을 만들 때 할당된 리소스를 늘릴 수 있습니다. 서버나 이미지를 다시 빌드하지 않고도 대시보드에서 앱 버전을 복제하여 필요에 따라 이 값을 조정할 수 있습니다.


때때로 서버의 메모리(RAM) 사용량이 높은 값으로 급증하는데, 문제가 되나요?

  • 할당된 앱 버전 메모리 양을 넘지 않는 한 문제되지 않습니다.

  • 할당된 앱 버전 메모리 양을 초과하면 OOM kill 가 발생합니다(위 참조).


같은 머신에서 실행 중인 다른 서버가 내 서버 성능에 영향을 주나요?

  • 아니요. 우리 플랫폼은 할당된 리소스가 다른 스튜디오나 공유 인프라의 다른 서버에서 사용되지 않도록 보장합니다. Edgegap에서는 시끄러운 이웃이 없습니다.

👉 다음 단계

배포 중지

다양한 방법을 알아보세요. 배포를 중지하는 매치가 끝나고 플레이어가 떠난 후에.

부드러운 종료를 위해 게임에 자체 중지 API를 구현할 것을 강력히 권장합니다:

chevron-rightUnity C# 자체 중지 API 코드 스니펫 예시hashtag
circle-info

Unity 서버는 충돌하거나 메모리가 부족할 경우 자동으로 재시작됩니다.

주입된 변수

주입된 환경 변수에 접근하여 배포 ID, 서버 IP 주소, 서버 위치 등의 유용한 정보를 읽어보세요. 각 배포에는 자동으로 다음이 포함됩니다:

현재 인스턴스가 게임 클라이언트인지 서버인지 확인 Edgegap 변수가 설정되었는지 확인하여

매치메이킹

배포를 수동으로 시작하고 URL과 포트를 붙여넣는 것만으로는 실시간 게임에 충분하지 않습니다.

circle-check

서버 빌드 최적화

마지막 빌드 이후 변경된 에셋만 다시 빌드하세요.

다음을 사용하는 것을 고려하세요. Unity의 증분 빌드arrow-up-right 빌드 시간을 단축하기 위해.

서버 실행에 꼭 필요한 것만 포함하세요.

이미지 크기를 줄이려면 메쉬의 정적 배칭을 비활성화하세요.

이미지 크기를 줄이려면 메쉬를 압축하세요.

리소스의 조건부 지연 로딩을 구현하세요.

다음을 사용하는 것을 고려하세요. 다단계 Docker 빌드(링크)arrow-up-right.

  • 대형 서버 종속성을 별도 이미지로 분리하여 다단계 빌드에서 재사용하세요. Docker는 각 레이어를 캐시하고 이전 버전을 단순히 재사용하며, 별도 지시가 없는 한 이 부분은 업로드를 건너뛰므로 대역폭과 업로드 완료까지 기다리는 시간을 절약할 수 있습니다.

  • Dockerfile 명령 중 하나가 왜 오류를 내는지 잘 모르겠다면 로컬에서 디버깅해 보세요. 문제가 발생하기 직전에 새 스테이지를 만들고(두 번째 FROM 명령을 추가), --target 을 사용해 빌드 프로세스가 문제의 스테이지에서 멈추도록 지시한 뒤 docker exec -it {container} /bin/bash 를 사용해 컨테이너 내부의 대화형 터미널로 들어가세요. 이후 기본 이미지의 셸 명령을 사용해 더 조사할 수 있습니다(예: top 우분투에서).

서버 이미지 사용자 지정

빌드 크기 최적화, 불필요한 종속성, 더 복잡한 시작 프로세스 때문에 이미지에 대해 더 많은 제어가 필요한 사용자를 위해 자체 Dockerfile 추가도 지원합니다. 다음 단계에서 사용자 지정 Dockerfile 경로를 선택적으로 제공할 수 있습니다. Unity이제 직접 해 볼 수 있는 몇 가지 팁과 모범 사례를 공유하겠습니다.

웹소켓 또는 HTTPS 요청 사용 시 문제가 있나요?

  • 다음 오류가 발생한다면 Curl error 35: Cert handshake failed. Fatal error. UnityTls error code: 7 낙담하지 마세요. 이는 만료된 루트 인증 기관 인증서를 포함하는 이전 기본(FROM) 이미지의 알려진 문제입니다. 더 새로운 기본 이미지 버전(예: ubuntu:22.04)으로 업데이트하고 update-ca-certificates 를 실행하면 해결할 수 있습니다. Dockerfile에 다음을 추가하세요:

circle-info

벽에 부딪혔나요? 우리는 우리의 커뮤니티 디스코드arrow-up-right 에서 기꺼이 도와드립니다.

마지막 업데이트

도움이 되었나요?