终于从北京回上海了,第一次听unity开发者大会,感觉讲的都是一些Unity 5新功能的介绍,其实主要还是要靠自己去摸索那些新的功能,主要就是添加了新的GUI系统,貌似集成了NGUI到Unity中,取名UGUI,还有就是集成了新的声音系统和新的动画系统,我感觉新的声音系统还是比较强大的,期待unity5的问世。大会上介绍了一些常用的插件以及Test Tools的使用,总体而言都是一些展望未来性质多点哈。希望Unity越来越强大!
废话不多说,接下来介绍一下客户端服务器通讯常用的一种方法——Marshal类,这个类是.NETFramework2.0中的类,所以我们能够将其用于Unity中。与这个类类似的还有litjson等,可能是为了节省字节空间,Marshal类只仅仅将值进行打包成bytes流,而json还包含前面的key值。当然你也可以选择json的方式,我这里仅仅介绍Marshal类的使用。点击进入MSDN中Marshal类的介绍和使用
在这之前首先要了解一下关于字节序的大端和小端模式,点击阅读,可以参考这篇文章了解一下。这里我用的window的机器是小端模式。
效果图
代码
Model类:
-
using System;
-
using System.Runtime.InteropServices;
-
-
namespace mershal
-
{
-
class Model
-
{
-
[Serializable]
-
[StructLayout(LayoutKind.Sequential,Pack = 1)]//按1字节对齐
-
publicstruct Student
-
{
-
public UInt32 id;
-
[MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst=20)]
-
publicstring name;//姓名
-
}
-
}
-
-
class Method
-
{
-
/// <summary>
-
/// 结构体转bytes
-
/// </summary>
-
/// <param name="structObj">结构体</param>
-
/// <param name="decCount">默认0,不截取</param>
-
/// <returns></returns>
-
publicstaticbyte[] StructToBytes(object structObj, Int32 decCount)
-
{
-
Int32 size = Marshal.SizeOf(structObj);
-
//开辟空间
-
IntPtr buffer = Marshal.AllocHGlobal(size);
-
try
-
{
-
Marshal.StructureToPtr(structObj, buffer, false);
-
byte[] bytes = newbyte[size - decCount];
-
Marshal.Copy(buffer, bytes, 0, size - decCount);
-
return bytes;
-
}
-
finally
-
{
-
//释放空间
-
Marshal.FreeHGlobal(buffer);
-
}
-
}
-
/// <summary>
-
/// byte转结构体
-
/// </summary>
-
/// <param name="bytes">byte数组</param>
-
/// <param name="type">结构体类型</param>
-
/// <returns></returns>
-
publicstaticobject ByteToStruct(byte[] bytes, Type type)
-
{
-
Int32 size = Marshal.SizeOf(type);
-
//byte数组长度小于结构体大小
-
if (size > bytes.Length)
-
{
-
//返回空
-
returnnull;
-
}
-
//分配结构大小的内存空间
-
IntPtr structPtr = Marshal.AllocHGlobal(size);
-
//将byte数组拷贝到分配好的内存空间
-
Marshal.Copy(bytes, 0, structPtr, size);
-
//将内存空间转换成目标结构
-
object obj = Marshal.PtrToStructure(structPtr, type);
-
//释放内存空间
-
Marshal.FreeHGlobal(structPtr);
-
//返回结构
-
return obj;
-
}
-
}
-
}
主函数:
-
using System;
-
-
namespace mershal
-
{
-
class Program
-
{
-
staticvoid Main(string[] args)
-
{
-
//实例化
-
Model.Student stu1 = new Model.Student();
-
stu1.id = 1;
-
stu1.name = "丁小未";
-
//打包
-
byte[] byte1 = Method.StructToBytes(stu1,0);
-
Console.WriteLine("字节长度:"+byte1.Length);
-
//解析
-
Model.Student stu = (Model.Student)Method.ByteToStruct(byte1, typeof(Model.Student));
-
Console.WriteLine("\n输出的学生信息\nid:" + stu.id+"\nname:"+stu.name);
-
Console.Read();
-
}
-
}
-
}
通信方面可以参考我之前写的,然后结合此文,来做自己的网络游戏!
更多教程,欢迎关注我的微博 !
本文转蓬莱仙羽 51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1397266,如需转载请自行联系原作者