Fusion専用サーバー

Level Advanced

概要

Fusion専用サーバサンプル は、専用ゲームサーバというコンセプトでFusionプロジェクトを構築し、ゲームサーバとして動作するヘッドレスインスタンスを構築する方法について説明します。

専用サーバーとは、サーバーモードで起動された Fusion ピアのことで、ローカルのプレイヤーは存在せず、ゲームステート全体を管理する 状態権限 として動作します。 このサンプルでは、インスタンスがヘッドレスモードで動作しているかどうかを検出し、自動的に サーバーモード で起動できるようにしています。また、クライアントとして起動してランダムな Gaめ セッションゲームセッション に参加するか、ロビー に参加して特定の セッション を選択できるシンプルなメニューも用意しています。

トップに戻る

はじめに

サンプルを実行するには、まず、PhotonEngine Dashboard で Fusion AppId を作成し、リアルタイム設定 (Fusion メニュー) の App Id Fusion フィールドにペーストしてください。

トップに戻る

ダウンロード

バージョン リリース日 ダウンロード
1.1.1 Jul 14, 2022 Fusion Dedicated Server 1.1.1 Build 1

トップに戻る

プレハブ

  • Server_NetworkRunner.prefab: サーバが使用する NetworkRunner プレハブ。ゲーム全体を管理するスクリプトが含まれており、主なものは以下で説明する GameManager です。
  • Server_Manager.prefab: 現在のゲームが Headless Mode で動作しているかどうかを確認し、Server_NetworkRunner.prefab を生成し、Fusion Server をカスタマイズするために必要な引数を取込みます。
  • Client_NetworkRunner.prefab: クライアントが使用する NetworkRunner プレハブです。プレイヤーからのInputを取得する役割も担っています。
  • Client_Manager.prefab: クライアントが特定のセッションやランダムなセッションに参加したり、ロビーに参加して利用可能なセッションをチェックしたりするためのシンプルなGUIを作成します。Client_NetworkRunner.prefab を利用します。
  • Player.prefab: クライアントがゲームに参加したときにサーバから生成されるシンプルなプレイヤーです。

トップに戻る

シーン

  • 0.Launch: 起動シーンは Server_Manager.prefab インスタンスを保持し、Headless Mode で動作している時にサーバーが Game シーンを読み込むための開始点として使用されるか、通常のシナリオでは Menu シーンを読み込むだけです。
  • 1.Menu: このシーンはクライアントインスタンスによってのみ使用され、Client_Manager.prefabによって構築されたシンプルなメニューが表示されます。
  • 2.Game: 基本的なゲームシーンで、プレイヤーはスポーンされ、動き回ることができます。

トップに戻る

スクリプト

  • SceneDefs: 参照しやすいように、インデックスごとにシーンリストを保持しています。
  • CommandLineUtils: インスタンスが Headless Mode (コマンドラインに -batchmode -nographics を含む) で動作しているかどうかを確認し、コマンドラインから渡された引数から値を取得するメソッドのセットです。
  • ServerManager: CommandLineUtils を利用して Game Server を起動するか Menu シーンを読み込むかを選択できます。 * -session: サーバーが使用するカスタムセッション名。
    • -region: サーバーが接続する必要のあるカスタムリージョン。サポートされるリージョン のリスト。
    • -lobby: セッションが作成されるカスタムロビー。
    • -port: サーバーが起動時にバインドしようとするカスタムポート。
    • -P: カスタムプロパティのセットです。
  • GameManager: サーバー上で動作し、基本的に参加/離脱時にプレイヤーをスポーン/デスポーンします。
  • ServerEventsInfo: Fusionのサーバー側で発生する最も一般的なイベントのログを取得します。
  • ClientManager: クライアントメニューをコントロールし、ゲームサーバに接続するために Client_NetworkRunner.prefab を使用します。
  • PlayerController: クライアントからの入力を読み、Player NetworkObjectを動かすシンプルなコントローラです。
  • InGameMenu: Gameシーンでクライアントとして動作しているときに、Shutdown ボタンを表示します。

