Unity3d网络总结(一) NetWork组件使用

学习Unity3d的过程中,经常上网查阅各位大牛的博客,受益匪浅,从今天开始写自己在学习过程中遇到的问题,总结归纳下来,方便日后复习

这两天在学习Unity的网络模块,今天先总结Unity自带的Network组件相关使用方法

1.网络管理物体

搭建网络,需要先创建一个空物体用来添加网络管理组件,首先要给空物体添加以下两个组件

注意事项: 1. OffLine Scene代表客户端连接服务器前,等待的场景(游戏大厅)

.                   OnLine Scene代表客户端连接服务器后的场景 (游戏场景)

2.Spawn Info 服务器卵生信息 :  把网络预设体(必须挂有网络组件) 拖入PlayerPrefab , 服务器会把游戏对象孪生到所有连接的客户端中

二.游戏对象

1.Network Identity

游戏对象(网络预设体)需要挂Network Identity组件,该组件是网络的核心,由服务器Spwan(卵生)的物体都必须具备,该组件在卵生的时候会自动分配assetID和权限

注意事项:1.ServerOnly 勾选后物体只在服务器中存在

2.Local Player Authority勾选后在客户端中存在

2.实现状态同步

游戏对象的控制脚本需要继承NetWorkBehaviour组件(依赖于NetWorkIdentity),用来实现RPC技术和状态同步属性.

1.Transform同步

这个组件负责玩家对象在客户端发出移动指令后,把该玩家的移动同步到所有客户端中

注意事项:1.Net Work Send Rate 表示同步Transform的频率

2.Transform Synv Mode 表示同步的模式,可以选择同步刚体组件,角色控制器等

然后在控制脚本编写代码

