• 如何创建独立的UE4服务端


    原文作者:@玄冬Wong

    转载请注明原文出处:http://aigo.iteye.com/blog/2268777

    这是论坛上对UE服务端功能的回答,意思是UE4提供了主流MMO网游服务端所具备的特性,包括位移修正、物理碰撞检测。这些特性不是UE4才加入,早期UE版本就有了。

    https://answers.unrealengine.com/questions/14311/what-online-multiplayer-features-are-available-and.html

    UE4自带的同步机制Reliable

    听了上面所说的,是不是感觉UE4牛逼轰轰呢,但是,然并卵。。shipping模式下构建出来的服务端关闭掉自带的同步机制,UE4服务端自带的同步机制只在development和debug模式才默认开启。另外这种自带的同步机制(也就是说常说的UFUNCTION(Server, Reliable, WithValidation))的网络通信性能很低,不适合生产环境,只是适合测试用。这也是为什么在Shipping模式下被关闭的原因(从v4.4版本开始,shipping模式关掉了server mode)。如果是要写MMO等通信性能较高的服务端,建议将ACE、libuv、RakNet等高性能网络库加入UE4的C++工程,绕开UE4自身的tcp socket API。

    如何编译构建独立专用服务端

    下面步骤假设是以development模式来构建,步骤和shipping模式没差异。

    下面步骤中假设我们自己的UE4工程名叫:MyProject

    1,下载源码及编译

    https://github.com/EpicGames/UnrealEngine/tags

    需要现在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/Win64/MyProject.exe

    这个目录位置会在后面步骤中用到。

    如果不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 GamesLauncherVaultCacheShooterGame_‘版本号’dataSourceShooterGameServer.Target.cs

    没有安装的话拷贝下面代码新建一个文本文件,并命名为MyProjectServer.Target.cs。位置放在MyProjectSource目录下(与其他Target.cs文件同一目录)。

    Cpp代码  收藏代码
    1. // Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.  
    2.   
    3. using UnrealBuildTool;  
    4. using System.Collections.Generic;  
    5.   
    6. public class ShooterGameServerTarget : TargetRules  
    7. {  
    8.     public ShooterGameServerTarget(TargetInfo Target)  
    9.     {  
    10.         Type = TargetType.Server;  
    11.         bUsesSteam = true;  
    12.     }  
    13.   
    14.     //  
    15.     // TargetRules interface.  
    16.     //  
    17.   
    18.     public override bool GetSupportedPlatforms(ref List<UnrealTargetPlatform> OutPlatforms)  
    19.     {  
    20.         // It is valid for only server platforms  
    21.         return UnrealBuildTool.UnrealBuildTool.GetAllServerPlatforms(ref OutPlatforms, false);  
    22.     }  
    23.   
    24.     public override void SetupBinaries(  
    25.         TargetInfo Target,  
    26.         ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,  
    27.         ref List<string> OutExtraModuleNames  
    28.         )  
    29.     {  
    30.         OutExtraModuleNames.Add("ShooterGame");  
    31.     }  
    32.     public override List<UnrealTargetPlatform> GUBP_GetPlatforms_MonolithicOnly(UnrealTargetPlatform HostPlatform)  
    33.     {  
    34.         List<UnrealTargetPlatform> Platforms = null;  
    35.   
    36.         switch (HostPlatform)  
    37.         {  
    38.             case UnrealTargetPlatform.Linux:  
    39.                 Platforms = new List<UnrealTargetPlatform> { HostPlatform };  
    40.                 break;  
    41.   
    42.             case UnrealTargetPlatform.Win64:  
    43.                 Platforms = new List<UnrealTargetPlatform> { HostPlatform, UnrealTargetPlatform.Linux };  
    44.                 break;  
    45.   
    46.             default:  
    47.                 Platforms = new List<UnrealTargetPlatform>();  
    48.                 break;  
    49.         }  
    50.   
    51.         return Platforms;  
    52.     }  
    53.   
    54.     public override List<UnrealTargetConfiguration> GUBP_GetConfigs_MonolithicOnly(UnrealTargetPlatform HostPlatform, UnrealTargetPlatform Platform)  
    55.     {  
    56.         return new List<UnrealTargetConfiguration> { UnrealTargetConfiguration.Test };  
    57.     }  
    58.     public override List<GUBPFormalBuild> GUBP_GetConfigsForFormalBuilds_MonolithicOnly(UnrealTargetPlatform HostPlatform)  
    59.     {  
    60.         return new List<GUBPFormalBuild>();  
    61.     }  
    62. }  

     在此基础上需要修改的地方三个地方:

    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.exe文件位置在:/MyProject/Binaries/Win64/MyProjectServer.exe

    然后拷贝这个MyProjectServer.exe文件到上面第3步中提到的目录位置:D:/PackageTest/WindowsNoEditor/MyProject/Binariesk/Win64/目录下。

    此时,该目录就会同时存在两个exe文件:MyProject.exe和MyProjectServer.exe。

    如果MyProjectServer.exe不和MyProject.exe放在一起,则启动server时会报错(下面只是其众多错误信息中的一条):

    default Property warning and errors:

    Error: CDO Constructor (WidgetComponent): Failed to find /Engine/EngineMaterials/Widget3DPassThrough_Translucent

    6,启动Server

    到此为止,已经从构建UE4服务端这个深坑中爬出来了。。。

    命令行启动:MyProjectServer.exe -log

    执行后会看到弹出一个新的CMD窗口,并看到相关打印信息。


     
     

    如果是shipping模式编译的server,启动时看不到任何信息,也没有新打开的CMD,但是此时可以在进程列表中看到这个进程。

    7,client连接server

    这一步很简单,启动客户端游戏后(双击打包生成的MyProject.exe或者从UE4 Editor中启动游戏均可),按~键,输入:open 127.0.0.1:7777,即可连接上服务端,7777是端口号。

    这样UFUNCTION(Server, Reliable, WithValidation)函数就可以与客户端独实现同步了。

    注意的是:按~键打开游戏的命令行只对development和debug模式有效,shipping模式无效,另外shipping下也会关闭自带的同步机制(开头提到的)。

    其他参考:

    Client-Server Model

    https://docs.unrealengine.com/latest/INT/Gameplay/Networking/Server/

    官方文档v4.4.3:Dedicated Server Guide (Windows & Linux)(必读)

    https://wiki.unrealengine.com/Dedicated_Server_Guide_(Windows_%26_Linux)

    Networking and Multiplayer

    https://docs.unrealengine.com/latest/INT/Gameplay/Networking/index.html

    Build Standalone Dedicated Server - Unreal Engine 4.7.2(推荐)

    https://www.youtube.com/watch?v=3j72KCPUdog

    Unreal Engine 4 - Setting up a dedicated server on Windows x64 platform 

    https://www.youtube.com/watch?v=zSA8zUo8oCg

    Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt1 UE4

    https://www.youtube.com/watch?v=BvurHyjI_sY

    Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt2 UE4

    https://www.youtube.com/watch?v=c2Ao4esX4UY

  • 相关阅读:
    谷歌浏览器禁用缓存
    web项目中各种路径的获取
    visual studio 2015常用快捷键
    Jquery实际应用,判断radio,selelct,checkbox是否选中及选中的值
    JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度
    OAuth学习总结
    今日技术碎片
    碎片化的一天
    软件架构简史
    竞态条件概念
  • 原文地址:https://www.cnblogs.com/blueroses/p/5794515.html
Copyright © 2020-2023  润新知