This document is about: FUSION 1
SWITCH TO

전용 서버

Level 4

개요

Fusion 전용 서버 샘플전용 게임 서버 개념을 기반으로 Fusion 프로젝트를 어떻게 구축할 수 있는지 보여주기 때문에 게임 서버 역할을 할 헤드리스 게임 인스턴스를 구축할 수 있습니다.

전용 서버는 서버 모드에서 시작된 Fusion 피어에 불과합니다. 즉, 로컬 플레이어가 없다는 의미이며 전체 게임 상태에 대한 상태 권한의 역할을 합니다. 샘플은 인스턴스가 헤드리스 모드에서 실행 중인지 여부를 감지하여 클라이언트로 시작하여 임의의 게임 세션에 참여하거나 로비에 참여하고 특정 세션을 선택하여 참여할 수 있는 간단한 메뉴와 함께 서버 모드에서 자동으로 시작할 수 있도록 합니다.

시작하기 전에

샘플을 실행하기 전에, 먼저 PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정의 App Id Fusion 필드에 붙여 넣습니다(Fusion 메뉴에서 접근 가능).

다운로드

버전 릴리즈 일자 다운로드
1.1.6 Jun 02, 2023 Fusion Dedicated Server 1.1.6 Build 194

프리팹

  • Server_NetworkRunner.prefab: 서버에서 사용하는 NetworkRunner 프리팹. 게임 전체를 관리하기 위한 스크립트가 포함되어 있으며, 주요 스크립트는 아래에 설명된 GameManager입니다.
  • Server_Manager.prefab: 현재 게임 인스턴스가 헤드리스 모드에서 실행되고 있는지 확인하고 Server_NetworkRunner.prefab을 생성하며 Fusion Server를 사용자 지정하는 데 필요한 인수도 캡처합니다.
  • Client_NetworkRunner.prefab: 클라이언트에서 사용하는 NetworkRunner 프리팹. 플레이어의 입력을 캡처하는 역할도 합니다.
  • Client_Manager.prefab: 간단한 GUI를 만들어 클라이언트가 특정 세션 또는 임의 세션에 참여할 수 있도록 하거나, 로비에 참여하여 사용 가능한 세션을 확인할 수 있습니다. Client_NetworkRunner.prefab을 사용합니다.
  • Player.prefab: 클라이언트가 게임에 참여할 때 서버에 의해 생성되는 단순 플레이어.

  • 0.Launch: 시작 씬은 Server_Manager.prefab 인스턴스를 보유하고 있으며 헤드리스 모드에서 실행될 때 서버가 Game 씬을 로드하는 출발점으로 사용되거나 일반 시나리오에서 Menu 씬만 로드합니다.
  • 1.Menu: 이 씬은 클라이언트 인스턴스에서만 사용되며 Client_Manager.prefab에 의한 간단한 메뉴 빌드를 보여줍니다.
  • 2.Game: 플레이어가 생성되고 이동할 수 있는 기본적인 게임 씬.

스크립트

  • SceneDefs: 보다 쉽게 참조할 수 있도록 씬 목록을 인덱스별로 저장합니다.
  • CommandLineUtils: 인스턴스가 헤드리스 모드에서 실행 중인지 확인하고(명령줄에 -batchmode -nographics 포함) 명령줄을 통해 전달된 인수에서 값을 가져오는 메서드 집합입니다.
  • ServerManager: CommandLineUtils를 사용하여 게임 서버를 시작하거나 Menu 씬을 로드할 수 있습니다. 서버를 시작하는 경우 다음 인수를 로드하려고 합니다:
    • -session: 서버에서 사용할 사용자 지정 세션 이름
    • -region: 서버를 연결해야 하는 사용자 지정 영역. 지원되는 지역 목록.
    • -lobby: 세션이 생성될 사용자 지정 로비.
    • -port: 시작할 때 서버가 바인딩을 시도할 사용자 지정 포트입니다.
    • -P: 사용자 지정 속성의 집합.
  • GameManager: 서버에서만 실행되며 가입/탈퇴 시 기본적으로 플레이어를 생성/제거합니다.
  • ServerEventsInfo: 서버 측에서 Fusion의 가장 일반적인 이벤트를 기록합니다.
  • ClientManager: 클라이언트 메뉴를 제어하고 Client_NetworkRunner.prefab을 사용하여 게임 서버에 연결합니다.
  • PlayerController: 클라이언트의 입력을 읽고 Player NetworkObject를 이동하는 간단한 컨트롤러.
  • InGameMenu: Game 씬에서 클라이언트로 실행할 때 Shutdown 버튼이 표시됩니다.

