zeuz社のサービスでホスティングする

zeuzは、Unity、Bolt Proで作られた専用ゲームサーバーアプリケーションをホスティングし、マッチメイキングにPhoton Cloudを使用するサービスです。 仮想マシンを組み合わせたベアメタルサーバーのハイブリッドインフラストラクチャをサポートしています。

使い方

zeuz workflow

2人プレイの対戦ゲームモード用のフローは以下です。

  1. クライアント1がPhoton Cloudに接続しルームを作成します。
  2. クライアント2がPhoton Cloudに接続し、クライアント1と同じルームに参加します。
  3. Photon CloudがzeuzのAPIを呼び出し、ゲームサーバーインスタンスを予約します。
  4. Photon CloudがIPとターゲットのゲームサーバーのポートを全クライアントに返します。
  5. 全てのクライアントがPhoton Cloudから切断され、ゲームサーバーに接続されます。

Back To Top

Zeuzとコンタクトをとる

zeuz.ioにアクセスしてデモのリクエストをします。ダッシュボードへのアクセス権が付与されます。

Back To Top

重要な用語

  • Resource Profile: ハードウェア設定用のテンプレート(ベアメタル、仮想マシン、プロバイダー…)
  • Game Profile: 希望するモードもしくはマップのテンプレート(2対2、3対3、レイドバトル…)
  • Resource: 基本的には単体のマシン
  • Service: ゲームサーバープロセス
  • Server Group: Game ProfileをResource Profileと紐づけ、スケーリング設定を定義します。

Back To Top

リポジトリ

ゲームサーバーバイナリーについては、Steam用アプリケーションを作成します。適切なプラットフォーム(windows/linux)が選択されていることを確認してください。これはクライアントではなく、ゲームサーバーバイナリに依存します。

ゲームを開発する際、専用サーバビルドをデプロイするのはこのリポジトリのみで、その他は自動的に同期されます。 詳細についてはzeuz運営事務局と直接コンタクトをとって、サーバーアプリケーション用のSteam CDキーを添付してください。

Back To Top

リソースプロファイル

zeuz運営事務局に相談の上、設定してもらってください。

Back To Top

APIキーの作成

zeuzのダッシュボードで以下を行ってください。

  1. APIをクリックします。
  2. Add API Keyをクリックします。
  3. Access KeyおよびToken Keyは、game profiles内で引数として使用されます。

Back To Top

ゲームプロファイルの作成

zeuzのダッシュボードで以下を行ってください。

  1. Game Profilesをクリックします。
  2. + New Game Profileをクリックします。
  3. Nameを入力します。 (例:デスマッチ)
  4. Activatedを有効化します。
  5. Nextをクリックします。
  6. Repositoryを選択します。
  7. Game Type は Baseを設定します。
  8. Query ProtocolでCounter StrikeをSourceにします。
  9. Running Conditionでは、Windows用にはimagePath、Linux用にはprocessConnectedにします。
  10. Executable Pathを設定します。 (例:GameServer.exe)
  11. 必須の引数を追加します。 (以下に全体の例を載せています。)
    • -accessKey [ACCESS_KEY]
    • -tokenKey [TOKEN_KEY]
    • -ip {ip.primary}
    • -gamePort {port.gamePort}
    • -queryPort {port.queryPort}
    • -groupID {servergroupId}
    • -profileID {gameprofileId}
    • -serviceID {serviceId}
  12. カスタムの引数を追加します。 (Unity指定、独自...)
    • -batchmode
    • -nographics
  13. Can Query Serviceを有効にします。
  14. Auto Restartを有効にします。
  15. Nextをクリックします。
  16. Add Port Range (gamePortに名前を付け、値を設定します。)
  17. Add Port Range (queryPortに名前を付け、異なる値を設定し、IsQueryを有効化します。)
  18. 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. このグループで使用するgame profilesとresourcesを選択します。
  9. Saveをクリックします。

Back To Top

Boltアプリケーションの設定

  1. Photonダッシュボードにアクセスします。
  2. Boltのアプリケーションを新規作成もしくは既存のBoltアプリケーションを処理します。
  3. zeuz統合を有効化します。
  4. 設定でzeuzのAPIを入力します。
  5. ルームに入室したプレイヤー数が十分になった際(例:8人中6人)にゲームサーバー(サービス)を予約する場合はAllow early reservationを有効にします。

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.IPおよびZeuz.GamePort上でリッスンするようにします。 Zeuz.ProfileIDを使用してゲームのプロファイルもしくはモードを把握します。

Zeuz.Initialize(true)およびZeuz.Deinitialize(true)内のパラメータは、 trueである場合にアンリザーブAPI呼び出しが実行されることを意味します。 これは現在の手順(サービス)を軽減します。

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窶冱 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. ゲームサーバーをローカルで引数をつけて実行します。(-ip-gamePortおよび-profileIDのみ必須です。) 例: GameServer.exe -ip 127.0.0.1 -gamePort 2500 -profileID 69
  2. ルームを作成する際、クライアント内で同じIPとポートを使用します。
        RoomOptions roomOptions = client.GetRoomOptions(serverGroupID, gameProfileID, "127.0.0.1", 2500);
    ...
    client.OpCreateRoom(roomName, roomOptions, TypedLobby.Default);
  3. ルームが満員になったら、全プレイヤーはzeuzからのインスタンスではなくローカルサーバーの情報を受信します。 こうすることで、プロダクションプレイヤーをローカルゲームサーバーインスタンスに転送し(パブリックIPが必要です)、デバッギングできます。
  4. Unityエディター内で直接ゲームサーバーを実行する場合は、コマンドライン引数を指定する代わりにオーバーライドを設定できます。以下を参照してください。
        Zeuz.SetServerOverrides("127.0.0.1", 2500);

Back To Top

オリエンテーション

ゲームサーバーを効果的に稼働させて、最適なユーザーエクスペリエンスを実現するためのアドバイス・条件をいくつか以下に挙げます。

  • サーバーの構築サイズをできるだけ最小限にして、テクスチャやオーディオなど大きなパーツに焦点をあてられるようにします。これによりアプリケーションのローディング時間を短縮し、メモリの節約ができます。つまり単一マシンでより多くのプロセス実行およびコスト削減につながります。
  • WindowsとLinuxプラットフォームビルドはサポートされています。
  • Linux仕様:Unity実行にmesa-utilsが要求され、HOME環境の変数はデフォルトでは設定されていません。つまり、アセットバンドルはローディングされません。
  • 問題解決をスムーズにするため、Unityログを実行ファイルと一緒にフォルダに保存してください。後からFT経由でアクセスできます。
  • ルームから、予約済みのゲームサーバーへデータを直接受け渡すことは、サポートされていません。

ドキュメントのトップへ戻る