プロキシのサポートが必要な場合、トラフィックはプロキシサーバーを通して行われます。
プロキシサーバーは、サーバーとクライアントとの接続に関する問題を解決します。マシンが非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"); } }