Unity中使用FlatBuffers

前言

记录下简单的使用和遇到的问题,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 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值不能跳空、重复等等,具体需要查看官方文档;

你可能感兴趣的:(unity3d)