DontDestroyOnLoad(this);
var gameName = "You must change this";
var serverPort = 25002;
private var timeoutHostList = 0.0;
private var lastHostListRequest = -1000.0;
private var hostListRefreshTimeout = 10.0;
private var connectionTestResult : ConnectionTesterStatus = ConnectionTesterStatus.Undetermined;//连接结果
private var filterNATHosts = false;
private var probingPublicIP = false;
private var doneTesting = false;
private var timer : float = 0.0;
private var useNat = false; // Should the server enabled NAT punchthrough feature
private var windowRect;
private var serverListRect;
private var hideTest = false;
private var testMessage = "Undetermined NAT capabilities";
// Enable this if not running a client on the server machine
//MasterServer.dedicatedServer = true;
//没有连上主服务器报错信息
function OnFailedToConnectToMasterServer(info: NetworkConnectionError)
{
Debug.Log(info);
}
//连接失败的报错信息
function OnFailedToConnect(info: NetworkConnectionError)
{
Debug.Log(info);
}
function OnGUI ()
{
//服务端控制UI
windowRect = GUILayout.Window (0, windowRect, MakeWindow, "Server Controls");
//客户端显示服务端列表的UI
//判断连接类型是没连接 和主服务PollHostList不是空的
if (Network.peerType == NetworkPeerType.Disconnected && MasterServer.PollHostList().Length != 0)
serverListRect = GUILayout.Window(1, serverListRect, MakeClientWindow, "Server List");
}
//游戏运行前
function Awake ()
{
windowRect = Rect(Screen.width-300,0,300,100);//服务端控制UI面板大小
//客户端显示服务端列表的UI的面板大小
serverListRect = Rect(0, 0, Screen.width - windowRect.width, 100);
// Start connection test
connectionTestResult = Network.TestConnection();//测试网络连接结果
// What kind of IP does this machine have? TestConnection also indicates this in the
// test results
//测试机器的IP类型、并打印出结果
if (Network.HavePublicAddress())
Debug.Log("This machine has a public IP address");
else
Debug.Log("This machine has a private IP address");
}
function Update()
{
// If test is undetermined, keep running
if (!doneTesting)
TestConnection();
}
//测试网络连接
function TestConnection()
{
// Start/Poll the connection test, report the results in a label and react to the results accordingly
connectionTestResult = Network.TestConnection();//测试网络连接结果
//几种连接测试结果
switch (connectionTestResult)
{
case ConnectionTesterStatus.Error: //连接错误
testMessage = "Problem determining NAT capabilities";
doneTesting = true;
break;
case ConnectionTesterStatus.Undetermined: //测试连接没结束
testMessage = "Undetermined NAT capabilities";
doneTesting = false;
break;
case ConnectionTesterStatus.PublicIPIsConnectable: //直接连接上了公共IP
testMessage = "Directly connectable public IP address.";
useNat = false;
doneTesting = true;
break;
// This case is a bit special as we now need to check if we can
// circumvent the blocking by using NAT punchthrough
case ConnectionTesterStatus.PublicIPPortBlocked://如果IP端口被阻拦 防火墙那些东东
testMessage = "Non-connectble public IP address (port " + serverPort +" blocked), running a server is impossible.";
useNat = false;
// If no NAT punchthrough test has been performed on this public IP, force a test
if (!probingPublicIP)
{
Debug.Log("Testing if firewall can be circumvented");
connectionTestResult = Network.TestConnectionNAT();
probingPublicIP = true;
timer = Time.time + 10;
}
// NAT punchthrough test was performed but we still get blocked
else if (Time.time > timer)
{
probingPublicIP = false; // reset
useNat = true;
doneTesting = true;
}
break;
case ConnectionTesterStatus.PublicIPNoServerStarted://没有服务开启
testMessage = "Public IP address but server not initialized, it must be started to check server accessibility. Restart connection test when ready.";
break;
case ConnectionTesterStatus.LimitedNATPunchthroughPortRestricted://限制了NAT
Debug.Log("LimitedNATPunchthroughPortRestricted");
testMessage = "Limited NAT punchthrough capabilities. Cannot connect to all types of NAT servers.";
useNat = true;
doneTesting = true;
break;
case ConnectionTesterStatus.LimitedNATPunchthroughSymmetric://限制了NAT
Debug.Log("LimitedNATPunchthroughSymmetric");
testMessage = "Limited NAT punchthrough capabilities. Cannot connect to all types of NAT servers. Running a server is ill adviced as not everyone can connect.";
useNat = true;
doneTesting = true;
break;
case ConnectionTesterStatus.NATpunchthroughAddressRestrictedCone:
case ConnectionTesterStatus.NATpunchthroughFullCone://通过连接
Debug.Log("NATpunchthroughAddressRestrictedCone || NATpunchthroughFullCone");
testMessage = "NAT punchthrough capable. Can connect to all servers and receive connections from all clients. Enabling NAT punchthrough functionality.";
useNat = true;
doneTesting = true;
break;
default:
testMessage = "Error in test routine, got " + connectionTestResult;//输出的测试内容显示在面板上的
}
//Debug.Log(connectionTestResult + " " + probingPublicIP + " " + doneTesting);
}
//服务端控制UI面板内的控件内容
function MakeWindow (id : int)
{
hideTest = GUILayout.Toggle(hideTest, "Hide test info");
if (!hideTest)
{
GUILayout.Label(testMessage);//显示上面的测试内容
//刷新连接
if (GUILayout.Button ("Retest connection"))
{
Debug.Log("Redoing connection test");
probingPublicIP = false;
doneTesting = false;
connectionTestResult = Network.TestConnection(true);
}
}
//开启服务端的UI
if (Network.peerType == NetworkPeerType.Disconnected)
{
GUILayout.BeginHorizontal();
GUILayout.Space(10);
// 开启服务
if (GUILayout.Button ("Start Server"))
{
Network.InitializeServer(32, serverPort, useNat);
MasterServer.RegisterHost(gameName, "stuff", "l33t game for all");//这个要注意下 游戏名称 类型等
}
// 刷新 hosts
if (GUILayout.Button ("Refresh available Servers") || Time.realtimeSinceStartup > lastHostListRequest + hostListRefreshTimeout)
{
MasterServer.RequestHostList (gameName);
lastHostListRequest = Time.realtimeSinceStartup;
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
}
else
{
//关闭服务
if (GUILayout.Button ("Disconnect"))
{
Network.Disconnect();
MasterServer.UnregisterHost();
}
GUILayout.FlexibleSpace();
}
GUI.DragWindow (Rect (0,0,1000,1000));
}
//客户端显示服务端列表的UI面板的UI内容、自动刷出服务列表
function MakeClientWindow(id : int)
{
GUILayout.Space(5);
var data : HostData[] = MasterServer.PollHostList();
var count = 0;
for (var element in data)
{
GUILayout.BeginHorizontal();
// Do not display NAT enabled games if we cannot do NAT punchthrough
if ( !(filterNATHosts && element.useNat) )
{
var connections = element.connectedPlayers + "/" + element.playerLimit;
GUILayout.Label(element.gameName);
GUILayout.Space(5);
GUILayout.Label(connections);
GUILayout.Space(5);
var hostInfo = "";
// Indicate if NAT punchthrough will be performed, omit showing GUID
if (element.useNat)
{
GUILayout.Label("NAT");
GUILayout.Space(5);
}
// Here we display all IP addresses, there can be multiple in cases where
// internal LAN connections are being attempted. In the GUI we could just display
// the first one in order not confuse the end user, but internally Unity will
// do a connection check on all IP addresses in the element.ip list, and connect to the
// first valid one.
for (var host in element.ip)
hostInfo = hostInfo + host + ":" + element.port + " ";
//GUILayout.Label("[" + element.ip + ":" + element.port + "]");
GUILayout.Label(hostInfo);
GUILayout.Space(5);
GUILayout.Label(element.comment);
GUILayout.Space(5);
GUILayout.FlexibleSpace();
if (GUILayout.Button("Connect"))
Network.Connect(element);
}
GUILayout.EndHorizontal();
}
}