今天準備在unity中使用protobuf, 但是遇到了一些問題,記錄一下。
首先,我們到google protobuf github 上下載下傳工程,主要有兩個東西:
1.Protocol Compiler Installation
下載下傳位址:https://repo1.maven.org/maven2/com/google/protobuf/protoc/
作用:這個是将我們.proto檔案生成c#檔案的exe
我下載下傳了這個:
我放到了目錄:D:\Library\Protobuf\protoc-3.6.1-win32\ 下,然後将這個目錄加入到電腦的環境變量的Path中。
Proto目錄結構:
上面的那個.bat内容如下,用于将Proto目錄下的proto檔案生成c#檔案:
@echo off
cd Proto
set client_dest_path="..\..\..\Assets\Network\Protobuf"
set server_dest_path="..\..\TestServer"
for %%i in (*.*) do protoc --csharp_out=%client_dest_path% %%i
for %%i in (*.*) do protoc --csharp_out=%server_dest_path% %%i
echo success
pause
2.Protobuf Runtime Installation
(這個是運作時庫,因為我們要進行序列化和反序列化要用到的)
下載下傳位址:https://github.com/protocolbuffers/protobuf
下載下傳後,我們找到目錄protobuf-3.6.1\csharp\src下的Google.Protobuf.sln工程用vs2017打開,然後可以看到如圖的工程:
我們編譯紅框選中的工程就可以了,然後就會在目錄:protobuf-3.6.1\csharp\src\Google.Protobuf\bin\Debug\net45
中生成Google.Protobuf.dll這個運作時dll,這個就是運作時庫。
3.導入到unity
(1)将proto檔案對應生成的c#檔案放入到unity工程中
(2)将上面的Google.Protobuf.dll放入到unity工程中
恭喜你,你以為成功了嗎?哈哈哈,并沒有,錯誤來了,如圖:
第一個錯誤:
意思就是unity不支援net4.5的庫,隻支援net3.5的庫,于是在網上搜尋一圈,發現了這個:
https://github.com/bitcraftCoLtd/protobuf3-for-unity
這個就是unity對應的net3.5的protobuf版本,于是下載下傳下來呗,我打開工程後發現所有子工程都加載失敗了(如果你能正常加載工程那麼可以不管這個),原來是我沒有下載下傳.net core對應的庫,位址是:https://www.microsoft.com/net/download
然後就能正常編譯工程了,編譯後将對應的net3.5版本的Google.Protobuf.dll放到unity中即可。
第二個錯誤:
意思就是我們的net3.5版本的運作時庫中沒有這個UnknownFieldSet, 這時想起我們使用的是3.6.1的proto編譯器生成proto對應的c#檔案,版本太高了,于是我降到了3.4.0的proto編譯器,重新生成proto對應的c#檔案,此時這個錯誤也就消失了。
so,踩坑完畢~~