Unity は C# Protobuf ソース コードを使用します

目次

ステップ 1: ソースコードをダウンロードする

ステップ 2: C# ビルド ファイルを実行する

 ステップ 3: エラー報告を処理する (対応する SDK をインストールしている場合、エラーは報告されません)

ステップ 4: ライブラリ ファイルをプロジェクトにコピーする

ステップ 1: ソースコードをダウンロードする

protobuf github ソース コードhttps://github.com/protocolbuffers/protobufソース コードをダウンロードして解凍し、protobuf-main フォルダーを取得します。

ステップ 2: C# ビルド ファイルを実行する

protobuf のソースコードは protobuf-main\csharp\src にありますが、sln プロジェクトを開いて自分で DLL をビルドしないでください。そのビルドツールを使用することをお勧めします。

PowerShell インターフェイスを開き、protobuf-main\csharp\build_packages.bat ファイルを実行します。

ここでエラーが発生しました。ターゲットの dotnetSDK が見つかりません。事前にインストールしている場合は、4 番目の手順に直接進みます。

 エラーメッセージ:

 ステップ 3: エラー報告を処理する (対応する SDK をインストールしている場合、エラーは報告されません)

エラーが報告されない場合は、ステップ 4 に進みます。

対応するバージョンをインストールするには、protobuf-main フォルダーの global.json 構成が一貫している必要があります。

ここでダウンロードしたのは.net6.0.100です

 

dotnet-sdk をインストールした後、再度実行します。

2 番目のステップを再度実行します。

PS C:\Users\HQ\Desktop\protobuf-main\csharp> C:\Users\HQ\Desktop\protobuf-main\csharp\build_packages.bat

C:\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.dll
  Google.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45\Google.Protobuf.dll
  Google.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>

ステップ 4: ライブラリ ファイルをプロジェクトにコピーする

ライブラリ ファイル パス: protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45

それをサードパーティのライブラリを示す ThirdParty フォルダに置きます。

ステップ 5: protoc.exe を使用してコードを生成するテスト

Google.Protobuf ライブラリでは、データのシリアル化と逆シリアル化にそれを使用する必要がありますが、どのように使用すればよいでしょうか? この前提として、適切な C# コードを生成するには protoc.exe を使用する必要があります。

この protobuf-main\csharp\generate_protos.sh を開きます

 

 

 いくつかの proto ファイルがコードに入力され、最終的に同じ名前の C# ファイルが構成パスに従って生成されることがわかります。

しかし!生成をテストしたいのですが、ソース コードに protoc.exe ファイルがないことがわかり、ハンマーを生成すると、操作によって必ず「プロトコル バッファ コンパイラが見つかりません」というエラーが報告されます。

つまり、次のコードは protoc コンパイラを設定しますが、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 ファイルを実行します。

テスト後、生成プロセスは正常に行われます。

ステップ 6: protobuf の使用を開始する

テストコード protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos のフォルダー全体を Unity にコピーします。

objフォルダとcsprojファイルを削除する

 protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos フォルダーは Unity の Scripts フォルダーに配置されます

テストのためにソースフォルダーからプロトをランダムに見つけます

 次に、208 行目のメッセージをランダムに選択します。

 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 update
    void 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 生成ツールの 2 つをダウンロードしました。

まず Google.Protobuf ソース コードを使用して DLL を生成し、それを Unity にスローします。

protoc.exe ツールを使用して、proto 定義ファイルと同じ名前の C# スクリプトを生成します。

次に、これらの生成された C# スクリプトをプロジェクトに投入すると、これらのスクリプトを使用してクラス オブジェクトをシリアル化および逆シリアル化できます。

 

おすすめ

転載: blog.csdn.net/liuyongjie1992/article/details/132226962