So verwenden Sie Google Protobuf in Unity

Vorbereitung

Einheit 2019.4.x
Protobuff 3.20.3

Wofür wird Protobuf verwendet?

Protobuf ist die Abkürzung für Protocol Buffers. Es handelt sich um eine von Google entwickelte Datenbeschreibungssprache. Es handelt sich um ein leichtes und effizientes strukturiertes Datenspeicherformat, das für die strukturierte Datenserialisierung oder Serialisierung verwendet werden kann. Es eignet sich sehr gut für die Datenspeicherung oder das RPC-Datenaustauschformat. Ein sprachunabhängiges, plattformunabhängiges und erweiterbares serialisiertes strukturiertes Datenformat, das in Kommunikationsprotokollen, Datenspeicherung und anderen Bereichen verwendet werden kann. proto2 bietet APIs in drei Sprachen: C++, Java und Python. Alle in Proto3 unterstützten Sprachen!

Wird hauptsächlich für (Daten-)Kommunikationsprotokolle, Datenspeicherung usw. verwendet.

Vorteile von Protobuf

Protobuf ähnelt XML und Json, ist jedoch kleiner, schneller und einfacher. Sie können Ihre eigene Datenstruktur definieren und dann den vom Codegenerator generierten Code verwenden, um diese Datenstruktur zu lesen und zu schreiben. Sie können sogar Datenstrukturen aktualisieren, ohne das Programm erneut bereitzustellen. Verwenden Sie Protobuf, um die Datenstruktur einmal zu beschreiben, und Ihre strukturierten Daten können problemlos in verschiedenen Sprachen oder aus verschiedenen Datenströmen gelesen und geschrieben werden.

Es verfügt über eine großartige Funktion, das heißt, es verfügt über eine gute „Abwärtskompatibilität“, und Benutzer können die Datenstruktur aktualisieren, ohne die bereitgestellten Programme zu beschädigen, die auf dem „alten“ Datenformat basieren. Auf diese Weise muss sich Ihr Programm nicht um umfangreiche Coderekonstruktionen oder -migrationen kümmern, die durch Änderungen in der Nachrichtenstruktur verursacht werden. Denn durch das Hinzufügen eines neuen Feldes in der Nachricht werden keine Änderungen am bereits veröffentlichten Programm vorgenommen.

Protobuf verfügt über eine klarere Semantik und erfordert nichts Vergleichbares wie einen XML-Parser (da der Protobuf-Compiler die .proto-Datei kompiliert, um die entsprechende Datenzugriffsklasse zum Serialisieren und Deserialisieren von Protobuf-Daten zu generieren).

Für die Verwendung von Protobuf ist es nicht erforderlich, ein komplexes Dokumentobjektmodell zu erlernen. Das Programmiermodell von Protobuf ist benutzerfreundlich und leicht zu erlernen. Gleichzeitig verfügt es über eine gute Dokumentation und Beispiele. Für Leute, die einfache Dinge mögen, ist Protobuf attraktiver als andere Technologien.

Herunterladen und installieren

Laden Sie 3.20.3 Google Protobuff hier herunter

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Entpacken Sie es nach dem Herunterladen in Ihren festen Ordner!

Hauptgrundtypen (andere können Sie selbst überprüfen)

.Prototyp Java-Typ C++-Typen Anmerkung
doppelt doppelt doppelt
schweben schweben schweben
int32 int int32 Verwenden Sie die Kantenlängenkodierung. Bei der Kodierung negativer Zahlen ist dies nicht effizient genug. Wenn das Feld möglicherweise negative Zahlen enthält, verwenden Sie sint32
sint32 lang int32 Verwenden Sie die Kantenlängenkodierung. Ganzzahliger Wert mit Vorzeichen. Effizienter als int32 beim Codieren
sint64 lang int64 Verwenden Sie die Kantenlängenkodierung. Ganzzahliger Wert mit Vorzeichen. Effizienter als int62 beim Codieren
Zeichenfolge Zeichenfolge Zeichenfolge Eine Zeichenfolge muss UTF8- oder 7-Bit-ASCII-codierter Text sein
bool Boolescher Wert bool

