向UE5项目中集成Protobuf

Wed, Oct 12, 2022dyzdyz010gameprotobufue5

虚幻引擎版本:5.0.3

Protobuf版本:21.7

作为不懂C++的人,向UE集成C++库真的是一种折磨。 ——沃兹基·硕德

B站上人宅的教程说得很详细,从创建插件到Protobuf源码的导入,如果严格按照他的方法做的话最终结果应该是可以用的。但是我在跟随的过程中遇到了问题:

视频里有一个把Protobuf源代码拷贝到插件代码目录里的步骤,但是从视频中的文件列表可以看出其与官方源码不完全一致。我尝试过将官方源码原封不动放进插件,结果编译无法通过;

我又暂停视频,利用视频中的文件列表删掉多余的官方源码文件,再放进插件,结果插件本身是编译通过了,但是一旦用proto文件生成C++文件并在游戏代码中引入之后,编译又会报一堆的错误。

查阅众多资料之后发现,几乎没有一个最近还在更新的教程或者代码库,基本都失去了参考价值。最终找到了这个代码。代码中作者使用引入预编译好的库文件的方式实现Protobuf的集成给了我思路。预编译的库文件可以从官方源码中编译而来,而我只需要包含完整的头文件即可。因此我做了下面的工作:

从官方源码编译所需的包含文件(include)和库文件(.lib)

官方Github仓库下载源代码。在本人写下这篇文章时,最新的Release21.7。下载时选择C++的压缩包:

下载后解压,按照官方README的指示编译和安装。本人当时使用的是CMake + VS2019的方式得到最终的包含文件和库文件:

  • include文件夹为要包含的头文件
  • lib文件夹内有编译好的.lib库文件,我只使用了libprotobuf.lib
  • bin文件夹内有转化.proto文件用的可执行程序protoc.exe

将编译结果整合进UE5插件

所以需要拷贝的东西如下(为了整洁,保持文件结构):

  • include文件夹
  • lib/libprotobuf.lib
  • bin/protoc.exe

把这三个东西放到插件目录下,我的插件名叫SimpleProto5,我放到了插件/Source/SimpleProto5/ThirdParty/probuf下:

文件到位之后,还需要修改插件的.Build.cs文件,添加头文件包含路径以及库文件查找路径:

// 头文件包含路径
PublicSystemIncludePaths.AddRange(
  new string[]
  {
    Path.Combine(ThridPartyPath, "protobuf/include")
  }
);

// 库文件包含路径
PublicAdditionalLibraries.Add(Path.Combine(ThridPartyPath, "protobuf", "lib", "Win64", "libprotobuf.lib"));

其中库文件路径的写法是临时的,因为我的目标是不只支持Windows一个平台,因此后续可以根据不同平台添加不同的库文件路径。

后续操作

你可以选择继续跟着人宅的视频把这个插件做完,但是关于Protobuf引入的过程到这里就结束了。跟着文章做的小伙伴可以编译一下项目看看,如果没有其他问题的话项目应该是可以正常编译的。

如果编译过程中出现如下错误:

inlined_string_field.h(430): [C4668] 没有将“GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE”定义为预处理器宏,用“0”替换“#if/#elif”

只需要根据错误定位到inlined_string_field.h文件的第430行,把#if改为#ifdef即可。

祝各位在UE5中与Protobuf玩的开心!