1.協(xié)議定義,簡單實(shí)現(xiàn)傳玩家的2D坐標(biāo)? ?
syntax = "proto3";
package SocketGameProtocol;
message PlayerInfo
{
float xPos=1;
float yPos=2;
}
2.在Unity的Assets目錄下創(chuàng)建一個Plugins文件夾(必須這樣命名),此文件專門存放擴(kuò)展文件,
再新建文件夾BaseInfolibrary,將Google.Protobuf.dll拖入
?3.新建一個Test.cs腳本
?腳本中引入命名空間
using SocketGameProtocol;
using Google.Protobuf;
using System;
using System.IO;
private PlayerInfo info;
public byte[] Init(Vector2 pos)
{
if (info == null)
{
info = new PlayerInfo();
}
info.XPos = pos.x;
info.YPos = pos.y;
byte[] data = Serialize(info);
return data;
}
//序列化
private byte[] Serialize(PlayerInfo model)
{
try {
using (MemoryStream ms = new MemoryStream()) {
model.WriteTo(ms);
return ms.ToArray();
}
} catch (Exception ex) {
Debug.Log ("序列化失敗: " + ex.ToString());
return null;
}
}
//反序列化
private PlayerInfo DeSerialize(byte[] data)
{
return PlayerInfo.Parser.ParseFrom(data);
}
后續(xù)
代碼改進(jìn):通用序列化模板(只用來序列化Message)
/// <summary>
/// 序列化protobuf
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static byte[] SerializeMsg(IMessage msg)
{
using (MemoryStream rawOutput = new MemoryStream())
{
msg.WriteTo(rawOutput);
byte[] result = rawOutput.ToArray();
return result;
}
}
/// <summary>
/// 反序列化protobuf
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataBytes"></param>
/// <returns></returns>
public static T DeserializeMsg<T>(byte[] dataBytes) where T : IMessage, new()
{
T msg = new T();
msg= (T)msg.Descriptor.Parser.ParseFrom(dataBytes);
return msg;
}
序列化前提還是要知道消息的類型,以下是調(diào)用
文章來源:http://www.zghlxwxcb.cn/news/detail-556571.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-556571.html
到了這里,關(guān)于Unity基于Google Protobuf序列化和反序列化小案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!