原文作者:@玄冬Wong
轉載請註明原文出處:http://aigo.iteye.com/blog/2268777
這是論壇上對UE服務端功能的回答,意思是UE4提供了主流MMO網遊服務端所具備的特性,包括位移修正、物理碰撞檢測。這些特性不是UE4才加入,早期UE版本就有了。
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 Games\Launcher\VaultCache\ShooterGame_‘版本號’\data\Source\ShooterGameServer.Target.cs
沒有安裝的話拷貝下面代碼新建一個文本文件,並命名爲MyProjectServer.Target.cs。位置放在\MyProject\Source\目錄下(與其他Target.cs文件同一目錄)。
- // Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
- using UnrealBuildTool;
- using System.Collections.Generic;
- public class ShooterGameServerTarget : TargetRules
- {
- public ShooterGameServerTarget(TargetInfo Target)
- {
- Type = TargetType.Server;
- bUsesSteam = true;
- }
- //
- // TargetRules interface.
- //
- public override bool GetSupportedPlatforms(ref List<UnrealTargetPlatform> OutPlatforms)
- {
- // It is valid for only server platforms
- return UnrealBuildTool.UnrealBuildTool.GetAllServerPlatforms(ref OutPlatforms, false);
- }
- public override void SetupBinaries(
- TargetInfo Target,
- ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,
- ref List<string> OutExtraModuleNames
- )
- {
- OutExtraModuleNames.Add("ShooterGame");
- }
- public override List<UnrealTargetPlatform> GUBP_GetPlatforms_MonolithicOnly(UnrealTargetPlatform HostPlatform)
- {
- List<UnrealTargetPlatform> Platforms = null;
- switch (HostPlatform)
- {
- case UnrealTargetPlatform.Linux:
- Platforms = new List<UnrealTargetPlatform> { HostPlatform };
- break;
- case UnrealTargetPlatform.Win64:
- Platforms = new List<UnrealTargetPlatform> { HostPlatform, UnrealTargetPlatform.Linux };
- break;
- default:
- Platforms = new List<UnrealTargetPlatform>();
- break;
- }
- return Platforms;
- }
- public override List<UnrealTargetConfiguration> GUBP_GetConfigs_MonolithicOnly(UnrealTargetPlatform HostPlatform, UnrealTargetPlatform Platform)
- {
- return new List<UnrealTargetConfiguration> { UnrealTargetConfiguration.Test };
- }
- public override List<GUBPFormalBuild> GUBP_GetConfigsForFormalBuilds_MonolithicOnly(UnrealTargetPlatform HostPlatform)
- {
- return new List<GUBPFormalBuild>();
- }
- }
在此基礎上需要修改的地方三個地方:
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