尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux下Unreal Engine深度集成Cesium插件:源码编译与引擎嵌入实战

Linux下Unreal Engine深度集成Cesium插件:源码编译与引擎嵌入实战 1. 项目概述与核心目标最近在Ubuntu 20.04.1上折腾Unreal Engine想把CesiumForUnreal这个强大的地理空间插件给集成进去结果踩了一路的坑。我的目标很明确不是简单地把插件放到某个项目里而是要把插件直接编译并嵌入到Unreal Engine引擎的源码里。这样一来我本地编译出来的任何UE项目无论是新建的还是已有的都能直接调用Cesium的功能不用再每个项目单独配置一遍插件对于需要频繁创建不同场景原型的工作流来说这才是最省事、最一劳永逸的方案。CesiumForUnreal这个插件简单说就是能把真实世界的地形、影像和3D瓦片数据流式加载到Unreal里做数字孪生、模拟仿真或者开放世界游戏简直是神器。但官方提供的预编译包主要是面向Windows平台的在Linux环境下尤其是自己从源码编译UE引擎的情况下想顺利集成这个插件就得做好跟各种编译报错“斗智斗勇”的准备。整个过程涉及到UE源码编译、插件源码编译、两者之间的模块依赖、Linux特有的库链接问题以及最终如何将插件“焊死”在引擎里。如果你也在Linux上搞UE开发或者对深度定制引擎插件感兴趣那这篇踩坑实录应该能帮你省下不少时间。2. 环境准备与前置条件梳理在开始动手之前得先把“战场”打扫干净确保所有基础依赖都到位。很多编译错误其实都源于环境配置不完整或者版本不对。2.1 系统与基础依赖确认我使用的系统是Ubuntu 20.04.1 LTS这是一个长期支持版本相对稳定。首先需要安装一系列编译UE和Cesium NativeCesium插件的底层C库所必需的开发工具和库。打开终端执行以下命令来安装基础编译工具和库sudo apt update sudo apt install -y build-essential python3 python3-pip git cmake pkg-config \ libc6-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev libxrandr-dev \ libxinerama-dev libxcursor-dev libxi-dev libssl-dev libsdl2-dev \ zlib1g-dev libbz2-dev libjpeg-dev libogg-dev libvorbis-dev \ libopenal-dev libfreetype6-dev libudev-dev libgtk-3-dev \ libasound2-dev libpulse-dev libdbus-1-dev libibus-1.0-dev \ libxkbcommon-dev libwayland-dev wayland-protocols \ libavcodec-dev libavformat-dev libavutil-dev libswscale-dev这里解释一下几个关键包的作用build-essential提供了GCC、G、make等核心编译工具cmake是Cesium Native编译所必需的libssl-dev是网络请求和加密所必需的libsdl2-dev是UE运行时输入和窗口管理需要的。确保这些包都成功安装避免后续出现“找不到头文件”或“链接库失败”的错误。2.2 Unreal Engine源码获取与编译我的目标是嵌入插件所以必须使用UE的源码版本而不是Epic Games Launcher下载的二进制版本。注册并关联GitHub账户访问Unreal Engine的GitHub页面按照Epic的指引用你的Epic Games账户关联GitHub账户以获得源码仓库的访问权限。克隆源码选择一个有足够空间至少100GB的磁盘位置克隆UE5的源码我以UE5.0为例原理相通。git clone -b 5.0 https://github.com/EpicGames/UnrealEngine.git cd UnrealEngine运行设置脚本UE提供了一个Python脚本来下载一些必要的二进制依赖项。./Setup.sh这个过程会下载大量数据请保持网络通畅。生成项目文件并编译./GenerateProjectFiles.sh makemake编译会是一个非常漫长的过程取决于你的CPU核心数和性能可能需要数小时。我建议在晚上睡觉前开始编译。编译成功后你会在Engine/Binaries/Linux/目录下找到UnrealEditor等可执行文件。注意编译UE源码对内存要求较高建议系统内存不少于32GB交换空间也设置得大一些比如20GB否则在链接阶段极有可能因为内存不足而失败报错信息通常是“internal compiler error: Killed (program cc1plus)”或者直接卡死。2.3 CesiumForUnreal插件源码获取我们不使用预编译的zip包而是直接获取插件源码以便进行深度集成。# 切换到你的工作目录比如和UnrealEngine同级 cd /path/to/your/workspace git clone --recursive https://github.com/CesiumGS/cesium-unreal.git cd cesium-unreal关键点在于--recursive参数因为Cesium-unreal仓库包含了子模块submodule主要是Cesium Native这个核心库。如果不递归克隆你会得到一个几乎空的插件框架缺少最关键的运行时逻辑代码。3. 首次编译尝试与典型报错解析拿到源码后最直接的想法可能就是按照README的指引在插件目录下尝试编译。但在Linux下直接这么干大概率会碰壁。3.1 直接编译插件的常见错误进入cesium-unreal目录你可能会想运行./Setup.sh或查看是否有现成的构建脚本。但CesiumForUnreal插件在Linux上的首要编译方式是期望通过Unreal Editor的“编译”按钮或者UnrealBuildTool (UBT) 来驱动。如果我们直接尝试用CMake或make编译插件自身的模块会遭遇第一个经典错误错误现象在终端执行任何构建命令或者直接在UE编辑器中启用插件时编辑器日志或编译输出中提示找不到CesiumRuntime和CesiumEditor模块并建议你关闭编辑器进行编译。错误根源这是因为插件虽然包含了源代码但其编译过程强烈依赖于Unreal Engine的构建系统UnrealBuildTool。插件中的.Build.cs文件如CesiumRuntime.Build.cs定义了模块的编译规则和依赖这些规则需要在一个“Unreal项目”的上下文中由UBT来解析和执行。单纯在插件目录下执行make是无效的。3.2 社区方案尝试及其局限性在Cesium官方社区如Discourse里有用户分享了一个方法当编辑器提示找不到模块并建议关闭IDE编译时关闭Unreal Editor然后返回到Unreal Engine的源码根目录执行make UE4Editor。这个命令会重新编译整个编辑器并在过程中尝试编译那些缺失的插件模块前提是插件源码放在引擎能发现的路径下比如项目或引擎的Plugins目录。我尝试了这个方法将cesium-unreal整个文件夹复制到UnrealEngine/Engine/Plugins/Marketplace/目录下Marketplace目录是引擎扫描插件的标准位置之一。在Unreal Engine源码根目录执行make UE4Editor。结果与问题编译过程确实开始了并且尝试去编译Cesium插件。但是我遇到了比之前更复杂的错误链主要集中在以下几点Cesium Native编译失败错误信息指向ThirdParty/CesiumNative下的CMake编译错误例如找不到libcurl、openssl版本不匹配或者C17标准特性不支持。头文件包含路径错误UBT报告无法找到Cesium3DTilesSelection、CesiumGeospatial等Cesium Native库的头文件。符号链接问题在打包插件后面会讲到时可能出现System.UnauthorizedAccessException提示对某个路径的访问被拒绝这通常是因为之前构建残留的文件权限问题或者是构建脚本尝试在受保护的目录创建文件。这些错误表明我们需要更系统地去解决Cesium Native这个第三方库的编译和集成问题而不是依赖一个简单的make命令。4. 核心问题拆解Cesium Native的独立编译与集成CesiumForUnreal插件本质上是一个“包装器”它的核心功能依赖于一个独立的C库——Cesium Native。因此整个集成过程的关键是先确保Cesium Native能在你的Linux环境下成功编译。4.1 编译Cesium Native进入插件源码的ThirdParty/CesiumNative目录。这里通常会有详细的编译说明README.md。对于Linux标准流程是使用CMake进行“外部构建”。cd /path/to/cesium-unreal/ThirdParty/CesiumNative mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc)可能遇到的坑及解决方案缺少依赖库CMake配置阶段报错提示找不到libcurl、openssl、sqlite3等。解决使用apt安装开发包。例如sudo apt install -y libcurl4-openssl-dev libssl-dev libsqlite3-dev如果提示其他库缺失根据错误信息类似地安装对应的-dev包。编译器版本或C标准问题错误信息可能包含-stdc17不支持或者某些C17特性无法识别。解决Ubuntu 20.04默认的GCC版本是9.3.0支持C17。确保你安装了g-9。如果默认不是g-9可以使用update-alternatives进行切换或者在CMake命令中显式指定编译器cmake .. -DCMAKE_BUILD_TYPERelease -DCMAKE_CXX_COMPILERg-9CMake版本过低Cesium Native可能要求较高版本的CMake。解决Ubuntu 20.04默认的CMake版本3.16可能不够。可以通过Kitware的APT仓库安装新版wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2/dev/null | sudo apt-key add - sudo apt-add-repository deb https://apt.kitware.com/ubuntu/ focal main sudo apt update sudo apt install cmake编译成功后在build目录下的lib或CesiumNative/lib等子目录中你应该能找到一系列.a静态库文件例如libCesium3DTilesSelection.a、libCesiumGeospatial.a等。同时头文件位于源码目录的include下。4.2 修改插件构建配置以链接本地编译的Cesium Native默认情况下CesiumForUnreal插件的构建系统通过.Build.cs文件会尝试在编译时自动下载并构建Cesium Native。但在Linux环境下这个自动过程容易失败。因此我们需要修改配置告诉插件“别自己下载编译了直接用我这边已经编译好的库。”定位关键配置文件找到cesium-unreal/Source/CesiumRuntime/CesiumRuntime.Build.cs和cesium-unreal/Source/CesiumEditor/CesiumEditor.Build.cs。这两个文件控制着各自模块的构建。修改构建逻辑我们需要注释掉或修改其中关于下载和构建Cesium Native的部分并添加对我们本地已编译库和头文件的引用。这是一个需要小心操作的过程。通常你需要找到类似AddCesiumNative这样的函数调用或相关逻辑将其替换为直接指定库路径和包含路径。由于不同版本的插件源码结构可能有差异这里提供一个概念性的修改示例。在修改前请务必备份原文件。示例修改思路在CesiumRuntime.Build.cs中// 假设我们将编译好的Cesium Native库和头文件复制到了插件目录下的一个固定位置 string CesiumNativePath Path.Combine(ModuleDirectory, ../../ThirdParty/CesiumNative); string CesiumNativeIncludePath Path.Combine(CesiumNativePath, include); string CesiumNativeLibPath Path.Combine(CesiumNativePath, build/lib); // 添加包含目录 PublicIncludePaths.Add(CesiumNativeIncludePath); // 如果你需要私有头文件可能还需要添加 // PrivateIncludePaths.Add(Path.Combine(CesiumNativeIncludePath, private)); // 添加库目录 PublicLibraryPaths.Add(CesiumNativeLibPath); // 添加需要链接的静态库名称需根据实际编译出的文件调整 PublicAdditionalLibraries.Add(Cesium3DTilesSelection); PublicAdditionalLibraries.Add(CesiumGeospatial); PublicAdditionalLibraries.Add(CesiumUtility); // ... 添加其他必要的库如 CesiumGltf, CesiumGeometry 等 // 链接系统库这些是Cesium Native所依赖的 PublicSystemLibraries.Add(curl); PublicSystemLibraries.Add(ssl); PublicSystemLibraries.Add(crypto); PublicSystemLibraries.Add(sqlite3);CesiumEditor.Build.cs通常也需要类似的修改因为它也依赖Cesium Native。重要提示直接修改.Build.cs文件是侵入性的并且可能随插件版本更新而失效。更稳健的做法是研究插件是否支持通过环境变量如CESIUM_NATIVE_DIR来指定预编译库的路径。如果官方不支持那么上述修改是必要的但要做好笔记以便在更新插件版本时重新应用。5. 将插件嵌入引擎编译与打包在解决了Cesium Native的编译和链接问题后接下来就是将修改后的插件集成到Unreal Engine中。5.1 将插件源码放置到引擎目录为了让引擎在编译时能发现并编译我们的插件需要将其放置在引擎认可的插件目录中。有两个常见位置UnrealEngine/Engine/Plugins/Marketplace/用于放置来自市场的插件。UnrealEngine/Engine/Plugins/引擎级别的插件目录。我选择放在Engine/Plugins/目录下创建一个子文件夹例如CesiumForUnreal然后将整个cesium-unreal源码包含我们修改过的.Build.cs和编译好的Cesium Native库复制进去。结构看起来像这样UnrealEngine/ ├── Engine/ │ ├── Plugins/ │ │ ├── CesiumForUnreal/ -- 我们的插件目录 │ │ │ ├── Source/ │ │ │ ├── Resources/ │ │ │ ├── ThirdParty/ │ │ │ │ └── CesiumNative/ -- 包含我们编译好的库和头文件 │ │ │ └── CesiumForUnreal.uplugin │ │ └── ... 其他插件5.2 重新编译Unreal Engine放置好插件后需要重新编译引擎让UBT处理这个新插件。cd /path/to/UnrealEngine make UE4Editor这次编译UBT会扫描Engine/Plugins/目录发现CesiumForUnreal.uplugin文件然后根据其描述和对应的.Build.cs文件来编译CesiumRuntime和CesiumEditor模块。如果之前的Cesium Native库路径配置正确并且所有系统依赖都已满足编译应该能够成功。编译过程会输出大量日志你需要密切关注其中是否有关于Cesium的错误或警告。如果出现“undefined reference to ...”之类的链接错误说明静态库没有正确链接需要回头检查PublicAdditionalLibraries是否包含了所有必需的库文件以及库文件名是否正确注意Linux下静态库通常以.a结尾链接时写库名即可如Cesium3DTilesSelection不需要写前缀lib和后缀.a。5.3 验证插件嵌入成功编译完成后启动编译好的Unreal Editorcd /path/to/UnrealEngine/Engine/Binaries/Linux ./UnrealEditor创建一个新的空白项目或打开一个已有项目。进入Edit - Plugins。在插件列表的“Built-in”或“Engine”分类下你应该能找到“Cesium for Unreal”。确保其已被启用复选框打勾。如果之前编译成功这里应该可以直接启用不需要额外操作。重启编辑器如果要求的话。重启后在内容浏览器的“添加/导入”按钮附近或者模式面板里你应该能看到Cesium相关的功能比如“Cesium”菜单项或者可以在场景中拖入“Cesium World Terrain”等Actor。这证明插件已经作为引擎的一部分成功加载。5.4 使用BuildPlugin命令打包插件可选但推荐虽然我们已经将插件源码集成到引擎并成功编译但为了更干净地分发或备份这个“自定义引擎”我们可以使用Unreal的自动化工具UAT将插件打包成一个.zip文件。这个包可以方便地复制到其他同版本引擎的Engine/Plugins/目录下。cd /path/to/UnrealEngine/Engine/Build/BatchFiles/Linux ./RunUAT.sh BuildPlugin -Plugin/path/to/UnrealEngine/Engine/Plugins/CesiumForUnreal/CesiumForUnreal.uplugin -Package/output/path/ForCesiumPlugin -CreateSubFolder -TargetPlatformsLinux命令解释-Plugin指定.uplugin文件的完整路径。-Package指定打包输出的目录。-CreateSubFolder在输出目录中为插件创建一个子文件夹。-TargetPlatformsLinux指定目标平台为Linux。可能遇到的错误权限错误 (System.UnauthorizedAccessException)如网络资料中所示这通常是因为输出目录 (/output/path) 或其父目录权限不足或者上一次打包残留了被锁定的文件。确保你对输出目录有写权限并尝试清理或指定一个全新的、空的家目录下的输出路径。依赖缺失如果打包过程报错缺少某些模块可能是插件对引擎其他模块的依赖声明不完整或者我们修改的.Build.cs文件去掉了某些必要的公共依赖。需要对照错误信息检查并补充PublicDependencyModuleNames。打包成功后你会在输出目录得到一个结构清晰的插件包。将其解压到任何一台同版本Unreal Engine的Engine/Plugins/目录下该引擎就具备了Cesium功能。6. 疑难杂症与深度排错指南在整个过程中我遇到了几个令人头疼的问题这里把排查思路和解决方案记录下来。6.1 编译时出现“undefined symbol”错误问题描述在链接阶段报错类似于undefined symbol: _ZN7Cesium...指向Cesium Native库中的某个函数或类。排查步骤确认库文件是否包含该符号使用nm -gC libCesiumXXX.a | grep [符号名]命令在编译好的静态库中查找这个符号。如果找不到说明编译Cesium Native时可能因为某些条件编译选项如-D定义将该部分代码排除了或者源码版本不匹配。检查链接顺序静态库的链接顺序很重要。如果库A依赖库B那么在链接命令中A应该放在B的前面。在.Build.cs的PublicAdditionalLibraries中确保基础库如CesiumUtility放在依赖它的库如Cesium3DTilesSelection之后。因为链接器是按顺序解析未定义符号的。检查C名称修饰 (Name Mangling)undefined symbol错误可能源于C名称修饰不匹配。确保编译Cesium Native和编译UE插件时使用的编译器版本、C标准如-stdc17完全一致。不一致的编译器甚至同一编译器的不同小版本都可能导致修饰名不同。6.2 编辑器启动崩溃或插件加载失败问题描述引擎编译成功但启动编辑器时崩溃或日志中显示Cesium插件加载失败。排查步骤查看编辑器日志日志文件通常位于~/.config/Epic/UnrealEngine/[EngineVersion]/Saved/Logs/或项目目录的Saved/Logs/下。打开最新的.log文件搜索 “Cesium”、“Fatal”、“Assertion failed”、“LoadModule” 等关键词。检查模块二进制文件确认Engine/Binaries/Linux/下是否存在CesiumRuntime.so和CesiumEditor.soLinux的动态库文件。如果不存在说明插件模块编译后没有正确安装到二进制目录。这可能是因为.uplugin文件中的LoadingPhase或模块描述有问题但更常见的是编译本身失败了只是被当成了警告。重新检查编译输出日志的最后部分。依赖的引擎模块缺失在CesiumRuntime.Build.cs中PublicDependencyModuleNames和PrivateDependencyModuleNames列出了插件依赖的其他UE模块如Core,CoreUObject,Engine,RenderCore,RHI等。如果其中某个模块在我们编译的引擎版本中不存在或编译有问题就会导致加载失败。确保你的引擎源码是完整且成功编译的。6.3 打包项目时Cesium功能丢失问题描述在编辑器中运行正常但打包Package Project后的可执行程序运行时Cesium地形或数据不显示。排查步骤检查打包日志打包过程会生成详细的日志。关注是否有关于Cesium插件或其资源的警告和错误。常见问题是插件的一些非代码资源如着色器文件、配置文件、默认资产没有被自动包含到打包中。检查插件的“烘焙”设置在.uplugin文件中有CanContainContent和EnabledByDefault等字段。更重要的是确保插件目录下的Resources、Content等文件夹及其文件被正确标记为需要打包。有时需要在插件的Build.cs中通过RuntimeDependencies或AdditionalProperties显式声明关键资源文件。检查Cesium Native库的打包我们是以静态库.a形式链接Cesium Native的。在打包时这些静态库的代码应该已经被链接进游戏的可执行文件或主要的游戏模块中。问题可能出在Cesium Native自身依赖的动态系统库如libcurl.so.4,libssl.so.1.1。打包后的程序在目标机器上运行时可能找不到这些库。解决方案是在项目设置中指定需要额外打包的第三方库或者将程序链接这些库的静态版本如果许可允许。7. 最终成果与工作流优化经过上述一系列步骤最终我们得到了一个“自带Cesium功能”的Unreal Engine。现在无论是创建空项目还是打开任何现有项目都不需要再手动复制插件、修改.uproject文件来启用插件。Cesium的功能就像引擎内置的“地形系统”、“水体系统”一样开箱即用。工作流优化建议创建引擎版本快照在成功编译并嵌入插件后将整个UnrealEngine目录进行备份或打包。可以将其视为一个自定义的引擎版本例如UnrealEngine-5.0-Cesium-Linux。以后新建项目时在启动器或命令行中指定使用这个自定义引擎即可。使用符号链接管理插件如果你需要频繁更新插件源码进行测试可以将插件源码放在独立的位置如~/Dev/cesium-unreal然后在引擎的Engine/Plugins/CesiumForUnreal位置创建一个指向它的符号链接ln -s。这样修改插件源码后只需重新编译引擎make UE4Editor即可生效无需来回拷贝。编写自动化脚本将环境检查、依赖安装、Cesium Native编译、修改.Build.cs、引擎编译等步骤编写成一个Shell脚本。下次在新环境部署时可以大大减少手动操作和出错概率。脚本中应包含关键步骤的检查点例如在编译Cesium Native后验证库文件是否生成。这个过程虽然曲折但彻底解决了插件管理的问题特别适合团队协作或需要维护多个UE项目的场景。一旦引擎层集成完毕项目开发人员就完全无需关心插件的存在可以专注于使用Cesium提供的强大地理空间能力来构建内容。这种深度集成的方式也让我们对Unreal Engine的插件系统和构建流程有了更深刻的理解以后再遇到其他复杂的第三方插件集成思路也会清晰很多。
返回列表