Unity中使用FlatBuffers

发表于2018-07-08
评论0 3.3k浏览
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值不能跳空、重复等等,具体需要查看官方文档。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论