Unity 使用 Protobuf(Pb2)二进制数据全流程工具详解

前言

在Unity游戏开发中,高效、快速、安全地读取配置数据是一项重要需求。本文介绍一种完整的解决方案——使用Protobuf二进制格式(Pb2)存储和读取游戏数据,并详细分享实现全流程的Unity工具。

一、技术流程概览

实现Unity读取Pb2二进制数据的流程如下:

  1. Excel设计数据表
  2. Excel转Proto文件
  3. Proto文件转C#类
  4. Excel数据序列化为Pb2二进制文件
  5. Unity中加载Pb2数据文件

二、具体实现步骤

1. Excel设计数据表

数据表应遵循特定的格式规范:

  • 第一行:字段注释
  • 第二行:字段名(英文变量名)
  • 第三行:字段数据类型(例如int32、string)
  • 第四行及以下:数据内容

2. Excel转Proto文件

使用自定义编辑器工具自动将Excel表转换为.proto文件。

关键代码ProtoGenerator.cs

private void GenerateProtoFile()
        {
            FileInfo fileInfo = new FileInfo(excelFilePath);
            if (!fileInfo.Exists)
            {
                Debug.LogError("Excel 文件不存在: " + excelFilePath);
                return;
            }

            // 确保输出目录存在
            if (!Directory.Exists(outputFolder))
            {
                Directory.CreateDirectory(outputFolder);
            }

            // 定义 .proto 文件头部信息
            string protoContent = "syntax = \"proto3\";\n";
            protoContent += "package GameDataProto;\n\n";

            using (ExcelPackage package = new ExcelPackage(fileInfo))
            {
                // 遍历所有工作表,每个工作表生成一个 message
                foreach (ExcelWorksheet worksheet in package.Workbook.Worksheets)
                {
                    string messageName = worksheet.Name;
                    protoContent += $"message {messageName} {
  
  {\n";

                    // 假定第一行为注释,第二行为变量名,第三行为类型
                    int colCount = worksheet.Dimension.Columns;
                    int fieldIndex = 1;
                    for (int col = 1; col <= colCount; col++)
                    {
                        object commentObj = worksheet.Cells[1, col].Value;
                        object variableNameObj = worksheet.Cells[2, col].Value;
                        object typeObj = worksheet.Cells[3, col].Value;

                        if (variableNameObj == null || typeObj == null)
                            continue;

                        string comment = commentObj != null ? commentObj.ToString().Trim() : "";
                        string variableName = variableNameObj.ToString().Trim();
                        string type = typeObj.ToString().Trim();

                        if (!string.IsNullOrEmpty(comment))
                        {
                            protoContent += $"    // {comment}\n";
                        }

                        protoContent += $"    {type} {variableName} = {fieldIndex};\n";
                        fieldIndex++;
                    }

                    protoContent += "}\n\n";
                }
            }

            string protoFilePath = Path.Combine(outputFolder, "GameDataProto.proto");
           
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪小心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值