Unity中使用FlatBuffers
发表于2018-07-08
FlatBuffers是Google开发的一个开源的,跨平台的,高效的,提供 C++/Java/Go/C#接口支持的序列化工具库。本篇文章要和大家介绍的是Unity引擎中如何使用FlatBuffers。
一、准备工作
1.下载flatc.exe工具和FlatBuffers源码,链接点这里;
2.用Visual Studio打开源码/net/FlatBuffers项目,编译输出类库文件FlatBuffers.dll后导入Unity工程;
3.官方文档可点这里;
4.官方C#示例代码可见源码/tests/FlatBuffers.Test工程
二、正式使用
1.编写fbs文件,文件内容大致如下(这里贴出简单的示例,具体可参考官方文档)
文件名:Worker.fbs
namespace MyData; enum Type : byte {WORKER,MANAGER} struct Data { age : int = 20; } table Worker { name : string; type:Type = MANAGER; info:Data; } root_type Worker;
2.使用cmd工具,将fbs文件编译为同名cs文件
E:\FlatBuffersStudy\Generate>flatc /? ---使用该命令查看详细参数 E:\FlatBuffersStudy\Generate>flatc -n monster_test.fbs --gen-onefile
编译出错时,有提示,如果没有error提示,说明文件编译成功,在同级目录下出现同名cs文件monster_test.cs
3.将cs文件拖入Unity工程后,即可新建cs脚本文件进行使用,
using System.Collections; using System.Collections.Generic; using UnityEngine; using FlatBuffers; using MyData; using System.IO; public class TestFlatBuffers : MonoBehaviour { #region Unity Methods void Start () { FlatBufferBuilder fbb = new FlatBufferBuilder(1); StringOffset name = fbb.CreateString("zengtao"); Worker.StartWorker(fbb); Worker.AddName(fbb, name); Worker.AddType(fbb, Type.MANAGER); Worker.AddInfo(fbb, Data.CreateData(fbb, 28)); var wo = Worker.EndWorker(fbb); Worker.FinishWorkerBuffer(fbb,wo); File.WriteAllBytes(Application.dataPath + "worker.mon", fbb.DataBuffer.Data); var result = Worker.GetRootAsWorker(fbb.DataBuffer); Debug.LogFormat("info:name:{0},type:{1}", result.Name, result.Info.Value.Age); } }
遇到的问题
1.fbs文件中struct结构体中的字段只能使用scalar类型,具体请见官方文档;
2.在脚本文件中序列化数据时,结构体的序列化只能在行内,且必须在Start和End之间,比如上面代码中的
Worker.AddInfo(fbb, Data.CreateData(fbb, 28));
这句代码如果放在Worker.StartWorker(fbb);之前或者var wo = Worker.EndWorker(fbb);之后,或者写成下面这样
Offset<Data> myData = Data.CreateData(fbb,28); Worker.AddInfo(fbb,myData);
都是不行的,会报错 struct must be serilized inline;
3.我最开始用这段fbs生成的文件测试时,总是报空值错误,调试查看序列化的结构体赋值是不成功的,网上各种查资料都不知道为什么,后来我把官方示例的monster_test.fbs文件删减了一下,大概样式和我写的这个差不多,测试正常,而且再重新使用我写的fbs文件后也正常了,不清楚为什么;
4.在编译fbs文件时,我先用了和源码版本不同的flatc.exe工具,编译是成功的,但在Unity工程中会报错生成的cs类继承了密封类,当然是错误的,不过我不知道用的flatc.exe是什么版本的,因为不是官方下载的,是别人的老旧版本,后来换成官方同版本的flatc.exe工具后就好了,这里提醒下;
5.使用FlatBuffers有很多注意事项,比如struct结构体中的字段不能删除,table中特性id值不能跳空、重复等等,具体需要查看官方文档。
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引