トップに戻る

実行方法

サンプルを実行するには、Scene in Buildで3つのシーンが正しい順番で並んでいることを確認します。 これにより、アプリケーションはコマンドライン引数をチェックし、サーバーまたはクライアントを起動することができます。 各モードの起動方法は以下の通りです。

トップに戻る

専用サーバモード

このモードでは、デフォルトの設定や起動時に渡されるカスタム引数を使用して Game Server が起動されます。サーバはディスプレイやビジュアルを使用せずに実行されることを考慮し、いくつかの必須引数といくつかの任意引数があります。

Game Server は主に2つのビルドターゲットを使用してビルドすることができます。

  • スタンドアロンビルド: 主要なプラットフォーム(Windows, Linux, macOS)用の実行ファイルをビルドするために使用される、通常のビルドターゲットです。この場合、いくつかのデメリットがあります:(i)ビルドにはすべてのゲームアセットが含まれます、(ii)一度実行するとバックグラウンドで実行されます(強制終了するにはプロセスを殺す必要があります)。
  • 専用サーバビルド: このビルドターゲットはUnity 2021.2+でのみ利用可能で、この目的のために特別に設計されており、不要なファイルを削除し、ターミナルとの統合をより良くしています。このビルドターゲットの詳細については、[ こちら ](https://forum.unity.com/threads/unity-2021-2-dedicated-server-target-and-stripping-optimizations-now-live-please-share-feedback.1143734/) を参照してください。
Unity Standalone Build Target
Unity Dedicated Server Build Target (Unity 2021.2+)

ビルドがあるフォルダを起点に、ターミナルコンソールを開き、次のように入力します。

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

これだけで、Game Serverを実行し、新しいGame Sessionを作成し、すべてのデフォルト設定を使用してホスティングマシンの場所に基づいてBest Regionで公開することができるようになります。 引数を分解してみましょう:」

  • batchmode -nographics (mandatory): Unity インスタンスを Headless Mode で実行します。これは ゲームサーバー の起動をトリガーするものです。
  • -logFile output.log ( 任意 ): これは output.log という名前のファイルを、サーバーからのすべてのログと同じフォルダに作成します。

上記の引数はすべてUnityに関連するもので、より詳しい情報はこちらを参照してください。 前述したように、Game Serverは追加の引数を解析することができます。

.\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 <カスタムロビー名> ( 任意 ): Game Sessionmy-custom-lobby という名前の ロビー に公開します。デフォルトは ClientServer ロビーです。
  • port <カスタムポート番号> (任意): ポート 30001 にバインドします。デフォルトは 27015 です。
  • -P<プロパティ名> <値> (任意): カスタムプロパティ map = citytype = free-for-all を設定します。デフォルトは空リストです。

上記の引数はいずれも必須ではなく、単独で使用することも、特定のサブセットを混ぜて使用することも可能です。 一度起動すると、Game Serverはクライアントが参加するのを待ち、すべてのクライアントがセッションから切断すると自動的にシャットダウンして終了します。

トップに戻る

クライアントモード

通常のダブルクリックでアプリケーションを起動すると、ゲームウィンドウが開き、クライアント側のオプションが表示されます。 そこからは、以下のことが可能です。

  1. Session Nameフィールドを埋めて特定のゲームに参加するか、空欄のままランダムなゲームに参加します。
  2. デフォルトの ClientServer ロビー、または Custom Lobby フィールドで指定したカスタムロビーに参加します。
    • ロビーに参加した場合、そのロビーで利用可能な Game Sessionsのリストが表示され、Join ボタンをクリックすることでゲームに参加することができます。
    • ロビーからShutdownボタンでNetworkRunnerをシャットダウンし、再度起動することも可能です。

ゲームサーバに接続すると、各クライアントは1人のプレイヤーを受け取り、通常のWASDで操作してレベル内を移動することができます。 クライアントはShutdownボタンをクリックすることでサーバーとの接続を解除することができます。


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