실행하는 방법

샘플을 실행하려면 Scene in Build(Launch, Menu, Game)에서 세 씬이 모두 올바른 순서인지 확인합니다. 이렇게 하면 애플리케이션이 명령줄 인수를 확인하고 서버 또는 클라이언트를 시작할 수 있습니다. 각 모드를 시작하는 방법은 아래에 설명되어 있습니다.

전용 서버 모드

이 모드에서는 기본 설정 또는 시작 시 전달된 사용자 지정 인수를 사용하여 Game Server가 시작됩니다. 서버가 디스플레이나 시각적 표시 없이 실행되도록 되어 있다는 점을 고려하면, 몇 가지 필수 인수와 몇 가지 선택적 인수가 있습니다.

게임 서버는 두 가지 주요 빌드 대상을 사용하여 빌드 할 수 있습니다:

  • 독립 실행형 빌드: 메인 플랫폼(윈도우즈, 리눅스, MacOS)의 실행 파일을 빌드 하는 데 사용되는 일반적인 빌드 대상입니다. 이 경우에는 몇 가지 단점이 있습니다. (i) 빌드가 모든 게임 에셋을 포함하고 (ii) 실행되면 백그라운드에서 실행됩니다(프로세스를 종료하려면 프로세스를 종료해야 함);
  • 전용 서버 빌드: 이 빌드 대상은 유니티 2021.2+에서만 찾을 수 있으며, 이를 위해 특별히 설계되어 불필요한 파일을 제거하고 터미널과의 통합성이 향상되었습니다. 이 빌드 대상에 대한 자세한 내용은 여기를 참조하십시오.
Build Target Platform(예: 독립 실행형에서 전용 서버로)을 변경하는 경우 특정 대상에 대한 스크립트 정의 기호에 FUSION_WEAVER 기호가 정의되어 있는지 확인합니다. 그렇지 않으면 Fusion은 당신의 프로젝트를 만들어 낼 수 없을 것입니다.
Unity Standalone Build Target
Unity Dedicated Server Build Target (Unity 2021.2+)

빌드가 있는 폴더에서 시작하여 터미널 콘솔을 열고 다음을 입력합니다:

Unknown

.\FusionDedicatedServerSample.exe -batchmode -nographics -logFile output.log

이 정도면 Game Server를 실행하여 새로운 게임 세션을 만들고 모든 기본 설정을 사용하는 호스팅 머신의 위치를 기준으로 가장 빠른 지역에 게시할 수 있습니다. 이제 아규먼트를 분석해 보겠습니다:

  • -batchmode -nographics (필수): 헤드리스 모드에서 유니티 인스턴스를 실행합니다. 그것이 게임 서버의 시작을 촉발하는 계기가 됩니다.
  • -logFile output.log (선택): 이렇게 하면 서버의 모든 로그가 포함된 동일한 폴더에 output.log라는 이름의 파일이 생성됩니다.

위의 인수는 모두 유니티와 관련된 것이며 인수에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 앞에서 설명한 것처럼 Game Server는 몇 가지 예제 값으로 아래에 설명된 추가 인수를 구문 분석할 수 있습니다:

Unknown

.\FusionDedicatedServerSample.exe -batchmode -nographics -logFile output.log -session my-custom-session -region us -lobby my-custom-lobby -port 30001 -Pmap city -Ptype free-for-all

위의 호출을 통해 Game Server는 다음과 같이 됩니다:

  • -session <custom session name> (선택): my-custom-session이라는 이름으로 Game Session을 시작합니다. 기본값은 임의의 GUID입니다.
  • -region <region ID> (선택): US 지역으로 연결합니다. 기본값은 가장 빠른 지역 입니다;
  • -lobby <custom lobby name> (선택): Lobby my-custom-lobby라는 이름으로 Game Session을 게시합니다. 기본값은 ClientServer 로비입니다.
  • -port <custom port number> (선택): 30001 포트로 바인드 합니다. 기본값은 27015 입니다.
  • -P<property name> <value> (선택): 사용자 지정 속성 map = city 그리고 type = free-for-all을 설정합니다. 기본값은 빈 목록입니다.

위의 인수는 필수 사항이 아니므로 단독으로 사용하거나 특정 하위 집합을 혼합하여 사용할 수 있습니다. 게임 서버는 일단 시작되면 클라이언트가 참여하기를 기다렸다가 모든 클라이언트가 세션에서 연결이 끊어지면 자동으로 종료되고 닫힙니다.

