Unity使用C# Protobuf源码

目录

第一步:下载源码

第二步:运行C#构建文件

 第三步:处理报错(如果你已安装对应的SDK则不会报错)

第四步:复制库文件到你的工程

第一步:下载源码

protobuf github源码https://github.com/protocolbuffers/protobuf下载后解压源码,得到文件夹protobuf-main

第二步:运行C#构建文件

protobuf的源码在protobuf-main\csharp\src里,但不要自己打开这个sln工程自己去构建dll,我自己试了一下有不少问题。建议用它的构建工具。

打开powershell界面,运行protobuf-main\csharp\build_packages.bat文件

我这里有报错,缺目标dotnetSDK,如果你提前安装过了,直接去第四步。

 报错提示:

 第三步:处理报错(如果你已安装对应的SDK则不会报错)

如果没报错,去往第四步。

安装对应的版本,一定要protobuf-main文件夹的global.json配置保持一致

我这里下载的是.net6.0.100

 

安装完dotnet-sdk后,再次执行

再次运行第二步:

PS C:\Users\HQ\Desktop\protobuf-main\csharp> C:\Users\HQ\Desktop\protobuf-main\csharp\build_packages.batC:\Users\HQ\Desktop\protobuf-main\csharp>dotnet restore src/Google.Protobuf.sln欢迎使用 .NET 6.0!
---------------------
SDK 版本: 6.0.100遥测
---------
.NET 工具会收集用法数据,帮助我们改善你的体验。它由 Microsoft 收集并与社区共享。你可通过使用喜欢的 shell 将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 "1" 或 "true" 来选择退出遥测。阅读有关 .NET CLI 工具遥测的更多信息: https://aka.ms/dotnet-cli-telemetry----------------
已安装 ASP.NET Core HTTPS 开发证书。
若要信任该证书,请运行 "dotnet dev-certs https --trust" (仅限 Windows 和 macOS)。
了解 HTTPS: https://aka.ms/dotnet-https
----------------
编写你的第一个应用: https://aka.ms/dotnet-hello-world
查找新增功能: https://aka.ms/dotnet-whats-new
浏览文档: https://aka.ms/dotnet-docs
在 GitHub 上报告问题和查找源: https://github.com/dotnet/core
使用 "dotnet --help" 查看可用命令或访问: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------正在确定要还原的项目…已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.JsonDump\Google.Protobuf.JsonDump.csproj (用时 234 ms)。已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos\Google.Protobuf.Test.TestProtos.csproj (用时 234 ms)。已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\AddressBook\AddressBook.csproj (用时 234 ms)。已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj (用时 343 ms)。
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。  [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。  [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj (用时 3.25 sec)。已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj (用时 3.25 sec)。C:\Users\HQ\Desktop\protobuf-main\csharp>dotnet pack -c Release src/Google.Protobuf.sln -p:ContinuousIntegrationBuild=true   || goto :error
用于 .NET 的 Microsoft (R) 生成引擎版本 17.0.0+c9eb9dd64
版权所有(C) Microsoft Corporation。保留所有权利。正在确定要还原的项目…
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。  [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。  [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]所有项目均是最新的,无法还原。
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]Google.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\netstandard1.1\Google.Protobuf.dllGoogle.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45\Google.Protobuf.dllGoogle.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\netstandard2.0\Google.Protobuf.dll
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]已成功创建包“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\Google.Protobuf.3.24.0.nupkg” 。C:\Users\HQ\Desktop\protobuf-main\csharp>goto :EOF
PS C:\Users\HQ\Desktop\protobuf-main\csharp>

第四步:复制库文件到你的工程

库文件路径:protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45

放到ThirdParty文件夹里,表示第三方库

第五步: 测试使用protoc.exe生成代码

有了Google.Protobuf的库,我们肯定是要用它序列化和反序列化数据,如何使用它呢?这有个前提就是,我们需要使用protoc.exe帮我们生成好的C#代码。

打开这个protobuf-main\csharp\generate_protos.sh

 

 

 可以看到,代码里输入了一些proto文件,最终,同名的C#文件会根据配置路径生成出来。

但是!!!我想测试一下生成,发现源码里居然没有protoc.exe文件,那生成个锤子,运行肯定报错,"Unable to find protocol buffer compiler."

也就说,下面代码设置protoc编译程序,没有一个是存在的。。。

 先去github下载protoc工具                        

protoc 官网下载地址https://github.com/protocolbuffers/protobuf/releases下载源码工具zip压缩包,加压后在bin文件夹里有可执行程序protoc.exe

把这个protoc.exe文件拷贝到protobuf-main\csharp路径下,如图

下面开始修改生成文件的脚本,让sh代码识别到这个protoc.exe文件并为我们生成测试文件

使用notpad++打开generate_protos.sh文件

 在PROTOC_LOCATIONS变量中,添加"csharp/protoc.exe",这个路径是相对于根路径的,所以前面加上了csharp文件夹路径。

为何测试是否能生成,我们把目标文件夹的pb.cs文件全部删除 

 然后执行generate_protos.sh文件

经测试,生成流程正常。

第六步: 开始使用protobuf

把测试代码protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos整个文件夹拷贝到Unity中

剔除obj文件夹和csproj文件

 protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos文件夹放到Unity的Scripts文件夹里

我们从源码文件夹里随便找个proto做测试

 然后随机选择208行的一个message

 在Unity里新建脚本TestProto.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;using Google.Protobuf;
using Google.Protobuf.TestProtos.Proto2;
public class TestProto : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){ForeignMessage message1 = new ForeignMessage();message1.C = 1;message1.D = 2;byte[] result = message1.ToByteArray();string messag1Byte = "";for (int i = 0; i < result.Length; i++){messag1Byte += result[i] + "|";}Debug.LogError(messag1Byte);ForeignMessage message2 = ForeignMessage.Parser.ParseFrom(result);Debug.LogError("message2.C: " + message2.C);Debug.LogError("message2.D: " + message2.D);}
}

