マスターサーバー(旧)
ネットワーク帯域幅の最小化(旧)

Unity ネットワーキングサーバーのカスタム構築(旧)

(Unity 5.1 からは UNET の使用を推奨しています。下記の情報は旧ネットワークシステムのものです。)

個別のネットワーキングサーバーのソースコードは UnityWeb サイト にあります。Connection tester、Facilitator、マスターサーバー、プロキシサーバーも含まれます。

すべてのソースパッケージは RakNet 3.732 ネットワーキングパッケージを含み、これが基本的なネットワーキング関数をハンドリングし、ネットワーキングサーバーが使用するプラグインを提供します。

パッケージには 3 種類の異なるプロジェクトファイルが含まれていて、コンパイルできます。

  • Mac OS X Xcode 3.0 向けプロジェクト
  • Linux および Mac OS X 向け Makefile
  • Visual Studio 2008 ソリューション

Xcode および Visual Studio プロジェクトは簡単に開いてコンパイルしビルドできます。Makefile をビルドするには make を実行してください。Linux と Mac OS X の標準コンパイルセットアップとして gcc がある場合は動作します。あるいは Linux では ncurses ライブラリが必要となる場合があります。

全体構成

マスターサーバー

マスターサーバーは内部的な データベース 構造を保持しホスト情報をトラッキングします。)

ホストは RUM UPDATE OR ADD ROW メッセージ識別子および埋め込まれたホスト情報でメッセージ送信を行ます。LightweightDatabaseServer.cpp ファイルの OnReceive() 関数でこれは処理されます。ここですべてのメッセージは最初に表示されるため、メッセージがどう処理されたのかトレースしたい場合はこの場所から始めるとよいです。MasterServer.RegisterHost をセットする各々 game type ごとデータベース構造のテーブルが作成されます。すべてのゲームタイプ( game type )はひとつのテーブルにグループ分けされ、テーブルが存在しない場合 CreateDefaultTable() 関数により動的に生成されます。

ホスト情報のデータはマスターサーバーで修正されます。マスターサーバーからみた、登録されるゲームの IP アドレスおよびポート情報は、ホストデータに投入されます。この方法により外部 IP アドレスおよびポート情報がホストにプライベートアドレス( NAT アドレス)を保有する場合も正しいか診断できます。ゲームサーバーにより送信されるホストデータの IP アドレスおよびポート情報は、プライベート IP アドレスおよびポート情報であり、後ほど使用するために蓄積されます。もしマスターサーバーでクライアントがゲームサーバーのホストデータを要求し、サーバーが 同じ IP アドレスを保有する場合、次に外部 IP アドレスではなくプライベートアドレスを使用します。これによりクライアントとサーバーが同じローカルネットワーク上にあり、同じルーターを NAT アドレスを使用する場合に処理を行うためです。同じ IP アドレスを保有し、それを通して接続することはできないため、プライベートアドレスを通して接続する必要があり、この場合に正しく動作します。

クライアントは ID DATABASE QUERY_ REQUEST メッセージ識別子および探しているゲームタイプによりメッセージ送信を行います。テーブルあるいはホスト一覧がデータベースからフェッチされクライアントに送信されます。見つからなかった場合、空のホスト一覧が返されます。

マスターサーバーに送信されるすべてのメッセージは CheckVersion() によりチェックされたバージョン情報を保有する必要があります。現時点では Unity の各バージョンは内部的に新しいマスターサーバーのバージョンをセットされ、このときにチェックされます。もしマスターサーバーの通信ルーチンがどこかのタイミングで変更となった場合に、古いバージョンをこのときに検知することができて、場合によってマスターサーバーの別バージョンを参照(必要があれば)するか、違う場合に対応してメッセージ処理を修正することができます。

The Facilitator

Facilitator は RakNet の NAT パンチスループラグインをそのまま用いています。本質的には、ロードされた NAT パンチスループラグインを用いた、一つのポートの一つのピア端子(a peer listening)なだけです。NAT アドレスをもったサーバーととクライアントがともにこのピアと接続してはじめて、NAT パンチスルーを実行して互いに接続することができます。Network.InitializeServer が NAT を使用するとき、自動的に接続が行われます。

マスターサーバー(旧)
ネットワーク帯域幅の最小化(旧)