Unity中实现网络连接的C#代码 network
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,设置这个为true。
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("Ping to Server: "+Network.GetAveragePing(Network.connections));//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("Ping to Server: "+Network.GetAveragePing(Network.connections));
}
}
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上即可实现。
有图有真相!{:soso__11824716995429377336_2:}
各种平台的测试,图片如下:
very good sample 正在进行网络游戏开发! 新手学习 谢谢分享 有图有真相 求大图啊看看学习一下 谢谢 好帖就是要顶 难得一见的好帖 说的非常好 很好哦
页:
[1]