Unity で Google Protobuf を使用する方法

準備

ユニティ 2019.4.x
プロトバフ 3.20.3

Protobuf は何に使用されますか?

Protobuf は Protocol Buffers の略称で、Google が開発したデータ記述言語です。構造化データのシリアル化またはシリアル化に使用できる、軽量で効率的な構造化データ ストレージ形式です。データストレージまたは RPC データ交換フォーマットに非常に適しています。言語、プラットフォームに依存しない、拡張可能なシリアル化された構造化データ形式であり、通信プロトコル、データ ストレージ、その他の分野で使用できます。proto2 は、C++、Java、Python の 3 つの言語で API を提供します。proto3では全言語対応!

主に(データ)通信プロトコル、データストレージなどに使用されます。

プロトブフの利点

Protobuf は XML や Json に似ていますが、より小さく、高速で、シンプルです。独自のデータ構造を定義し、コード ジェネレーターによって生成されたコードを使用して、このデータ構造の読み取りと書き込みを行うことができます。プログラムを再デプロイせずにデータ構造を更新することもできます。Protobuf を使用してデータ構造を一度記述すると、構造化データをさまざまな言語で、またはさまざまなデータ ストリームから簡単に読み書きできるようになります。

これには優れた「下位」互換性があり、「古い」データ形式に依存するデプロイされたプログラムを壊すことなくデータ構造をアップグレードできるという優れた機能があります。このようにして、プログラムはメッセージ構造の変更による大規模なコードの再構築や移行を心配する必要がなくなります。メッセージに新しいフィールドを追加しても、すでに公開されているプログラムは変更されないためです。

Protobuf はより明確なセマンティクスを備えており、XML パーサーのようなものは必要ありません (Protobuf コンパイラーが .proto ファイルをコンパイルして、Protobuf データをシリアル化および逆シリアル化するための対応するデータ アクセス クラスを生成するためです)。

Protobuf を使用するために複雑なドキュメント オブジェクト モデルを学習する必要はありません。Protobuf のプログラミング モデルはフレンドリーで簡単に学習できます。同時に、優れたドキュメントとサンプルが用意されています。シンプルなものを好む人にとって、Protobuf は他のものよりも魅力的です。テクノロジー。

ダウンロードとインストール

3.20.3 Google Protobuff のダウンロードはこちらから

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ダウンロード後、所定のフォルダに解凍してください!

主な基本タイプ(その他はご自身で確認可能)

。プロトタイプ Java型 C++ の型 述べる
ダブル ダブル ダブル
浮く 浮く 浮く
int32 整数 int32 エッジ長エンコーディングを使用します。負の数値をエンコードする場合は効率が十分ではありません。フィールドに負の数値が含まれる可能性がある場合は、sint32 を使用してください。
sint32 長さ int32 エッジ長エンコーディングを使用します。符号付き整数値。エンコード時に int32 よりも効率的
sint64 長さ int64 エッジ長エンコーディングを使用します。符号付き整数値。エンコード時に int62 よりも効率的
文字列は UTF8 または 7 ビット ASCII でエンコードされたテキストである必要があります
ブール ブール値 ブール

特別なフィールド

英文 中国語 述べる
列挙型 列挙 (ゼロから始まる数値) は、フィールドに「定義された値のシーケンス」を指定することで機能します。 enum 性別{男性=0;女性=1}
メッセージ メッセージ本文、C# のクラス ユーザーにメッセージを送信する{}
繰り返された 配列またはコレクション、C# リスト OR [ ] 繰り返しユーザー user= 0
// コメント //ここにコメント
伸ばす 拡大する ユーザーを拡張する{}
パッケージ パッケージ名 名前の競合を防ぐための C# の名前空間

.protoファイルを書き込む

先ほど解凍したフォルダー内でbinフォルダーを見つけて
ここに画像の説明を挿入します、新しい txt テキスト名を作成しますPerson.proto。接尾辞 .txt を .proto に変更し
てコードを入力することを忘れないでください。

syntax="proto3";//指定了正在使用proto3语法,如果没指定编译器默认使用proto2语法
package TestGoogleProtoBuff;//等于C#中命名空间