查看打印结果

总结:

本文章下载了两个东西,分别是Google.Protobuf源码,和C#版本的protoc.exe生成工具

先使用Google.Protobuf源码生成了DLL,扔到Unity中

使用protoc.exe工具把 proto定义文件生成同名的C#脚本

再把这些生成的C#脚本扔到工程中,就可以使用这些脚本序列化和反序列化类对象了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/62921.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯前端 -- html转pdf插件总结

一、html2canvasjsPDF&#xff08;文字会被截断&#xff09;&#xff1a; 将HTML元素呈现给添加到PDF中的画布对象&#xff0c;不能仅使用jsPDF&#xff0c;需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf&#xff08;内容显示不全文字会被截断…

使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功 1. Linux(centos8…

数据分析两件套ClickHouse+Metabase(二)

Metabase篇 Metabase安装部署 任何问题请查看 -> 官方文档 jar包从GitHub下载 -> 地址 同样有个问题, 默认数据源里没有ClickHouse, 不过ClickHouse官方提供了插件包 -> 插件包 在安装metabase目录下新建一个plugins文件夹, 把下载的clickhouse.metabase-driver.ja…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

CAD练习——绘制电风扇

注意要在三维空间内完成绘制 先绘制扇叶 两条射线确定角度 绘制圆弧&#xff08;圆修剪&#xff09; 绘制扇叶形状&#xff08;3点圆弧&#xff09; 圆角&#xff1a; 将这几段圆弧合成同一条多段线 换个立体视图 拉伸出厚度 绘制一个球 取二者交集&#xff08;带弧面的扇叶&a…

k8s 滚动更新控制(一)

在传统的应用升级时&#xff0c;通常采用的方式是先停止服务&#xff0c;然后升级部署&#xff0c;最后将新应用启动。这个过程面临一个问题&#xff0c;就是在某段时间内&#xff0c;服务是不可用的&#xff0c;对于用户来说是非常不友好的。而kubernetes滚动更新&#xff0c;…

Field Symbol与数据引用的几个应用

这俩货都是指针。在动态编程里用。 但是从好理解的角度来看&#xff0c;都给他们理解成数据对象。 都得指向其他的数据对象。不过field symbol指的是其他的数据对象内存地址的值。而数据引用只是指向内存地址。 1.Field symbol 当Field Symbol指向了其他的数据对象&#xf…

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中&#xff0c;多数据源支持多种形态的数据接入&#xff0c;其中API是企业生产过程中常见的数据形态。使用数据源的集成配置&#xff0c;以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能&#xff0c;使得从不同数据源获取和处理数据变得更加…

到 2030 年API 攻击预计将激增近 1000%

导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计&#xff0c;截至 2030 年 API 攻击将激增 996%&#xff0c;意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…

fabric.js里toDataURL后,画布内容展示不全?

复现场景&#xff1a; 用fabric生成画布后&#xff0c;转成图片&#xff0c;然后直接在浏览器里打开&#xff0c;画布展示内容缺失 画布原图&#xff1a; toDataURL后链接在浏览器打开&#xff1a; 原因解析&#xff1a; base64链接太长&#xff0c;输入浏览器链接被截断&…

软件测试面试题——如何测试App性能?

为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&#xff0c;那该应用的用户粘…

PHP利用PCRE回溯次数限制绕过某些安全限制实战案例

目录 一、正则表达式概述 有限状态自动机 匹配输入的过程分别是&#xff1a; DFA&#xff08;确定性有限状态自动机&#xff09; NFA&#xff08;非确定性有限状态自动机&#xff09; 二、回溯的过程 三、 PHP 的 pcre.backtrack_limit 限制利用 例题一 回溯绕过步骤 &…