API

서버 모드에서 Photon Fusion을 실행하는 것은 매우 간단하지만 서버가 실행될 호스트 시스템의 네트워크 특성에 따라 다르게 설정해야 할 수도 있습니다. 이러한 이유로 아래에는 GameMode.Server로 Fusion을 시작하는 세 가지 주요 방법이 나와 있습니다.

  1. 완전 자동: 피어가 시작되고 OS가 소켓 계층에 제공하는 사용 가능한 포트에 바인딩 됩니다. 이는 사전 정의된 포트가 필요하지 않은 대부분의 시나리오에서 작동합니다. STUN 프로토콜은 피어의 Public EndPoint(IP:Port)를 해결하는 데 사용됩니다. 이 기능은 주로 국내 인터넷 연결과 같이 기본적으로 포트를 차단하지 않는 일반 네트워크에 적합합니다.

C#

NetworkRunner.StartGame(new StartGameArgs() {
    GameMode = GameMode.Server
    // other args
});
  1. 사전 정의된 로컬 엔드포인트 & 자동 공개 엔드포인트: 사례 1과 유사하지만 여기서는 특정 로컬 엔드포인트Server에서 사용하도록 설정합니다. 동일한 포트에 바인드 된 다른 서비스가 있으면 피어가 시작되지 않으므로 피어를 사용할 수 있는지 확인합니다. 예제 코드에서 ServerEndPoint 192.168.0.10:27015에 바인딩 하려고 합니다. 이는 호스트 시스템의 네트워크 카드 하나와 연결된 IP와 사용 가능한 포트여야 합니다. 로컬 IP만 지정할 필요가 없고 포트만 지정할 경우 NetAddress를 사용합니다. 대신 NetAddress.Any(27015) (0.0.0.0:27015 의미)를 사용합니다. 호스트 방화벽에서 통신할 수 있도록 열려 있는 사용 가능한 포트 목록이 제한된 시나리오에 적합하므로 일부 특정 포트를 사용해야 합니다.

C#

NetworkRunner.StartGame(new StartGameArgs() {
  GameMode = GameMode.Server,
  Address = NetAddress.CreateFromIpPort("192.168.0.10", 27015) // or NetAddress.Any(27015)
  // other args
});
  1. 사전 정의된 로컬 및 공개 엔드포인트: 사례 2를 확장하여 피어의 로컬 엔드포인트공개 엔드포인트를 모두 설정할 수 있습니다. Fusion은 공개 엔드포인트 검색에 STUN 프로토콜을 완전히 사용하지 않고 인수로 전달된 프로토콜만 중계합니다. 이 예에서 피어는 사례 2와 동일한 로컬 엔드포인트에 바인딩 되지만 특정 퍼블릭 엔드포인트 10.0.0.1:27030도 사용합니다. CustomPublicAddress 인수는 호스팅 서비스가 로컬공개 엔드포인트 간의 매핑을 이미 제공하는 시나리오에서 사용하기 위한 것입니다.

C#

NetworkRunner.StartGame(new StartGameArgs() {
  GameMode = GameMode.Server,
  Address = NetAddress.CreateFromIpPort("192.168.0.10", 27015),
  CustomPublicAddress = NetAddress.CreateFromIpPort("10.0.0.1", 27030)
  // other args
});

클라이언트 모드

애플리케이션을 정상적으로 시작하기만 하면 일반적으로 더블 클릭하면 게임의 클라이언트 측에 대한 몇 가지 옵션과 함께 게임 창이 열립니다. 이를 통해 다음 작업을 수행할 수 있습니다:

  1. 세션 이름 필드를 채우거나 비워둔 상태에서 임의의 게임에 참여합니다.
  2. 기본 ClientServer 로비 또는 Custom Lobby 필드를 통해 지정된 사용자 정의 로비에 참여합니다.
    • 로비에 가입한 경우 해당 로비에서 이용 가능한 게임 세션 목록이 표시되고 참여 버튼을 클릭하여 게임에 참여할 수 있습니다.
    • 종료 버튼을 통해 로비에서 네트워크 러너를 종료하고 다시 시작할 수도 있습니다.

Game Server에 연결되면 각 클라이언트는 레벨 이동을 위해 일반 WASD를 사용하여 제어할 수 있는 플레이어를 한 명씩 받게 됩니다. 클라이언트가 Shutdown 버튼을 클릭하여 서버와 연결을 끊으면 Menu 씬이 다시 로드됩니다.

Back to top