message personInfo
{
	string name=1;
	int32 age=2;
	int64 money=3;
	message PhoneNumber{
		string number=1;
		PhoneType type=2;
	}
	repeated PhoneNumber phone=5;
}

enum PhoneType{
	HOME=0;
	WORK=1;
	MOBILE=2;
}

次に、このフォルダーにそれを作成しExProtProto.bat、コマンドを入力して保存します。

ここに画像の説明を挿入します
ダブルクリックすると、ファイルExProtProto.batが生成されることがわかります。Person.cs
ここに画像の説明を挿入します

Unityでの使用

次に、Unity を開き、新しいフォルダー Proto を作成し、生成したばかりのPerson.csコードを Proto フォルダーに配置します。

ここに画像の説明を挿入します
この時unityコンソールが大量に赤くなります!これは参照が欠落していることがPerson.cs原因で発生します。
vs で開きPerson.cs、上部のメニュー バーの [ツール] > [NuGet パッケージ マネージャー] > [ソリューションの NuGet 管理パッケージ
ここに画像の説明を挿入します
バージョンの管理] をクリックします。最初にダウンロードした対応するバージョンを選択する必要があります。選択しないと互換性がありません。ここでは 3.20.3 を選択します。次に、「インストール」をクリックします。インストールが完了したら、Unity プロジェクトのルート ディレクトリを開きます。
ここに画像の説明を挿入します

それぞれ
.\Packages\Google.Protobuf.3.20.3\lib\netstandard2.0\Google.Protobuf.dll
.\Packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll
.\を配置します。 Packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll
.\Packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe .dll
これらの dll ファイルは Assets/Plugins フォルダーに配置され、Unity が再コンパイルされるのを待ってから、コンソールをクリアしてエラーを解消します。

注: ここでは、unity2019.4.x の API バージョンが .NET Standard 2.0 に対応しているため、netstandard2.0 の dll ファイルが選択されています。Unity の異なるバージョンは、対応する異なるネット バージョンを見つける必要があります。そうしないと、一般的に競合が発生します。上位バージョン unyapi のバージョンは netstandard2.1
ここに画像の説明を挿入します

ここに画像の説明を挿入します

次に、シリアル化および逆シリアル化ツールの作成を開始します。実際、これは誰もがよく知っている Json に似ています。ネットワーク通信では、フロントエンドはエンティティ オブジェクト データを Json 形式の文字列にシリアル化し、それをバックエンドに渡します次に、受信したバックエンド データは、フロントエンドで使用できるオブジェクトに逆シリアル化されます。proto はインスタンスをバイナリ データ形式にシリアル化することに注意してください。

Unityで新しいProtoBufffer.csスクリプトを作成します

using Google.Protobuf;
public class ProtoBufffer
{
    
    
    public static byte[] Serialize(IMessage message)
    {
    
    
        return message.ToByteArray();
    }

    public static T DeSerialize<T>(byte[] packet)where T:IMessage, new()
    {
    
    
        IMessage message = new T();
        try
        {
    
    
            return (T)message.Descriptor.Parser.ParseFrom(packet);
        }
        catch (System.Exception e)
        {
    
    
            throw;
        }
    }
}

Test.cs機能をテストするスクリプトを作成した後、そのスクリプトをメイン カメラにドラッグします。

using TestGoogleProtoBuff;
using UnityEngine;

public class Test : MonoBehaviour
{
    
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        personInfo info = new personInfo();
        info.Name = "ys";
        info.Age = 50;
        info.Money = 9999;
        info.Phone.Add(new personInfo.Types.PhoneNumber {
    
     Number = "12123",Type=PhoneType.Home});
        byte[] msg = ProtoBufffer.Serialize(info);
        Debug.Log(msg.Length);

        personInfo deinfo  = ProtoBufffer.DeSerialize<personInfo>(msg);
        Debug.Log("姓名:"+deinfo.Name);
        Debug.Log("年龄:"+deinfo.Age);
        Debug.Log("资产:" + deinfo.Money);
        Debug.Log($"{
      
      deinfo.Phone[0].Type}的电话号:{
      
      deinfo.Phone[0].Number}");
    }
}

Unity を実行し、コンソール メッセージを表示します。シリアル化と逆シリアル化が成功しました。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_43298513/article/details/135462197