之前介绍的 NetworkMessages 没有序列化 和反序列化 包括 官方文档 也没有 在此 介绍一下
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,在简单点 就是 存储起来 反序列化 就是 解析出来
下面介绍下 在NetworkMessages 中 序列化 和反序列化 的使用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
public class UnetMessage : NetworkBehaviour
{
private static UnetMessage instance;
public static UnetMessage Instance
{
get
{
if (instance == null)
{
instance = GameObject.FindObjectOfType(typeof(UnetMessage)) as UnetMessage;
if (instance == null)
{
GameObject unetMessage = new GameObject();
unetMessage.name = "NetworkMessage";
instance = unetMessage.AddComponent(typeof(UnetMessage)) as UnetMessage;
}
}
return instance;
}
}
//统一传输信道
private const short chatChannel = 139;
public event System.Action<NetworkMessage> OnReceiveMessage;
/// <summary>
/// Message 初始化
/// 注册 服务器 客户端接收消息
/// </summary>
public void MessageInit()
{
//如果服务器激活
if (NetworkServer.active)
{
NetworkServer.RegisterHandler(chatChannel, ServerReceiveMessage);
}
UnetManager.Instance.client.RegisterHandler(chatChannel, ClientReceiveMessage);
}
//客户端接收消息 (UI赋值)
private void ClientReceiveMessage(NetworkMessage message)
{
if (OnReceiveMessage != null)
{
OnReceiveMessage(message);
}
}
//服务器接收消息
private void ServerReceiveMessage(NetworkMessage message)
{
MessageLib messageLib = message.ReadMessage<MessageLib>();
NetworkServer.SendToAll(chatChannel, messageLib);
}
//发送消息
public void SendMessage(MessageBase message)
{
UnetManager.Instance.client.Send(chatChannel, message);
}
}
public class MessageLib : MessageBase
{
public string DialogType;
public string RoleName;
public string Message;
public string Time;
public MessageLib()
{
}
public MessageLib(string dialogType, string roleName, string message, string time)
{
DialogType = dialogType;
RoleName = roleName;
Message = message;
Time = time;
}
public override void Serialize(NetworkWriter writer)
{
base.Serialize(writer);
writer.Write(DialogType);
writer.Write(RoleName);
writer.Write(Message);
writer.Write(Time);
}
public override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
DialogType = reader.ReadString();
RoleName = reader.ReadString();
Message = reader.ReadString();
Time = reader.ReadString();
}
}
在接收回调的时候 反序列化出来
public void OnReceiveMessage(NetworkMessage networkMessage)
{
MessageLib messageLib = networkMessage.ReadMessage<MessageLib>();
string dingoType = messageLib.DialogType;
string RoleName = messageLib.RoleName;
string message = messageLib.Message;
string time = messageLib.Time;
if (_shareMessage.text == "")
{
_shareMessage.text += string.Format("[{0}]:{1} {2}", dingoType, RoleName, message);
}
else
{
_shareMessage.text += string.Format("\n[{0}]:{1} {2}", dingoType, RoleName, message);
}
Vector2 tempSize = _messageRect.sizeDelta + new Vector2(0, 30);
_messageRect.sizeDelta = tempSize;
}