[UE4]如何编译部署独⽴专⽤服务端
(StandaloneDedicatedServer)
这是论坛上对UE服务端功能的回答,意思是UE4提供了⽹游服务端所具备的特性,包括位移修正、物理碰撞检测。这些特性不是UE4才加⼊,早期UE版本就有了。
UE4⾃带的同步机制Reliable
这种⾃带的同步机制(也就是说常说的UFUNCTION(Server, Reliable, WithValidation))的⽹络通信数据量很⼤,有点类似moba类游戏的帧同步,适合开房间类型的多⼈联机游戏,但适不适合MMO类的⼤规模⽹络通信,我没测试过,也没看到官⽅的确切解释,可能看实际项⽬的同步需求,如果你的服务端不需要物理检测,那么承载肯定可以提升很多。
从v4.4版本开始数个版本,shipping模式关掉了⽹络同步,据说这只是⼀个bug,并不是epic有意为之。
如果是要写MMO等通信性能较⾼的服务端,建议将ACE、libuv、RakNet等⾼性能⽹络库加⼊UE4的C++⼯程,绕开UE4⾃⾝的tcp socket API。
===============================================
2016-11-20记:感谢⽹友“”的回答,当前版本的UE4已经可以在shipping模式下打开replication同步机制。⼀年前的UE4版本确实是在shipping模式下关闭了replication。
===============================================
如何编译构建独⽴专⽤服务端
下⾯步骤假设是以development模式来构建,步骤和shipping模式没差异。
下⾯步骤中假设我们⾃⼰的UE4⼯程名叫:MyProject
1,下载源码及编译
需要现在unrealengine官⽹上注册并加⼊github开发组才有权限看到上⾯的地址。
打开页⾯后下载⼀个最新的release版本,解压出来后先运⾏Setup.bat,会⾃动下载资源⽂件,⼤概有⼏个G,下载完以后,然后再运⾏GenerateProjectFiles.bat,会⽣成VS⼯程⽂件,这⾥假设你已经安装好了VS,我⽤的vs2015旗舰版,⽣成完以后打开VS,build类型选择debuggame editor或者development editor,并编译。
2,切换⼯程的UE4版本
右键点击你的UE4⼯程⽂件MyProject.uproject -》 Switch Unreal Engine version,选择刚刚编译出来的UE4,切换版本以后,再右击*.uproject并选择:Generate Visual Studio project files,最后启动VS,启动VS之后再选择⼀种build类型来编译⼯程并启动,这⾥测试⽤的是development editor类型。
3,cook client content
上⾯第⼆步编译并启动运⾏⼯程后,这⼀步来打包客户端(官⽅⽂档上叫cook client content),⽅法和正常客户端版本打包的步骤⼀样:Package Project -》 Windows -》 Windows x64。
有⼈可能会问,安装版本的UE4为什么有没PS4、Xbox等打包选项?是的,只有源码编译的UE4才有这些选项。
这⾥我们假设打包时选择的输出⽬录为:D:/PackageTest/,那么输出的客户端exe⽂件就在
D:/PackageTest/WindowsNoEditor/MyProject/Binariesk/
这个⽬录位置会在后⾯步骤中⽤到。
如果不cook client content,则后⾯启动服务端时会报错:
Error: The global shader cache file 'F:/EpicGames/UnrealEngine/Engine/GlobalShaderCache-PCD3D_SM5.bin' is missing.
还有⼀个纯蓝图UE4⼯程的构建bug问题:
这个问题v4.7版本时还存在,当前最新版本不知道解决没有。
问题现象是:如果⽤VS构建之前不添加⼀个⾃定义的C++代码,那么构建出来的版本会有问题。
解决办法:在VS构建server版本之前,在UE4 Editor中添加⼀个C++代码,这个代码随意,只要是C++代码就⾏(⽐如添加⼀个⾃定义HUD 的class),内容默认,不需要编辑。
添加C++⽅法是:File -》 Add Code to Project。
由于我这⾥演⽰的是C++⼯程,所以不需要添加再添加C++ class。
打包之前记得GameMode和Map是否设置正确了,如果不使⽤默认的话。
4,添加Server.target.cs配置⽂件
这⼀步是关键步骤。
从官⽹教学项⽬ShooterGame中拷贝⼀个⽂件:\Epic Games\Launcher\VaultCache\ShooterGame_‘版本
号’\data\Source\ShooterGameServer.Target.cs
没有安装的话拷贝下⾯代码新建⼀个⽂本⽂件,并命名为MyProjectServer.Target.cs。位置放在\MyProject\Source\⽬录下(与其他Target.cs ⽂件同⼀⽬录)。
1// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
2
3using UnrealBuildTool;
4using System.Collections.Generic;
5
6public class ShooterGameServerTarget : TargetRules
7 {
8public ShooterGameServerTarget(TargetInfo Target)
9    {
10        Type = TargetType.Server;
11        bUsesSteam = true;
12    }
13
14//
15// TargetRules interface.
16//
17
18public override bool GetSupportedPlatforms(ref List<UnrealTargetPlatform> OutPlatforms)
19    {
20// It is valid for only server platforms
21return UnrealBuildTool.UnrealBuildTool.GetAllServerPlatforms(ref OutPlatforms, false);
22    }
23
24public override void SetupBinaries(
25        TargetInfo Target,
26ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,
27ref List<string> OutExtraModuleNames
28        )
29    {
30        OutExtraModuleNames.Add("ShooterGame");
31    }
32public override List<UnrealTargetPlatform> GUBP_GetPlatforms_MonolithicOnly(UnrealTargetPlatform HostPlatform)
33    {
34        List<UnrealTargetPlatform> Platforms = null;
35
36switch (HostPlatform)
37        {
38case UnrealTargetPlatform.Linux:
39                Platforms = new List<UnrealTargetPlatform> { HostPlatform };
40break;
41
42case UnrealTargetPlatform.Win64:
43                Platforms = new List<UnrealTargetPlatform> { HostPlatform, UnrealTargetPlatform.Linux };
44break;
45
46default:
47                Platforms = new List<UnrealTargetPlatform>();
48break;
49        }
50
51return Platforms;
52    }
53
54public override List<UnrealTargetConfiguration> GUBP_GetConfigs_MonolithicOnly(UnrealTargetPlatform HostPlatform, UnrealTargetPlatform Platform)
55    {
56return new List<UnrealTargetConfiguration> { UnrealTargetConfiguration.Test };
57    }
58public override List<GUBPFormalBuild> GUBP_GetConfigsForFormalBuilds_MonolithicOnly(UnrealTargetPlatform HostPlatform)
59    {
60return new List<GUBPFormalBuild>();
61    }
62 }
View Code
在此基础上需要修改的地⽅三个地⽅:
1,类名修改MyProjectServerTarget ;
2,构造⽅法修改MyProjectServerTarget;
3,OutExtraModuleNames.Add("ShooterGame");修改为OutExtraModuleNames.Add("MyProject");
5,构建Server版本
⾸先,关掉VS,然后右击⼯程⽂件*.uproject-》Generate Visual Studio project files,之所以要重新⽣成VS⼯程⽂件,是因为要确保上⼀步添加的Target.cs⽂件能够在编译中⽣效。
打开VS后,选择build类型Development Server,然后构建。
构建之前,检查下Server端的Map和GameMode是否设置了,默认是空的,这样编出的服务端,客户端进来时是⼀⽚漆⿊。。。(但是客户端确实登陆成功)
构建完毕以后,输出的⽂件位置在:/MyProject/Binaries/。
然后拷贝这个⽂件到上⾯第3步中提到的⽬录位置:D:/PackageTest/WindowsNoEditor/MyProject/Binariesk/Win64/⽬录下。
此时,该⽬录就会同时存在两个exe⽂件:和。
如果不和放在⼀起,则启动server时会报错(下⾯只是其众多错误信息中的⼀条):
default Property warning and errors:
Error: CDO Constructor (WidgetComponent): Failed to find /Engine/EngineMaterials/Widget3DPassThrough_Translucent
6,启动Server
到此为⽌,已经从构建UE4服务端这个深坑中爬出来了。。。
命令⾏启动: -logeditor版本
执⾏后会看到弹出⼀个新的CMD窗⼝,并看到相关打印信息。
如果不带-log参数,则不会显⽰命令⾏窗⼝,只有⼀个后台进程。
7,client连接server
这⼀步很简单,启动客户端游戏后(双击打包⽣成的或者从UE4 Editor中启动游戏均可),按~键,输⼊:open
127.0.0.1:7777,即可连接上服务端,7777是端⼝号。如果是shipping模式,是没有这种命令⾏的,连接服务端需要⼿动写相关的逻辑代码。
这样UFUNCTION(Server, Reliable, WithValidation)函数就可以与客户端独实现同步了。
注意的是:按~键打开游戏的命令⾏只对development和debug模式有效,shipping模式⽆效,另外shipping下也会关闭⾃带的同步机制(开头提到的)。
其他参考:
Client-Server Model
官⽅⽂档v4.4.3:Dedicated Server Guide (Windows & Linux)(必读)
Networking and Multiplayer
Build Standalone Dedicated Server - Unreal Engine 4.7.2(推荐)
Unreal Engine 4 - Setting up a dedicated server on Windows x64 platform
Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt1 UE4
Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt2 UE4
11111111