- 最后登录
- 2017-5-15
- 注册时间
- 2012-3-1
- 阅读权限
- 90
- 积分
- 32973
  
- 纳金币
- 32806
- 精华
- 12
|
using UnityEngine;
using System.Collections;
using System;
public class NPBase : MonoBehaviour {
public string connectToIp = "127.0.0.1";
public int connectPort = 80;
public bool useNAT = false;
public string ipaddress = "";
public string port = "";
string playerName = "<NAME ME>";
void OnGUI()
{
//Network.peerType:端类型的状态,即disconnected, connecting, server 或 client四种。
if(Network.peerType==NetworkPeerType.Disconnected)//Network类是网络实现的核心并提供核心函数。
{
if (GUILayout.Button("Connect"))
{
if (playerName != "<NAME ME>")
{
PlayerPrefs.SetString("playerName", playerName);//PlayerPrefs在游戏会话中储存和访问玩家偏好设置。http://3d.ceeger.com/Script/PlayerPrefs/PlayerPrefs.html
Network.useNat = useNAT;
Network.Connect(connectToIp, connectPort);//连接到特定的主机(IP或域名)和服务器端口。
}
}
if (GUILayout.Button("Start Server"))
{
if (playerName != "<NAME ME>")
{
PlayerPrefs.SetString("playerName", playerName);
Network.useNat = useNAT;//useNat设置NAT穿透功能。如果你想要这个服务器能够接受连接使用NAT穿透,使用facilitator,设置这个为***e。
Network.InitializeServer(2, connectPort);//初始化服务器。http://3d.ceeger.com/Script/Network/Network.InitializeServer.html
foreach (GameObject go in FindObjectsOfType(typeof(GameObject)))//static function FindObjectsOfType (type : Type) : Object[] :查找Type物体,返回Type类型的所有激活的加载的物体列表,它将返回任何资源(网格,纹理,预设,...)或激活的物体。请注意这个函数是非常慢的。不推荐在每帧使用这个函数,大多数情况下你可以使用单例模式代替。
{
go.SendMessage("OnNetworkLoadedLevel", SendMessageOptions.DontRequireReceiver);//向同级发送消息。在这个游戏物体上的所有MonoBehaviour上调用名称为methodName的方法。接收消息的方法可以通过不要参数的方法来选择忽略参数。当选项被设置为SendMessageOptions.RequireReceiver时,如果消息没有被任何一个组件处理,则会打印一个错误。http://3d.ceeger.com/Script/GameObject/GameObject.SendMessage.html
}
}
}
playerName = GUILayout.TextField(playerName);
connectToIp = GUILayout.TextField(connectToIp);
connectPort = Convert.ToInt32(GUILayout.TextField(connectPort.ToString()));
}
else
{
if(Network.peerType==NetworkPeerType.Connecting)//NetworkPeerType:描述作为由Network.peerType返回的网络接口端类型的状态。http://3d.ceeger.com/Script/Enumerations/NetworkPeerType/NetworkPeerType.html
{
GUILayout.Label("Connect Status:Connecting");
}
else if(Network.peerType==NetworkPeerType.Client)
{
GUILayout.Label("Connection Status:Client!");
GUILayout.Label(" ing to Server: "+Network.GetAveragePing(Network.connections[0]));//Network.GetAveragePing:到给定player的最后平均ping时间,以毫秒计。如果没有发现玩家,返回-1。Ping会每隔几秒自动发出。
}
else if(Network.peerType==NetworkPeerType.Server)
{
GUILayout.Label("Connection Status:Server!");
GUILayout.Label("Connections: "+Network.connections.Length);
if(Network.connections.Length>=1)//Network.connections:所有连接的玩家,在客户端中,该变量只包含服务器。
{
GUILayout.Label(" ing to Server: "+Network.GetAveragePing(Network.connections[0]));
}
}
if(GUILayout.Button("Disconnect"))
{
Network.Disconnect(200);//关闭所有开放的连接并关闭网络接口,timeout参数表示网络接口在未收到信号的情况下,多长时间会断开。网络状态,如安全和密码,也会被重置。
}
ipaddress = Network.player.ipAddress;//这个玩家使用的IP地址。http://3d.ceeger.com/Script/NetworkPlayer/NetworkPlayer.html
port = Network.player.port.ToString();//这个玩家使用的端口。Network.player:获取本地NetworkPlayer实例
GUILayout.Label("IP Address: "+ipaddress+":" +port);
}
}
void OnConnectedToServer()//当你成功连接到服务器时,在客户端调用。
{
foreach(GameObject go in FindObjectsOfType(typeof(GameObject)))
{
go.SendMessage("OnNetworkLoadedLever",SendMessageOptions.DontRequireReceiver);
}
}
}
复制代码
将以上代码附加到Main camera上即可实现。 |
|