プロキシのサポートが必要な場合、トラフィックはプロキシサーバーを通して行われます。
プロキシサーバーは、サーバーとクライアントとの接続に関する問題を解決します。マシンが非NATパンチスルーができるルーターで作動している場合、接続オプションは制限されます。誰も外部からサーバーに接続することができなくなるのでゲームをホストできなくなります (ホストできるのはローカルネットワーク上にいるクライアントのみです)。プロキシサーバーを使用することで、マシンは完全な接続ができるようになりますが、他のサーバーを中継するトラフィックで余計な負荷が発生します。非NATパンチスルーができるクライアントは、プロキシサーバーが正しく設定されでいる限り、それを通してどんなサーバーにも接続することができます。
Unity Technologies は公共で使用するためのプロキシサーバーは提供していません。なので、プロキシサーバーは自身で用意する必要があります。もちろん、パプリック IP アドレスと帯域幅の大きいプロキシサーバーを用意することをおすすめします。
クライアントとして動作させるときは、Network.useProxy を有効にする必要があります。そして、いつものように Network.Connect() でサーバーに接続します。すべてのトラフィックはプロキシサーバーを中継します。サーバーの外部IPと内部IPはまだ通常通り動きます。なのでクライアントが同じネットワーク上にある場合はプロキシ無しで直接サーバーに接続することができます。
サーバーとして動作させるときは、OnServerInitialized(NetworkPlayer) でゲームサーバーを中継する IPやポート(例えばプロキシサーバーでゲームサーバーに割り当てられたポート)を示す NetworkPlayer 構造体を取得します。このIP/ポートは他のプレイヤーが接続するためにも使用できます。サーバーに接続するときに、クライアントで他のサーバーと異なる手順をふむことは必要ありません。技術的に言えばゲームサーバーはプロキシサーバーから助けを得ていることを知る必要はありません。
マスターサーバーを使用している場合、プロキシのサポートを使用しているときは、サーバー用に登録したIP/ポートのみに依存することは出来ません。プロキシサーバーの IP とポートは、マスターサーバに送信されるデータのコメントフィールドに配置して使用することができます。マスターサーバーからホスト情報を受信したクライアントはコメントフィールド内を見て IP/ホストが使用できるかどうかを確認することができます。
重要: サーバーとサーバーに接続するクライアント両方でプロキシサポートを有効にする必要はありません。予想外のことが起こる可能性があります。
var imaserver: boolean;
var serverIP: String;
var serverPort: int;
var serverUsesNAT: boolean;
function Awake() {
// Set custom proxy server address
Network.proxyIP = "1.1.1.1";
Network.proxyPort = 1111;
if (imaserver)
StartServerWithProxy();
else
ConnectToServerWithProxy();
}
function StartServerWithProxy() {
Network.useProxy = true;
Network.InitializeServer(2,25000, false);
}
function OnServerInitialized(player: NetworkPlayer) {
if (Network.useProxy)
Debug.Log ("Successfully started server with proxy support. We are connectable through "
+ player.ipAddress + ":" + player.port);
}
function OnFailedToConnect(msg: NetworkConnectionError) {
if (Network.useProxy && imaserver) {
Debug.LogError("Failed to connect to proxy server: " + msg);
}
}
function ConnectToServerWithProxy() {
Network.useProxy = true;
Network.Connect(serverIP, serverPort);
}
function OnConnectedToServer() {
Debug.Log("Connected successfully to server");
}
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { public bool imaserver; public string serverIP; public int serverPort; public bool serverUsesNAT; void Awake() { Network.proxyIP = "1.1.1.1"; Network.proxyPort = 1111; if (imaserver) StartServerWithProxy(); else ConnectToServerWithProxy(); } void StartServerWithProxy() { Network.useProxy = true; Network.InitializeServer(2, 25000, false); } void OnServerInitialized(NetworkPlayer player) { if (Network.useProxy) Debug.Log("Successfully started server with proxy support. We are connectable through " + player.ipAddress + ":" + player.port); } void OnFailedToConnect(NetworkConnectionError msg) { if (Network.useProxy && imaserver) Debug.LogError("Failed to connect to proxy server: " + msg); } void ConnectToServerWithProxy() { Network.useProxy = true; Network.Connect(serverIP, serverPort); } void OnConnectedToServer() { Debug.Log("Connected successfully to server"); } }