個別のネットワーキングサーバのソースコードはUnityウェブサイト にあります。Connection tester,Facilitator,マスターサーバ,プロキシサーバも含まれます。
全てのソースパッケージはRakNet 3.732ネットワーキングパッケージを含み,これが基本的なネットワーキング関数をハンドリングし,ネットワーキングサーバが使用するプラグインを提供します。
パッケージには3種類の異なるプロジェクトファイルが含まれていて,コンパイルできます。
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の各バージョンは内部的に新しいマスターサーバのバージョンをセットされ,このときにチェックされます。もしマスターサーバの通信ルーチンがどこかのタイミングで変更となった場合に,古いバージョンをこのときに検知することが出来て,場合によってマスターサーバの別バージョンを参照(必要があれば)するか,違う場合に対応してメッセージ処理を修正することが出来ます。
FacilitatorはRakNetのNATパンチスループラグインをそのまま用いています。本質的には,ロードされたNATパンチスループラグインを用いた,一つのポートの一つのピア端子(a peer listening)なだけです。NATアドレスをもったサーバととクライアントがともにこのピアと接続してはじめて,NATパンチスルーを実行して互いに接続することが出来ます。Network.InitializeServer がNATを使用するとき,自動的に接続が行われます。