zeuz로 호스팅하기

zeuz는 유니티, Bolt Pro 및 Photon Cloud로 작성된 매치메이킹용 전용 게임 서버 어플리케이션을 호스팅하는 서비스입니다. 이 솔루션은 가상 시스템과 결합된 베어 메탈 서버의 하이브리드 인프라를 지원합니다.

동작 방법

zeuz workflow

두 명의 플레이어가 결투 게임 모드로 전환되는 흐름은 다음과 같습니다.

  1. 클라이언트 1이 Photon Cloud에 접속하고 룸을 생성합니다
  2. 클라이언트 2가 Photon Cloud에 접속하여 동일한 룸에 참여합니다
  3. Photon Cloud가 zeus API를 호출하여 게임 서버 인스턴스를 예약합니다
  4. 모든 클라이언트들에게 Photon Cloud는 목표 게임 서버의 IP + Port를 리턴합니다
  5. 모든 클라이언트들은 Photon Cloud 에서 연결해제하고 게임 서버로 연결합니다

Back To Top

Zeuz로 연락하기

zeuz.io를 방문하여 데모를 요청합니다. 관리화면 접근 권한을 얻게될 것 입니다

Back To Top

중요 용어

  • Resource Profile: 하드웨어 구성용 템플릿 (Bare Metal / VM, provider, ...)
  • Game Profile: 필요한 모든 모델 또는 지도의 템플릿 (2vs2, 3vs3, Raid, ...)
  • Resource: 기본적으로 단일 머신
  • Service: 게임 서버 프로세스
  • Server Group: 게임 프로파일을 리소스 프로파일과 쌍으로 구성하고 확장 설정을 정의

Back To Top

리포지토리

게임 서버 바이너리의 경우 스팀 유틸리티 어플리케이션을 만들어 주십시오. 올바른 플랫폼(윈도우즈/리눅스)이 선택되었는지 확인하십시오. - 클라이언트가 아닌 게임 서버 바이너리에 따라 다릅니다.

게임을 개발할 때 전용 서버 빌드를 이 리포지토리에만 배포하면 rest가 자동으로 동기화됩니다. 자세한 내용은 Zeuz 팀에게 직접 연락하고 서버 어플리케이션에 사용할 Steam CDKey를 첨부합니다.

Back To Top

리소스 프로파일

Zeuz 팀과 상의하여 설정해 주시기 바랍니다.

Back To Top

API 키 생성

Zeuz 관리화면에서:

  1. API를 클릭합니다
  2. Add API Key를 클릭합니다
  3. Access KeyToken Key가 게임 프로파일의 아규먼트로서 사용될 것 입니다

Back To Top

게임 프로파일 생성

Zeuz 관리화면에서:

  1. Game Profiles 클릭
  2. + New Game Profile 클릭
  3. Name (예, Deathmatch)입력
  4. Activated 활성화
  5. Next 클릭
  6. Repository 선택
  7. Game Type = Base
  8. Query Protocol = Counter Strike: Source
  9. Running Condition = 윈도우용 imagePath , 리눅스용 processConnected
  10. Executable Path 설정(예, GameServer.exe)
  11. 필수 Arguments 추가(아래는 전체 예제입니다)
    • -accessKey [ACCESS_KEY]
    • -tokenKey [TOKEN_KEY]
    • -ip {ip.primary}
    • -gamePort {port.gamePort}
    • -queryPort {port.queryPort}
    • -groupID {servergroupId}
    • -profileID {gameprofileId}
    • -serviceID {serviceId}
  12. 사용자 지정Arguments 추가(Unity 용, 내가 지정, ...)
    • -batchmode
    • -nographics
  13. Can Query Service 활성화
  14. Auto Restart 활성화
  15. Next 클릭
  16. Add Port Range (gamePort 이름부여, 값 설정)
  17. Add Port Range (queryPort 이름부여, 값 설정, IsQuery 활성화)
  18. Click Save

최종 실행 커맨드 예 ({ } 내의 값은 실행시 교체될 것 입니다):

GameServer.exe -accessKey xQVy3wFosKPkJhO8EqvE9D7ELowNuHI1pEBTsnPN -tokenKey 40JUKSKB8IZX5933YPZB -ip {ip.primary} -gamePort {port.gamePort} -queryPort {port.queryPort} -groupID {servergroupId} -profileID {gameprofileId} -serviceID {serviceId} -batchmode -nographics

Back To Top

서버 그룹 생성

Zeuz 관리화면에서:

  1. Server Groups 클릭
  2. + Create New Server Group 클릭
  3. Name (예, EU) 입력
  4. Next 클릭
  5. 원하는 리소스 스케일링 설정
  6. Next 클릭
  7. 서비스 스케일링 설정
  8. 이 그룹에 사용할 게임 프로파일 및 리소스 선택
  9. Save 클릭

Back To Top

Bolt 어플리케이션 설정

  1. Photon 관리화면으로 이동
  2. 신규 Bolt 어플리케이션 생성 / 기존 어플리케이션 관리
  3. zeuz 통합 활성화
  4. 구성에서 zeuz API 키 입력
  5. 룸에 충분한 플레이어들이 있을 때 게임 서버(서비스)를 예약을 원하면 Allow early reservation 활성화(예, 6/8)

