UE4/UE5 发布LinuxServer
2023-01-11 更新了UE5.1源码编译以及打包 LinuxServer的内容
:::tip 情景内容
- 需要开发专用服务器
- 需要将Server发到云端Linux系统主机
- 需要关闭SSH,服务一直启用
- 需要使用UE4
:::
:::danger UE5.1补充内容
- 准备UE5.1 源码
- 准备VS2022
- 准备Linux交叉编译器-v20版本
:::
1. Visual Studio 2019
1.1 下载 Visual Studio
:::warning
- UE4编译源码可以使用VS2022,但就此博客发布时间,需要修改配置文件才能正常编译,而2017版本太老了;
- 后续的C++编写在选用Rider For Unreal和Epic商城的二进制版本UE4;
- 项目写完后,用源码版UE4打包发布;
- UE5的试过了,很麻烦,问题很多,想想自己是写代码,何必执着于UE5,于是就释然了
- 电脑安装源码引擎的硬盘空间至少要有200GB
- 内存至少16GB,最好去网上查下扩展虚拟内存,自动托管到其他磁盘空间较大的磁盘,最好是固态硬盘
- 编译源码引擎时,确保关闭无关电脑后台,除非报错,否则不操作电脑做其他事,防止虚拟内存不足
:::
- 微软只在Visual Stuido主页提供最新版本下载,需要单独去下载 Visual Studio 2019
- 下载社区版的就可以了
:::danger VS2022
UE5.1版本及以后的新版本源码要以VS2022来编译,如果使用VS2019
当你运行GenerateProjectFiles.bat时,虽然不会报错,但会提示VS2019不能生成 .NET 6的项目文件,后续在VS2019里面编译源码可能会有warning,也可能会影响到Window打包
如果已经安装VS2019,只需要去Visual Studio Installer里安装一个VS2022即可,具体配置往下继续
:::
1.2 配置 Visual Studio
- 安装完成后,会进入Visual Studio Installer
- 在已安装内可以看见Visual Studio 2019的安装程序
- 点击修改
- 在工作负荷内找到游戏,勾选使用C++的游戏开发
- 此时在右边的安装详细信息内的使用C++的游戏开发的可选项内确保勾选:
- C++分析工具
- C++ AddressSanitizer
- 最新的Window 10 SDK
- IntelliCode
- Unreal Engine 安装程序
-
单个组件内:
- 默认勾选的C# 和 Visual Basic Roslyn 编译器
- 搜索勾选MSBuild
- 最后检查一下是否勾选了最新的Net Framework SDK,该博客勾选的是Net Framework 4.8 SDK
- 下载安装,安装位置可自定义
:::warning
安装时出现共享组件、工具和SDK的路径不能修改,是因为此前可能已经安装过Visual Studio,需要修改注册表解决问题
解决步骤:
- win + r
- regedit
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\Setup删除SharedInstallationPath
- 重启Visual Studio Installer
:::
:::danger
UE5需要选的东西会更多,但默认先选择和UE4一样的使用C++的游戏开发
这里注意一个细节:进入你的Windows设置 -> 系统 -> Window规格内查看你的操作系统版本
我的是Win11系统,版本号是22621.963
前面UE4里面的WindowsSDK的选项应该改选为Windows11 SDK 22621,找不到对应版本号的也没关系,VS2022会默认选好的Windows11 SDK 20000,这个也能用
至于其他的选项,等正式编译源码的时候,VS2022会提示你还需要安装哪些
:::
1.3 修改解决方案样式
:::tip 可选步骤
- 菜单栏内找到工具
- 工具->自定义->命令->工具栏->标准->解决方案配置->修改所选内容
- 更改宽度:例如200
- 若要在生成项目时显示输出窗口,请在选项对话框->项目和解决方案>常规页上,选择在生成开始时显示输出窗口
:::
:::danger
以上VS2022里也适用
:::
1.4 管理员模式启动
:::tip 可能重要
- 在VS安装目录内:\Common7\IDE\devenv.exe
- 右键->兼容性疑难解答->疑难解答程序->勾选改程序需要附加权限->测试后下一步->保存设置
:::
:::danger
以上VS2022里也适用
:::
2. 交叉编译器
:::danger
下载交叉编译器,千万别去官方中文的虚幻文档,里面给的交叉编译工具链接版本是错的,应该默认进入官方英文的文档网站内下载
博客使用的是UE4.27.2,下载文档内提供的链接,并确保是-v19
的版本,如果不是就进错网站了,正确的网站:UE4.27.2 交叉编译
:::
:::danger
UE5.1要用的是**-v20版本,注意先卸载前面的-V19**
网址:UE5.1交叉编译
:::
2.1 安装交叉编译
直接默认安装即可,也可以选择安装路径
cmd验证:%LINUX_MULTIARCH_ROOT%x86_64-unknown-linux-gnu\bin\clang++ -v
无效需手动配置环境变量
2.2 配置环境变量
- 进入系统环境变量
- 添加:
LINUX_MULTIARCH_ROOT
- 路径:
安装目录\v19_clang-11.0.1-centos7\x86_64-unknown-linux-gnu\bin
-
-v20:
安装目录\v20_clang-13.0.1-centos7\x86_64-unknown-linux-gnu\bin
:::warning
交叉编译器安装和配置完成后,需要重启电脑
:::
3. 源码UnrealEngine
:::tip 省略步骤
github账号
加入Epic组织
选择UE4.27.2 Release下载
:::
3.1 配置Setup.bat
Setup.bat配置表:
Usage:
GitDependencies [options]
Options:
--all Sync all folders
--include=<X> Include binaries in folders called <X>
--exclude=<X> Exclude binaries in folders called <X>
--prompt Prompt before overwriting modified files
--force Always overwrite modified files
--root=<PATH> Set the repository directory to be sync
--threads=<N> Use N threads when downloading new files
--dry-run Print a list of outdated files and exit
--max-retries Override maximum number of retries per file
--proxy=<user:password@url> Sets the HTTP proxy address and credentials
--cache=<PATH> Specifies a custom path for the download cache
--cache-size-multiplier=<N> Cache size as multiplier of current download
--cache-days=<N> Number of days to keep entries in the cache
--no-cache Disable caching of downloaded files
Detected settings:
Excluded folders: Mac, Android, Linux
Proxy server: none
Download cache: disabled
Default arguments can be set through the UE4_GITDEPS_ARGS environment variable.
Installing prerequisites...
该博客的配置:(截取的一段,只有**set PROMPT_ARGUMENT=**需要修改)
set PROMPT_ARGUMENT=
for %%P in (%*) do if /I "%%P" == "--prompt" goto no_prompt_argument
for %%P in (%*) do if /I "%%P" == "--force" goto no_prompt_argument
set PROMPT_ARGUMENT=--prompt --threads=20 --cache=E:\UrealEngineSource\UE4.27.2\Cache
:no_prompt_argument
--threads=20 # 加快下载速度,不宜过高
--cache # 将下载的源码文件单独保存到指定位置,方便传给其他人和玩坏了,不用全删了重新下载了
--exclude # 排除不想要的模块
–exclude可选参数:
平台参数:Win32, Win64, osx32,osx64, Linux, Android, IOS, HTML5
VS版本参数:VS2012,VS2013,VS2015
尽量别排除VS版本的参数,平台参数可以排除不要的,该博客默认不加入 --exclude,全要了
:::danger
以上UE5.1也适用,但要注意 --cache=
的路径
尽量别用--exclude
:::
3.2 生成UE4.sln文件
上面配置好Setup.bat文件后:
- 双击运行Setup.bat
- 双击运行GenerateProjectFiles.bat
:::danger
以上UE5.1也适用
:::
3.3 编译源码编辑器
:::warning
- 先编译源码 编辑器
- 网上有的教程说的很乱,这里就编译Development Editor即可
- 注意:
- 如果是先完成过了源码引擎的编译,后下载交叉编译,需要按照博客[2. 交叉编译器](#2. 交叉编译器)的内容完成检查步骤
- 再进行博客3.2 生成UE4.sln文件的步骤,再接着往下继续看,并完成下面的全部步骤
:::
双击UE4.sin文件,根据上面的VS2019配置,此时默认管理员模式
在解决方案中依次选择:
- Development Editor
- Win64
- 选中侧边栏的UE4,右键->设为启动项
- 右键UE4选择生成,注意:不希望看见Warning和Error,如果有请深入排查问题,然后右键UE4选择重新生成
上面的步骤完成后,不关闭VS2019,建议进行下一步:
- 依次再重新生成:
AutomationTool、UnrealBuildTool、UnrealFrontend
- 如果全部没Warning和Error,就算编译完成了
:::danger
这里补充一个细节:BuildConfiguration.xml
源码引擎安装目录\UE5.1\Engine\Saved\UnrealBuildTool
C:\Users\用户名\AppData\Roaming\Unreal Engine\UnrealBuildTool
两处都有改:后续可以加快UE5的编译速度可能吧,应该,或许,大概,Maybe
我这里提供我自己用的:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<ParallelExecutor>
<ProcessorCountMultiplier>2</ProcessorCountMultiplier>
<MaxProcessorCount>16</MaxProcessorCount>
<bStopCompilationAfterErrors>true</bStopCompilationAfterErrors>
</ParallelExecutor>
</Configuration>
具体用法可以去上网查BuildConfiguration.xml
还可以安装一个UnrealVS插件,说是可以快速编译:可能吧,应该,或许,大概,Maybe
插件所在的目录:E:\UrealEngineSource\UE5.1\Engine\Extras\UnrealVS
里面有两个选项:VS2019和VS2022,具体看你选择
直接双击安装就可以,后面解决方案里找到UE5,右键就可以看到UnrealVS Quick Build
:::
3.4 创建快捷方式
网上有的教程真的傻,非得打开UE4.sln在VS2019里面启动源码虚幻引擎
其实可以进如源码引擎目录:\Engine\Binaries\Win64
找到UE4Editor.exe
直接双击启动,或者创建快捷方式,放到方便使用的地方启动,和正常的Epic商城引擎没什么两样
:::warning
源码引擎编译完成后,先打开引擎看看打包功能是否出现⚠️标志
如果有,大概率是VS2019和交叉编译器没有配置好,缺失SDK,需要重新生成
如果没有,再往后继续看
:::
:::danger
以上UE5.1也适用
:::
4. 打包测试项目
:::danger
以下UE4 / UE5.1也适用,可能吧,应该,或许,大概,Maybe
注意几个可能出现的细节:往往到了这一步,打包LinuxServer不会有什么问题了,但你会发现打包Windows或者WindowsClient并没有打包出来
单独打包Windows或者WindowsClient,会看到类似一下的报错信息:
UATHelper: Packaging (Windows): ERROR: Game target not found. Game target is required with -cook or -cookonthefly
这种错误一般发生在C++项目,解决方法是:StackOverflow
-
复制
项目名.Target.cs
-
粘贴并重命名
项目名Game.Target.cs
-
修改内容参考如下:
using UnrealBuildTool; using System.Collections.Generic; public class 项目名GameTarget : TargetRules // 类名改一下 { public 项目名GameTarget(TargetInfo Target) : base(Target) // 这里也改一下 { Type = TargetType.Game; // 这里好像默认就是 Game,不用改了 DefaultBuildSettings = BuildSettingsVersion.V2; ExtraModuleNames.AddRange( new string[] { "项目名" } ); } }
-
删除项目内的
Binaries
,DerivedDataCache
,Intermediate
-
右键
项目名.uproject
,Generate Visual Studio Project Files
-
打开
项目名.sln
,编译项目 -
重新打开项目,再次尝试打包Window
:::
4.1 创建测试项目
- 打开UE4,是不是源码引擎无所谓,真的
- 新建一个C++、第三人称、无初学者内容包、无光追的项目Test
4.2 修改测试项目
- 进入ThirdPersonBP找到Map
- 依次创建两个新Level:Map_Translation用来服务器过渡用,Map_Start这是游戏客户端默认打开的地图,已经存在的模板地图是客户端玩家进入的服务器地图
- 同时创建一个User Widget,随便给个按钮,实现按钮点击事件,Open Level,Level Name参数是:
你的云服务器公网IP:7777
,后面会说云主机的配置,也可以直接跳到博客5. 云主机防火墙配置,先拿到公网IP - 打开Map_Start,打开关卡蓝图
- 在Begin Play实现:
Create Widget
,Add To Viewport
,GetPlayerController->SetShowMouse->ture
4.3 设置测试项目
- 打开项目设置:
- 全局GameMode可以设为none,默认不设也许,完全不影响测试结果
- 编辑器初始地图:无所谓
- 游戏默认地图:Map_Start
- 过渡地图:Map_Translation
- 服务器地图:第三人称的模板默认地图
- 在项目设置,打包中搜索list of maps to include in a packaged build:
- 添加进上面的三个地图
4.4 修改 build.cs
:::warning
注意:测试项目创建用的是不是源码引擎不重要,后面的[4.5 配置打包程序](#4.5 配置打包程序)要用源码引擎打开,具体后面会写
接下来会编译至少两次项目C++源码,目的不是打包,而是测试打包环境是否正常,如果不需要测试,可以直接进入打包环节
假设最终打包结果为:一个Linux Server,一个Windows Client
需要先打开项目文件的**.sln**,解决方案依次是分别编译一下两种配置:
Linux Server包:Development Server,Linux
Windows Client包:Development,Win64,如果Windows Client想打包成发行版,就选择Shipping,Win64,该博客选择Development
如果报错,例如:
- 交叉编译比需求的版本老了,那就是交叉编译器装错了,顺便查查系统环境变量,再照着博客3.2 生成UE4.sln文件重来
- 缺失对应平台的SDK,去博客的[1.2 配置 Visual Studio](#1.2 配置 Visual Studio)重来
- 其他的自行上网查询
:::
上面的是警告,需要注意看需求,选择合适解决方案的配置,接下来是打包LinuxServer前的准备工作
首先还算要打开项目目录下的**.sln**文件:
-
找到项目目录中的
项目名Editor.Target.cs
文件 -
直接复制这个文件,在同级目录下,再重命名为:
项目名Server.Target.cs
,打开 -
修改内容为:(博客的配置)
using UnrealBuildTool; using System.Collections.Generic; public class 项目名ServerTarget : TargetRules // 类名改一下 { public 项目名ServerTarget(TargetInfo Target) : base(Target) // 这里也改一下 { Type = TargetType.Server; // 这里的Editor 改为 Server DefaultBuildSettings = BuildSettingsVersion.V2; ExtraModuleNames.AddRange( new string[] { "项目名" } ); } }
-
分别是
public class Test01ServerTarget
,public Test01ServerTarget(TargetInfo Target)
,Type = TargetType.Server
修改完成后:
- 删除项目内的
Binaries
,DerivedDataCache
,Intermediate
- 右键
项目名.uproject
,Generate Visual Studio Project Files
- 打开
项目名.sln
,编译项目 - 尝试继续打包LinuxServer
4.5 配置打包程序
首先找到项目目录下的**.uproject文件,右键Select Unreal Engine Version**,选择Soucre build开头的UE4源码引擎
生成一段时间后,双击**.uproject**文件打开源码引擎
配置打包程序:(目的是一次性同时打包出 LinuxServer和windowsClient两个包)
- 在引擎主界面的顶部菜单栏中找到窗口->项目启动程序
- 添加自定义启动描述文件
- 在烘培中选择常规,勾选LinuxServer,WindowsNoEditor(也可以是WindowsClient)
- 烘培语言:随意,一般默认选en
- 包:选择本地打包存储,修改自己的本地目录路径
-
部署:选择不部署 (注意:很重要,不然后面打包会卡在
Launching UAT
) - 返回
点击启动此描述文件,就可以打包了
:::danger
UE5这里好像没有WindowsNoEditor,选Windows或者WindowsClient
如果有问题,可以看[4.1 创建测试项目](#4.1 创建测试项目)上面的danger
提示
:::
5. 云主机/ECS
5.1 云服务配置
:::tip 云主机/ECS/轻量应用服务器
随便哪家的云服务都行,系统最好安装Centos7,root密码随你,重要的是防火墙的配置:
- 添加TCP,端口:7777
- 添加UDP,端口:7777
:::
5.2 上传和运行Server
:::warning
博客省略了将文件上传到远端服务器的过程,反正把LinuxServer包压缩**.zip**格式比较简单操作,容易理解
上传的路径最好是普通用户,好像不允许root用户执行,下面会介绍新建一个普通用户unreal,将压缩包上传到unreal家目录
,也就是unreal@hostname ~
:::
-
先创建一个普通用户
useradd unreal passwd unreal // 输入两次相同的秘密 cd /home/unreal
-
把压缩文件上传的当前目录
-
安装解压程序
yum install unzip
-
解压压缩包
unzip 压缩包
-
通过root设置执行权限
chmod +x 项目名称Server.sh
-
切换到普通用户unreal
su unreal
-
执行
./项目名称Server.sh -log
-
在本地端,打开WindowsNoEditor包的程序进行测试
注意:在Windows本地段关闭远程连接云服务的SSH,正在运行的Server服务会停止
解决方案:nohup,screen
博客采用最简单的nohup:文章来源:https://www.toymoban.com/news/detail-727172.html
nohup ./项目名称Server.sh -log &
如果想终止这个服务:文章来源地址https://www.toymoban.com/news/detail-727172.html
su root
ps aux
// 找到 ./项目名称Server.sh -log 这个命令的进程,记住它的pid
kill pid
:::
-
先创建一个普通用户
useradd unreal passwd unreal // 输入两次相同的秘密 cd /home/unreal
-
把压缩文件上传的当前目录
-
安装解压程序
yum install unzip
-
解压压缩包
unzip 压缩包
-
通过root设置执行权限
chmod +x 项目名称Server.sh
-
切换到普通用户unreal
su unreal
-
执行
./项目名称Server.sh -log
-
在本地端,打开WindowsNoEditor包的程序进行测试
注意:在Windows本地段关闭远程连接云服务的SSH,正在运行的Server服务会停止
解决方案:nohup,screen
博客采用最简单的nohup:
nohup ./项目名称Server.sh -log &
如果想终止这个服务:
su root
ps aux
// 找到 ./项目名称Server.sh -log 这个命令的进程,记住它的pid
kill pid
到了这里,关于UE4_UE5源码编译及发布LinuxServer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!