public class ControlMove : NetworkBehaviour {

void Update() {

if (!isLocalPlayer)   //判断是否是本地客户端        {

return;

}

float x = Input.GetAxis("Horizontal");

float y = Input.GetAxis("Vertical");

if (x != 0 || y != 0)

{

transform.position += new Vector3(x, 0, y);

}

这里需要注意的有两点 1.所有网络控制脚本必须要继承 NetWorkBehaviour

2.在Update里需要先判断是否是本地客户端,不是的话Return~!!!  如果没有这个判断条件,在客户端发出指令,网络里所有的客户端都会执行

 

 

2.发射子弹与减血的同步

经过上边的步骤,已经可以实现物体在网络里的移动,但我们想要实现在网络里发射子弹,受到攻击后还要减血,这些指令都需要在服务器上执行,先来看一下NetWorkBehaviour的常用特性

[SyncVar]    用于标识序列化变量,实现变量同步     例: (把Hp标识,就可以实现同步减血)

[Client]        表示只能在客户端调用

[ClientCallBack]   表示客户端执行的回调

[Command]  表示客户端向服务端发送的命令,在服务端执行

[ClientPrc]  表示服务端向客户端发送的命令,在客户端执行

直接来看代码如何使用:

//将血量设置为网络同步变量    [SyncVar]

float hp = 100;

public Slider slider;       //显示血量的血条

public GameObject bullet;   //子弹预设体

void Start () {

ClientScene.RegisterPrefab(bullet); //在场景注册预设体    }

void Update () {

// 2.将血量的值赋给slider

slider.value = hp / 100f;

if (!isLocalPlayer)

{

return;

}

if (Input.GetKeyDown(KeyCode.Q))

{

CmdReduceHp();

}

if (Input.GetKeyDown(KeyCode.T))

{

CmdFire();

}

}

//减血的方法   标识为Command由服务器执行

//前缀必须是Cmd 开头    [Command]

public void CmdReduceHp()

{

hp -= 10;

}     //发射子弹的方法    [Command]

public void CmdFire()

{

GameObject a= Instantiate(bullet, transform.position+transform.right, Quaternion.identity);

a.GetComponent<Rigidbody>().AddForce(transform.right*100);   //给子弹添加向右的力

NetworkServer.Spawn(a);   //由服务器卵生给连接的客户端

}

注意事项:1.网络预设体需要先在客户端场景里注册一下,才能正常产生

2.hp赋值给Slider要写在判断是否是本地客户端前,血条才会正常同步显示

3.Command修饰的方法,由客户端发起,服务端执行,方法名前必须加Cmd

4.监听键盘事件的Iput.GetKeyDown要放在Update里,不能放在Cmd方法里!!!  (此时方法由服务器调用,无法监听键盘事件)

3.动画的同步

要实现游戏对象的动画同步,还需要添加一个网络组件,并给组件指定Animator,并勾选Animator里包含的动画.

动画同步需要注意一点,过度条件是Trigger时需要由客户端发起指令,在服务端执行,再分发给各个客户端执行,其他条件正常.

这里Animator的两个动画,attack01条件是bool,attack02条件是Trigger ,代码如下:

Animator ani;

void Start()

{

ani = GetComponent<Animator>();

}

void Update () {

if (Input.GetKeyDown(KeyCode.Q))

{

ani.SetBool("attack01", !ani.GetBool("attack01"));

}

if (Input.GetKeyDown(KeyCode.E))

{

CmdAttack02();

}

}

[Command]    //服务器执行

void CmdAttack02()

{

RpcPlayTrigger();

}

[ClientRpc]   //由服务器端调用,在客户端执行

void RpcPlayTrigger()

{

ani.SetTrigger("attack02");

}

Unity3d网络总结(二)使用NetWorking代码搭建简单的网络模块

上一篇文章(http://www.cnblogs.com/dabaimifan/p/7212615.html)介绍了通过给物体添加NetWorking相关组件实现简单的搭建一个网络,本文通过C#代码搭建一个简单的网路,详细解释会在代码里注释,供新手学习使用

首先,引入UnityEngine下的NetWorking命名空间,并初始化相关对象,提前创建好预设体并放入Resources文件夹下,这里需要注意的是在Start里调用方法让程序保持在后台运行,不然客户端会连接不上服务器(后台),

public class NetManager : MonoBehaviour {

//创建客户端    NetworkClient MyClient;

//创建预设体   网络对象    GameObject playerPre;

void Start ()

{

//保持程序后台运行

Application.runInBackground = true;

playerPre = Resources.Load("Player") as GameObject;

//初始化客户端

MyClient = new NetworkClient();

}

然 后写 创建服务器的方法

//创建服务器的方法

public void InitServerAction()

{

if (!NetworkServer.active)

{

//创键并开启服务器,服务器开始监听

// 默认ip地址 为127.0.0.1

NetworkServer.Listen("127.0.0.1", 1345);

Debug.Log("服务器已经开启");

//给服务器注册回调方法(ServerAddPlayerCallback)            NetworkServer.RegisterHandler(MsgType.AddPlayer, ServerAddPlayerCallback);

//将服务器也初始化 为一个客户端

MyClient = ClientScene.ConnectLocalServer();

//注册客户端连接之后的回调方法(ClientConnectServerCallback)            MyClient.RegisterHandler(MsgType.Connect, ClientConnectServerCallback);

}

}

写服务器添加玩家后的回调方法(ServerAddPlayerCallback) 与客户端连接之后的回调方法(ClientConnectServerCallback):

//服务器接收客户端发送的添加游戏玩家之后执行的回调方法

void ServerAddPlayerCallback(NetworkMessage msg)

{

//创建一个游戏对象

GameObject player= Instantiate(playerPre,new Vector3(0,0,0),Quaternion.identity);

//将创建的网络对象的权限赋值给客户端

NetworkServer.AddPlayerForConnection(msg.conn, player,31);

//将该玩家的对象卵生到所有连接服务器的客户端        NetworkServer.Spawn(player);

}//客户端连接之后的回调方法

void ClientConnectServerCallback(NetworkMessage msg)

{

//告诉服务器准备完毕        ClientScene.Ready(msg.conn);

//向服务器注册预设体(预设体必须是网络对象)        ClientScene.RegisterPrefab(playerPre);

//向服务器发送添加游戏对象的请求

//服务器在接收这个请求之后会自动调用 添加游戏玩家的回调方法

ClientScene.AddPlayer(31);

}

再写一个客户端连接服务器的方法:

//客户端连接服务器的事件

public void ClientConnectServerAction()

{

//连接服务器

MyClient.Connect("127.0.0.0", 1345);

//注册客户端连接之后的回调方法        MyClient.RegisterHandler(MsgType.Connect, ClientConnectServerCallback);

}

最后我们用GUI添加两个Button绑定事件

private void OnGUI()

{

if (GUI.Button(new Rect(10, 10,100, 30), "server"))

{

InitServerAction();

}

if (GUI.Button(new Rect(10, 50, 100, 30), "client"))

{

ClientConnectServerAction();

}

}

效果图

运行,点击Server创建服务器

打包程序并运行,点击Client连接服务器

Unity3d网络总结(三) 封装Socket创建简单网络

这次自己搭建一个Socket模块,比较基础,适合新手学习,详细介绍Socket的搭建过程,同样会把详细过程在代码里进行注释~

在搭建Socket过程中,需要创建以下几个常用的方法:

1.创建套接字(socket)

2.绑定Ip和端口

3.监听方法

4.接收客户端请求的方法

5.收发消息的方法

创建SocketManger管理类

把客户端与服务端代码都写在新建的SocketManger里,并把SocketManger写成单例,方便调用

using System.Net;//引入套接字协议类

using System.Net.Sockets;

using System;

using System.Text;

public class SocketManager {

#region 单例类

private static SocketManager instance;

private SocketManager()

{

}

public static SocketManager Instance

{

get

{

if (instance == null)

{

instance = new SocketManager();

}

return instance;

}

}

#endregion

public delegate void MyCallBack(string msg);    //声明一个委托类型,在服务器和客户端工作的时候,会使用这个回调方法反馈当前交互的具体情况

服务端代码

#region 服务器代码

/* 创建服务器

* 等待客户端的连接

* 接受消息

*/

Socket serverSocket;             //创建服务器的套接字对象

MyCallBack serverCallBack;       //定义一个服务器使用的回调委托对象

byte[] serverBuffer;             //数据缓存区  文字,音频,视频,图片...

public void InitServer(MyCallBack callBack)

{

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //参数(1.使用IP地址的类型 2.套接字类型,使用TCP的流式传输  3.使用TCP协议)

serverBuffer = new byte[1024];    //初始化缓冲区的大小

serverCallBack = callBack;        //绑定初始化服务器的回调方法

IPEndPoint point = new IPEndPoint(IPAddress.Any, 34567);      //参数(1.地址,代表一台电脑, 2.端口号表示一个应用)

serverSocket.Bind(point);    //绑定地址节点

serverSocket.Listen(10);       //开始监听, 一旦监听成功,服务器就启动,10代表最大监听数量

serverCallBack("服务器启动成功");

//服务器开始进入等待用户连接的状态

//开辟一条子线程实时监测是否有人连接

//一旦有客户端连接,立马通知主线程,通知内容会以IAsyncResult 返回,连接者的所有信息

serverSocket.BeginAccept(ServerAccept, serverSocket);

}

//服务器开始接收的方法

void ServerAccept(IAsyncResult ar)

{

serverSocket = ar.AsyncState as Socket;     //拿到当前连接服务器的Socket 对象

Socket workingSocket = serverSocket.EndAccept(ar);         //将当前的Socket的全部信息交给一个新的Socket处理

workingSocket.BeginReceive(serverBuffer, 0, serverBuffer.Length, SocketFlags.None,ServerReceive, workingSocket);  //(数据收发缓存区,起始位置,长度,不分类型,全部接收, 接受消息之后的回调,当前Socket的状态)

serverSocket.BeginAccept(ServerAccept, serverSocket);      //尾递归    }

//服务器接收消息之后的回调方法

void ServerReceive(IAsyncResult ar)

{

Socket workingSorket = ar.AsyncState as Socket;

int size=workingSorket.EndReceive(ar);   //拿到接收到的数据一共有多少字节

string str = Encoding.UTF8.GetString(serverBuffer);    //将接收到的byte数组转换成字符串

serverCallBack("接收到了" + size + "字节");

serverCallBack(str);

workingSorket.BeginReceive(serverBuffer, 0, serverBuffer.Length, SocketFlags.None, ServerReceive, workingSorket);   //尾递归    }

#endregion

 客户端代码

#region

Socket clientSocket;

MyCallBack clientCallBack;

byte[] clientBuffer;

//客户端连接服务器的方法

public void ClientConnectServer(string ip,int port,MyCallBack callBack)

{

clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

clientBuffer = new byte[1024];

clientCallBack = callBack;

clientSocket.Connect(IPAddress.Parse(ip),port);      //连接服务器

clientCallBack("连接服务器成功");

clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None,ClientReceive, clientSocket);

}

void ClientReceive(IAsyncResult ar)

{

Socket WorkingSocket = ar.AsyncState as Socket;

int size=WorkingSocket.EndReceive(ar);   //接收多少字节

string msg= Encoding.UTF8.GetString(clientBuffer);

clientCallBack("接收了"+size+"字节");

clientCallBack(msg);

clientSocket.BeginReceive(clientBuffer, size, clientBuffer.Length, SocketFlags.None, ClientReceive, WorkingSocket);

}

//客户端发送消息的方法

public void ClientSendMsg(string msg)

{

byte[] buffer= Encoding.UTF8.GetBytes(msg);

clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, SendCallBack, clientSocket);

}

void SendCallBack(IAsyncResult ar)

{

Socket workingSocket = ar.AsyncState as Socket;

workingSocket.EndSend(ar);

clientCallBack("发送完成");

}

#endregion

简单的Socket搭建完成,但是有一点小Bug,服务器进入等待用户连接状态后,会开辟子线程实时检测,没有关闭这条线程,因此在搭建服务器的脚本,可以在Start方法里写一个方法,在程序退出时关闭这条线程! 这个方法在关闭程序时自动调用

private void OnApplicationQuit()

{

serverSocket.Shutdown(SocketShutdown.Both);

serverSocket.Close();

}

简单的Socket搭建完了,当然这只是非常基础的Socket传递,在实际使用中,还要考虑很多问题,比如Socket的沾包, 闭包,需要进一步处理

http://www.cnblogs.com/dabaimifan/p/7220428.html

Unity3d数据存储 PlayerPrefs,XML,Json数据的存储与解析

Unity3d中常用的数据存储方式有Unity自带的PlayerPrefs, XML文档, Json文档,还有常用的轻量级数据库SQL, 涉及的琐碎知识非常多,在这里自己归纳总结一下,方便日后温故而知新.

PlayerPrefs存储数据

PlayerPrefs的存储方式非常简单,但可用性不强,一般只用于调试过程存储少量数据,很少大范围使用

适用设备:Mac OSX, Linux, Windows,Web Players

存储机制:Key-Value (类似于字典的键值对,通过键值索引到相应数据)

可存储变量类型: int, float, string

常用方法: SetFloat     存储float 类型的数据                 GetFloat        获取float 类型的数据

SetInt         存储Int类型的数据                        GetInt            获取Int 类型的数据

SetString    存储string 类型的数据               GetString      获取string 类型的数据

DeleteAll     删除所有PlayerPrefs数据          HasKey        判断是否存在该Key值的数据

简单代码示例如下,是不是很简单?

void ExamplePlayerPrefs()

{

PlayerPrefs.SetFloat("PlayerScore", 10f);

Debug.Log(PlayerPrefs.GetFloat("PlayerScore"));

}

XML的存储与解析

(1)XMl常用类及其常用属性和方法

XmlNode

InnerText                           获取或设置节点及其所有子节点的值(仅元素节点拥有)

Value                                 获取或设置节点的值(仅属性节点拥有)

AppendChild                      将指定的节点添加到该节点的子节点列表的末尾

ChildNodes                        获取节点的所有子节点

FirestChild

XmlDocument

CreateXmlDeclaration       创建一个具有指定值的XmlDeclaration节点

CreateElement                   创建具有指定名称的元素

CreateNode                       创建具有指定的节点类型的XmlNode

AppendChild                      将指定节点添加到末尾(继承自XmlNode)

Save                                  将Xml文档保存到指定的文件

Load                                  从指定的URL加载Xml文档

LoadXml                            从指定的字符串加载Xml文档

XmlElement

SetAttribute                       设置具有指定名称的特性的值

HasAttributes                    判断该元素节点是否具有属性

GetAttribute                       返回具有指定名称的属性值

(2)XML数据的生成步骤

在Unity引擎中如何生成本地XML数据?

第一步:引入C#的命名空间 System.Xml

第二步:生成XML文档(XmlDocument类)

第三步: 生成根元素(XmlElement类) 添加给文档对象

第四步:循环生成子元素添加给父元素

第五步:将生成的XML文档保存

(3)XML解析步骤

在解析时注意, 需要根据Xml文件的结构创建好对应的数据模型,去接受解析出来的数据!!!

Json的存储与解析

Json一般使用两个类库,一个System.Json(便于Json生成),一个是LitJson(便于Json解析)

Json生成

void LitCtreatJson()

{

JsonData hero = new JsonData();

hero["HeroName"] = "诺克萨斯";

hero["Hp"] = 100;

hero["attack"] = 40;

hero["Skills"] = new JsonData();

JsonData skill1 = new JsonData();

skill1["KeyCode"] = "Q";

skill1["Name"] = "大杀四方";

skill1["Mp"] = 20;

skill1["cd"] = 8;

hero["Skills"].Add(skill1);

JsonData skill2 = new JsonData();

skill2["KeyCode"] = "W";

skill2["Name"] = "致残打击";

skill2["Mp"] = 40;

skill2["cd"] = 5;

hero["Skills"].Add(skill2);

JsonData skill3 = new JsonData();

skill3["KeyCode"] = "E";

skill3["Name"] = "无情铁手";

skill3["Mp"] = 10;

skill3["cd"] = 9;

hero["Skills"].Add(skill3);

JsonData skill4 = new JsonData();

skill4["KeyCode"] = "R";

skill4["Name"] = "诺克萨斯断头台";

skill4["Mp"] = 120;

skill4["cd"] = 60;

hero["Skills"].Add(skill4);

}

Json解析

void LitParseJson()

{

FileInfo file =new FileInfo(Application.dataPath + "/LoL.json");

StreamReader sr = new StreamReader(file.OpenRead(), Encoding.UTF8);

string content = sr.ReadToEnd();

JsonData data= JsonMapper.ToObject(content);

foreach (JsonData item in data["Skills"])

{

print(item["name"]);

}

Hero hero;

hero =  JsonUtility.FromJson<Hero>(content);

sr.Close();

sr.Dispose();

}

 

 

untiy3d 5x,network的服务器端和客户端通信

https://blog.csdn.net/wuyt2008/article/details/51281668

unity3d 5x以前,可以用NetworkView.RPC的方式进行通信。5x,之后,虽然还可以用networkview建立服务器和客户端,但是NetworkView.RPC的通信方式被取消了。

取代的是用networking下的networkserver和nerworkclient(大概吧,我猜的)

以前类似于下面这样的,应该是不能再用了。

[csharp] view plain copy

[RPC]

void SpawnBox(NetworkViewID viewID, Vector3 location) {

Transform clone;

clone = Instantiate(cubePrefab, location, Quaternion.identity) as Transform as Transform;

NetworkView nView;

nView = clone.GetComponent<NetworkView>();

nView.viewID = viewID;

}

接下来用新的方法试试:

建立新场景,加上按钮,输入框,文本显示。(不爱用OnGUI)

首先,要引用UnityEngine.Networking

using UnityEngine.Networking;

建立服务器用NetworkServer.Listen

NetworkServer.Listen(4444);

客户端连接的方法是NetworkClient.Connect

NetworkClient myClient;

myClient = new NetworkClient ();

myClient.Connect("127.0.0.1", 8888);  
服务器端和客户端的事件都是通过RegisterHandler方法注册的,

下面的例子就是在服务器端注册了一个OnConnected事件,事件是当有客户端连接到服务器端的时候在服务器端触发。

void Start()

{

NetworkServer.Listen(7070);

NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);

}

void OnConnected(NetworkMessage netMsg)

{

Debug.Log ("Client connected");

}  
客户端注册事件的方法相同。

接下来,说发送信息。

服务器端发送信息是用NetworkServer.SendToAll或NetworkServer.SendToClient,客户端发送信息用NetworkClient.Send

其中参数Networking.MessageBase msg是一个自己定义的类,但是这个类必须继承自MessageBase

class RegisterHostMessage : MessageBase

{

public string gameName;

public string comment;

public bool passwordProtected;

}

ok,说明完毕,上代码

这是发生信息的类

  using UnityEngine.Networking;

public class UserMsg : MessageBase {

public string message;

}  
这是主类

using UnityEngine;

using UnityEngine.Networking;

using UnityEngine.UI;

using System;

public class MyNetworkManager : MonoBehaviour   {

/// <summary>

/// 服务器ip地址

/// </summary>

public InputField ip;

/// <summary>

/// 服务器端口

/// </summary>

public InputField port;

/// <summary>

/// 要发送的信息

/// </summary>

public InputField send;

/// <summary>

/// 显示信息

/// </summary>

public Text info;

/// <summary>

/// 网络客户端

/// </summary>

private NetworkClient myClient;

/// <summary>

/// 用户信息分类

/// </summary>

private const short userMsg = 64;

void Start ()

{

info.text = "Start...";

myClient = new NetworkClient ();

}

/// <summary>

/// 建立服务器

/// </summary>

public void SetupServer ()

{

if (!NetworkServer.active) {

ShowMsg ("setup server");

ServerRegisterHandler ();

NetworkServer.Listen (int.Parse (port.text));

if (NetworkServer.active) {

ShowMsg ("Server setup ok.");

}   }   }

/// <summary>

/// 建立客户端

/// </summary>

public void SetupClient ()

{

if (!myClient.isConnected) {

ShowMsg ("setup client");

ClientRegisterHandler ();

myClient.Connect (ip.text, int.Parse (port.text));

}     }

/// <summary>

/// 停止客户端

/// </summary>

public void ShutdownClient ()

{

if (myClient.isConnected) {

ClientUnregisterHandler ();

myClient.Disconnect ();

//NetworkClient.Shutdown()使用后,无法再次连接。

//This should be done when a client is no longer going to be used.

//myClient.Shutdown ();

}      }

/// <summary>

/// 停止服务器端

/// </summary>

public void ShutdownServer ()

{

if (NetworkServer.active) {

ServerUnregisterHandler ();

NetworkServer.DisconnectAll ();

NetworkServer.Shutdown ();

if (!NetworkServer.active) {

ShowMsg ("shut down server");

}  }   }

/// <summary>

/// 客户端连接到服务器事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnClientConnected (NetworkMessage netMsg)

{

ShowMsg ("Client connected to server");

}

/// <summary>

///客户端从服务器断开事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnClientDisconnected (NetworkMessage netMsg)

{

ShowMsg ("Client disconnected from server");

}

/// <summary>

/// 客户端错误事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnClientError (NetworkMessage netMsg)

{

ClientUnregisterHandler ();

ShowMsg ("Client error");

}

/// <summary>

/// 服务器端有客户端连入事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnServerConnected (NetworkMessage netMsg)

{

ShowMsg ("One client connected to server");

}

/// <summary>

/// 服务器端有客户端断开事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnServerDisconnected (NetworkMessage netMsg)

{

ShowMsg ("One client connected from server");

}

/// <summary>

/// 服务器端错误事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void OnServerError (NetworkMessage netMsg)

{

ServerUnregisterHandler ();

ShowMsg ("Server error");

}

/// <summary>

/// 显示信息

/// </summary>

/// <param name="Msg">Message.</param>

private void ShowMsg (string Msg)

{

info.text = Msg + "\n\r" + info.text;

//Debug.Log (Msg);

}

/// <summary>

/// 客户端向服务器端发送信息

/// </summary>

public void ClientSend ()

{

if (myClient.isConnected) {

UserMsg um = new UserMsg ();

um.message = send.text;

if (myClient.Send (userMsg, um)) {

ShowMsg ("Client send:" + send.text);

}   }    }

/// <summary>

/// 客户端接收到服务器端信息事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void ClientGet (NetworkMessage netMsg)

{

UserMsg Msg = netMsg.ReadMessage<UserMsg> ();

ShowMsg ("Client get:"+Msg.message);

}

/// <summary>

/// 服务器端向所有客户端发送信息

/// </summary>

public void ServerSend ()

{

if (NetworkServer.active) {

UserMsg um = new UserMsg ();

um.message = send.text;

if (NetworkServer.SendToAll (userMsg, um)) {

ShowMsg ("Server send:" + send.text);

}         }      }

/// <summary>

/// 服务器端收到信息事件

/// </summary>

/// <param name="netMsg">Net message.</param>

private void ServerGet (NetworkMessage netMsg)

{

UserMsg Msg = netMsg.ReadMessage<UserMsg> ();

ShowMsg ("Server get:"+Msg.message);

}

/// <summary>

/// 服务器端注册事件

/// </summary>

private void ServerRegisterHandler(){

NetworkServer.RegisterHandler (MsgType.Connect, OnServerConnected);

NetworkServer.RegisterHandler (MsgType.Disconnect, OnServerDisconnected);

NetworkServer.RegisterHandler (MsgType.Error, OnServerError);

NetworkServer.RegisterHandler (userMsg, ServerGet);

}

/// <summary>

/// 客户端注册事件

/// </summary>

private void ClientRegisterHandler(){

myClient.RegisterHandler (MsgType.Connect, OnClientConnected);

myClient.RegisterHandler (MsgType.Disconnect, OnClientDisconnected);

myClient.RegisterHandler (MsgType.Error, OnClientError);

myClient.RegisterHandler (userMsg, ClientGet);

}

/// <summary>

/// 客户端注销事件

/// </summary>

private void ClientUnregisterHandler(){

myClient.UnregisterHandler (MsgType.Connect);

myClient.UnregisterHandler (MsgType.Disconnect);

myClient.UnregisterHandler (MsgType.Error);

myClient.UnregisterHandler (userMsg);

}

/// <summary>

/// 服务器端注销事件

/// </summary>

private void ServerUnregisterHandler(){

NetworkServer.UnregisterHandler (MsgType.Connect);

NetworkServer.UnregisterHandler (MsgType.Disconnect);

NetworkServer.UnregisterHandler (MsgType.Error);

NetworkServer.UnregisterHandler (userMsg);

}   }  
运行结果如下

代码下载地址:http://download.csdn.net/detail/wuyt2008/9506591

Unity3d网络总结NetWork组件使用(总结篇)相关推荐

  1. 『中级篇』k8s基础网络Cluster Network(66)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』k8s基础网络Cluster Network(66) 通过国人大神的一键安装k8s集群安装了3个master节点和3 ...

  2. 电脑硬件知识学习_关于网络学习心得体会集锦七篇

    关于网络学习心得体会集锦七篇 当在某些事情上我们有很深的体会时,好好地写一份心得体会,通过写心得体会,可使我们今后少走弯路.那么心得体会怎么写才能感染读者呢?以下是小编为大家收集的网络学习心得体会7篇 ...

  3. 关于计算机优点缺点的英语作文,关于网络优缺点的英语作文4篇

    关于网络优缺点的英语作文4篇 导语:随着科技的发展,电脑在二十一世纪成了人们必要的用品.随之而来,网络与我们的生活息息相关,给现代人的.生活.工作带来了无与伦比的方便. 篇一:关于网络优缺点的英语作文 ...

  4. 基于c++和asio的网络编程框架asio2教程基础篇:1、基本概念和使用说明

    基于c++和asio的网络编程框架asio2教程基础篇:1.基本概念和使用说明 由于asio2没有写技术文档,因此打算写几篇文章介绍一下如何使用它,主要是针对新手. 1.asio2如何使用? asio ...

  5. 学习笔记——使用Unity Network组件开发联机游戏

    文章目录 前言 一.创建玩家预制体 二.使用Network组件 总结 前言 使用unity中的Network组件开发一个简单的多人在线游戏 unity版本:2018.4.16 一.创建玩家预制体 1. ...

  6. 关系网络 Relation Network

    文章目录 比较孪生网络.原型网络和关系网络 关系网络 Relation Network 实现过程 网络结构 损失函数 训练策略 算法推广 -- 推广到 zero-shot 创新点 算法评价 比较孪生网 ...

  7. 最易懂的闪电网络Lightning Network的简介

    区块链很慢,而且昂贵.闪电网络(Lightning Network)就是解决这个问题的.如果我不得不发送给你一些比特币,你会在几个小时内收到它们,而且我也支付了很高的交易费.凭这样的声誉,Blockc ...

  8. 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  9. 【Mo 人工智能技术博客】胶囊网络——Capsule Network

    胶囊网络--Capsule Network 作者:林泽龙 1. 背景介绍 CNN 在处理图像分类问题上表现非常出色,已经完成了很多不可思议的任务,并且在一些项目上超过了人类,对整个机器学习的领域产生了 ...

最新文章

  1. R语言apropos函数查找包含特定字符的函数、find函数查找函数所在的位置实战
  2. 实验进行中:.NET WebAssembly支持
  3. 旷视AI「炼丹房」Brain++ 再升级!首席科学家孙剑发AI「灵魂」三问
  4. 使用ant进行junit测试
  5. java的优先队列注意事项
  6. hssfworkbook.write 生成文件 数据丢失_电脑文件丢失了,数据恢复我只用这一个软件!...
  7. gis 空间分析 鸟类栖息地选取_GIS空间分析专题一:鸟儿栖息地查找
  8. 零点起飞学Visual C++
  9. 搜索。深搜学习。深度优先搜索之数字全排列。nyoj,组合数
  10. smartadmin官网_smartadmin api_smartadmin 下载
  11. android如何查看手机中的db文件,查看sqlite数据库的表结构
  12. 【线上课程】4节课8小时培训,《白话区块链》作者蒋勇教你快速掌握区块链智能合约开发...
  13. Python技能树及 CSDN MarkDown编辑器测评
  14. 码云团队如何使用码云?
  15. 经济与金融大数据挖掘——知识点总结回顾
  16. 为什么有的已备案域名的备案会被注销?
  17. bga封装扇出过孔_pads router“BGA封装扇出”
  18. 融合CDN行为分析动态加速解决方案
  19. Kubernetes控制器和service
  20. 第四章:你造吗?CMOS传感器的构成与关键

热门文章

  1. 当你压力大到快崩溃时,不要跟任何人说,也不要觉得委屈
  2. 求营业额占比 【问题描述】 从键盘输入学校附近某烧烤店某年每月的营业额,然后计算每月的营业额在年营业额中所占的百分比(四舍五入为整数,且不会超过全年的70%),并以样例输出所示的水平直方图形式
  3. 实验一-Bomblab(炸弹实验)
  4. MMORPG的常规技能系统
  5. android随手记毕业论文,关于毕业论文的思考
  6. 2021全球程序员收入报告出炉
  7. 计算机弹音乐薛之谦的歌曲,薛之谦 万能音符(The Key) 薛之谦歌曲,薛之谦mp3在线试听 - 5nd音乐网...
  8. 恢复和去除时间(Recovery and Removal Time)
  9. CLUSTER 05: 块存储应用案例 分布式文件系统 对象存储
  10. Outlook邮箱开源许可-android