Back To Top

서버 어플리케이션 요구사항

전용 서버가 Zeuz 자동 확장이 올바르게 작동하기 위한 중요한 단계가 있습니다.

using Bolt.zeuz;

// Initialize zeuz integration early, Awake() preferred
Zeuz.Initialize(true);

// Deinitialize when the game is over, all clients already disconnected and the game server instance can be destroyed
Zeuz.Deinitialize(true);

Bolt 서버는 Zeuz.IPZeuz.GamePort를 리슨하고 있어야 합니다. 게임 프로파일 / 모드를 식별하기 위해 Zeuz.ProfileID를 사용할 수 있습니다.

The parameter in Zeuz.Initialize(true) 그리고 Zeuz.Deinitialize(true) 내의 파라미터는true 인 경우 비예약 API 호출이 실행될 것 입니다. 이렇게 하면 현재 프로세스(서비스)가 Free 되어 집니다.

Back To Top

클라이언트 어플리케이션 요구사항

using Bolt.zeuz;

// Use ZeuzClient for matchmaking instead of LoadBalancingClient
ZeuzClient client = new ZeuzClient();
...
// Register delegates to get information about dedicated server
client.OnServerInfoReceived += OnServerInfoReceived;
client.OnServerNotAvailable += OnServerNotAvailable;
...

// It’s mandatory to pass Server Group ID and Game Profile ID to Photon Cloud when creating/joining a room.
// Only players with same IDs can play together.
RoomOptions roomOptions = client.GetRoomOptions(serverGroupID, gameProfileID);
...
client.OpJoinOrCreateRoom(roomName, roomOptions, TypedLobby.Default);

// Both RoomOptions and room properties are supported, just use what you need for the matchmaking
Hashtable roomProperties = client.GetRoomProperties(serverGroupID, gameProfileID);
...
client.OpJoinRandomRoom(roomProperties, maxPlayers);

// You can explicitly tell how many players are needed for a game server to be reserved.
// This way you can start a match with 6/8 players, other players join later.
// Be sure "Allow early reservation" is enabled in Photon Dashboard.
RoomOptions roomOptions = client.GetRoomOptions(serverGroupID, gameProfileID, minPlayers);

룸이 가득차면 전용 서버 인스턴스가 예약됩니다. 클라이언트는 OnServerInfoReceived 에서 IP + 포트를 수신합니다. 오류(서비스 소진, 잘못된 설정 등)가 발생하면 OnServerNotAvailable이 호출됩니다.

Back To Top

로컬 서버 실행하기

이 기능은 개발 및 디버깅을 목적으로 합니다.

  1. 인수로 게임 server(-ip, -gamePort 그리고 -profileID을 사용한다면 필수)를 로컬로 실행합니다. 예: GameServer.exe -ip 127.0.0.1 -gamePort 2500 -profileID 69
  2. client에서는 룸 생성시 사용된 동일한 IP + Port를 사용하면됩니다.
        RoomOptions roomOptions = client.GetRoomOptions(serverGroupID, gameProfileID, "127.0.0.1", 2500);
    ...
    client.OpCreateRoom(roomName, roomOptions, TypedLobby.Default);
  3. 룸이 꽉 차면 모든 플레이어는 zeuz로부터 로컬 서버 정보를 대신 받습니다. 이렇게 하면 프로덕션 플레이어를 로컬 게임 서버 인스턴스(공용 IP 필요) 및 디버그로 전달할 수도 있습니다 :)
  4. Unity Editor에서 게임 서버를 직접 실행하려면 커맨드 아규먼트를 지정하는 대신 라인 아규먼트로 설정 할 수 있습니다:
        Zeuz.SetServerOverrides("127.0.0.1", 2500);

Back To Top

출시

다음은 게임 서버를 효율적으로 실행하고 플레이어에 최상의 사용자 환경을 제공하기 위한 몇 가지 조언/요구 사항입니다.

  • 서버 빌드 크기를 최소화합니다. 텍스처나 오디오와 같은 가장 큰 부분에 집중하십시오. 이렇게 하면 어플리케이션 로딩 시간이 단축되고 메모리가 절약됩니다. => 단일 시스템에서 더 많은 프로세스를 실행할 수 있습니다. => 비용을 절약할 수 있습니다.
  • 윈도우즈 및 Linux 플랫폼 빌드가 지원됩니다.
  • Linux 세부 정보: mesa-utils는 Unity를 실행하기 위해 필요합니다. HOME 환경 변수는 기본적으로 설정되어 있지 않습니다. => 에셋 번들이 로드되지 않습니다.
  • 보다 쉬운 문제를 해결하려면 실행 파일이 있는 폴더에 Unity 로그를 저장하십시오. 나중에 FTP를 통해 액세스할 수 있습니다.
  • 룸에서 예약된 게임 서버로 직접 데이터를 전달하는 것은 지원되지 않습니다.

기술문서 TOP으로 돌아가기