Spezialgebiete

Englisch Chinesisch Anmerkung
Aufzählung Aufzählungen (Zahlen, die bei Null beginnen) funktionieren, indem sie eine „definierte Wertefolge“ für das Feld angeben. Aufzählung Sex{Man=0;Women=1}
Nachricht Nachrichtentext, Klasse in C# Nachricht Benutzer{}
wiederholt Array oder Sammlung, C#-Liste ODER [ ] wiederholter Benutzer user= 0
// Kommentar //Kommentare hier
verlängern Expandieren Benutzer erweitern{}
Paket Paketnamen Namespaces in C# zur Vermeidung von Namenskonflikten

Schreiben Sie eine .proto-Datei

binWir finden den Ordner in dem Ordner, den wir gerade entpackt haben,
Fügen Sie hier eine Bildbeschreibung einund erstellen einen neuen TXT-Textnamen Person.proto. Denken Sie daran, das Suffix .txt in .proto zu ändern
und den Code einzugeben.

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;
}

Dann erstellen Sie es in diesem Ordner ExProtProto.bat, geben Sie den Befehl ein und speichern Sie es.

Fügen Sie hier eine Bildbeschreibung ein
Doppelklicken Sie und wir stellen fest, dass die Datei ExProtProto.batgeneriert wirdPerson.cs
Fügen Sie hier eine Bildbeschreibung ein

Verwendung in Unity

Dann öffnen wir Unity, erstellen einen neuen Ordner Proto und platzieren den gerade generierten Person.csCode im Proto-Ordner.

Fügen Sie hier eine Bildbeschreibung ein
Zu diesem Zeitpunkt wird die Unity-Konsole in großer Zahl rot! Dies wird durch fehlende Referenzen Person.csverursacht .
Wir öffnen es mit vs und Person.csklicken in der oberen Menüleiste auf Extras > NuGet-Paketmanager > NuGet-Verwaltungspaketversion
Fügen Sie hier eine Bildbeschreibung ein
der Lösung verwalten. Sie müssen die entsprechende Version auswählen, die wir zu Beginn heruntergeladen haben, sonst ist sie inkompatibel! Wählen Sie hier 3.20.3. Klicken Sie dann auf Installieren. Nachdem die Installation abgeschlossen ist, öffnen wir das Stammverzeichnis des Unity-Projekts.
Fügen Sie hier eine Bildbeschreibung ein

Setzen Sie jeweils
.\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
Diese DLL-Dateien werden im Ordner „Assets/Plugins“ abgelegt. Warten Sie, bis Unity neu kompiliert wurde, und löschen Sie dann die Konsole, um den Fehler zu beheben.

Hinweis: Die DLL-Datei in netstandard2.0 wird hier ausgewählt, da die API-Version in Unity2019.4.x .NET Standard 2.0 entspricht. Verschiedene Versionen von Unity müssen unterschiedliche Netzversionen finden, denen sie entsprechen, andernfalls kommt es im Allgemeinen zu Konflikten Höhere Versionen Die Unityapi-Version ist netstandard2.1
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Beginnen Sie dann mit dem Schreiben von Serialisierungs- und Deserialisierungstools. Tatsächlich ähnelt es dem Json, mit dem jeder vertraut ist. Bei der Netzwerkkommunikation serialisiert das Front-End die Entitätsobjektdaten in eine Zeichenfolge im Json-Format und übergibt sie an das Back-End Anschließend werden die empfangenen Back-End-Daten in ein Objekt deserialisiert, das vom Front-End verwendet werden kann. Beachten Sie, dass Proto die Instanz in ein binäres Datenformat serialisiert!

Wir erstellen gemeinsam ein neues ProtoBufffer.csDrehbuch

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;
        }
    }
}

Nachdem Sie ein Test.csSkript zum Testen der Funktionalität erstellt haben, ziehen Sie das Skript auf die Hauptkamera.

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}");
    }
}

Führen Sie Unity aus und sehen Sie sich Konsolenmeldungen an. Serialisierung und Deserialisierung erfolgreich!
Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/weixin_43298513/article/details/135462197
Recomendado
Clasificación