來玩一局CS嗎?UE4射擊游戲的獨立服務器構建


前言

  根據UE4官方文檔的介紹,UE4引擎在架構時就已經考慮到了多人游戲的情景,多人游戲基於客戶端-服務器模式(CS模式)。也就是說,會有一個服務器擔當游戲狀態的主控者,而連接的客戶端將保持近似的副本。服務器是UE4多人游戲的一個重要部分,其作用是:做出所有重要決定,包含所有的主控狀態、處理客戶端連接、轉移到新的地圖以及處理比賽開始/結束時的總體游戲流程。

  服務器的功能開發在UE4中也非常簡單,UE4本身是支持客戶端/服務器邏輯混合開發的,在藍圖中創建好自定義事件(Custom Event)之后,只需要選擇該事件在服務器上運行(Run on Server)即可。而在C++中,也只需要用宏UFunction(Server)來修飾某個函數,然后就可以在客戶端調用服務器RPC。本文在此不再具體贅述服務器游戲功能的實現,而是着重介紹如何構建出獨立的UE4服務器應用。

服務器構建

  在UE4編輯器中,我們只需要在播放(Play)選項中勾選運行獨立服務器(Run Dedicated Server)即可在編輯器中運行獨立服務器,並且客戶端會自動連接到該服務器。那么如何構建出能獨立運行的服務器呢?官網給出了一篇指南,於是我根據這篇指南和我自己的理解開始了UE4服務器的構建。

編譯虛幻引擎源碼

  在這第一步我就產生了疑問,我們最初從官網下載UE4啟動器后,安裝UE4引擎時,不就已經下載了虛幻引擎源碼了嗎,還有必要重新下載嗎?

  於是我就嘗試跳過這一步,直接從添加構建服務器目標開始操作,當選擇構建目標為"Development Server"后,得到了如下的報錯:

UnrealBuildTool : error : Couldn't find target rules file for target 'UE4Server' in rules assembly 'UE4Rules, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Location: C:\Program Files\Epic Games\UE_4.22\Engine\Intermediate\Build\BuildRules\UE4Rules.dll
Target rules found:

  該問題我在Reddit(國外知名論壇)上找到了詳細的闡述,原因就是因為沒有按照指南的步驟下載與編譯UE4源碼。至於為何啟動器中下載的UE4引擎源碼會出現找不到構建目標“UE4Server”的問題,我推測是因為其源碼(構建)不完整,精簡了編輯器以外的其他內容(例如獨立服務器模塊等等),所以,還是老老實實下載源碼吧。

下載UE4源碼

  UE4源碼存放在Github倉庫,並且是私有倉庫(private reposity)。如果你想獲得訪問權限,需要加入Epic Games開發組。在Epic官網登陸帳號后,關聯Github帳號,就會收到Epic Games開發組的邀請,接受后即可加入,官網做了詳細的操作教程。

  我下載的版本是4.22.3,大小是333M,如果你訪問Github速度過慢,可以從我的百度網盤中下載(提取碼:fv4e)。

安裝源碼

  解壓上一步下載的源碼壓縮包后,雙擊Setup.bat文件即可。

  可以看到,該一步是在檢查和更新UE4引擎的依賴組件,需要更新9122M的文件(約9G),國內訪問速度特別慢,我家100M電信寬帶,下載速度只有0.1M/S(100KB/S),連上香港的VPN也是差不多的速度(因為VPN限速1M),按照這個下載速度,下載完大約需要25個小時

  25個小時有點太長了,查看了一下Setup.bat這個文件,它調用了“.\Engine\Binaries\DotNET\GitDependencies.exe”來執行下載,查看該進程連接的遠程地址為“13.225.102.98:80”,這個ip地址在美國,所以訪問緩慢。我找了一下源碼目錄,希望可以找到配置類似下載鏡像的地方,但最終並沒有找到。(絕望~)

  難道真的要為此默默等待25小時嗎?好在生活中處處有驚喜,第二天我試了一下在公司網絡進行下載,速度意外地飈到了1.5M/S,只需要等待大約1個半小時,非常開心。下載完畢后,該窗口會自動消失,繼續進行下一步即可。如果你也有下載依賴緩慢的問題,可以從我的百度網盤中下載(提取碼:qa8a)。

生成Visual Studio項目文件

  同樣在解壓后的路徑,雙擊GenerateProjectFiles.bat,會得到如下的報錯:

  根據提示來看,是因為需要安裝.net框架的SDK。打開微軟.NET官網,下載.NET Framework Dev Pack(注意不是Runtime)。

  (Warning!)此處有巨坑。根據上面的提示,是需要安裝4.6.2版本的.NET Framework Dev Pack,如果你跟我一樣直接下載了目前最新的版本(4.8),同樣會有該錯誤提示,因為這個版本要求已經寫在了如下的文件中:

Engine\Source\Programs\UnrealBuildTool\UnrealBuildTool.csproj
Engine\Source\Programs\DotNETCommon\DotNETUtilities\DotNETUtilities.csproj

  “機智”的我立刻找到了文件中的TargetFrameworkVersion字段,將默認的v4.6.2修改成了我安裝的版本v4.8,再次運行GenerateProjectFiles.bat后,果然,沒有報錯,並且成功生成了UE4.sln。其實,如上的步驟並不是指跳過了這個巨坑,因為,這只是噩夢的開始...

  繼續進行下面的編譯源碼步驟后(耗時約8小時),會得到如下的報錯:

error MSB3075: The command "..\..\Build\BatchFiles\Build.bat exited with code 5. 
Please verify that you have sufficient rights to run this command.

  根據報錯提示,是"....\Build\BatchFiles\Build.bat"異常退出,因為沒有權限。我推測可能是由於文件占用導致的,先是重啟了VS再編譯,沒有效果。然后又重啟了電腦,仍然沒有效果。然后又嘗試了“使用管理員權限”重新編譯,還是沒有變化。百度和Google上的解決方法也是五花八門,各種情況都有,無法解決。

  最后正在我絕望的時候,突然想到了.NET版本的問題,卸載.NET Dev Pack 4.8然后重新安裝.NET Dev Pack 4.6.2之后。終於,報錯消失了,所以,這里只能使用.NET Dev Pack 4.6.2。

  這個大坑主要是因為.NET Dev Pack版本安裝錯誤后,沒有明確的提示,不太容易聯想到是.NET Dev Pack版本的問題,而且,編譯一次UE4源碼真的太太太太太耗時間了。

編譯UE4源碼

  雙擊UE4.sln在Visual Studio中打開UE4源碼,在左側解決方案瀏覽器(Solution Explorer)中,在“UE4”項目點擊右鍵,然后點擊Build。考驗電腦性能的時候到了,我在公司的i3處理器的電腦上編譯了大概8個小時,並且在編譯期間,CPU占用率一直100%,幾乎干不了其他事,所以建議在下班的時候進行,第二天早上一上班就可以看到,編譯已經完成。

為項目添加構建服務器目標

  由於官網的指南是針對引擎版本為“4.14, 4.15, 4.16, 4.17, 4.18”編寫的,而我使用的UE4引擎版本為4.22.3,因此使用的是指南中針對4.18版本的內容,經過測試,是可以使用的。

  進入項目的"~/Source"路徑,新建一個文件命名為“項目名Server.Target.cs”,將項目名替換為實際項目名,例如我的項目名為“Shooting_Game”,則文件名命名為“Shooting_GameServer.Target.cs”。(如果你的項目沒有Source路徑,則說明是純藍圖的UE4項目,則在編輯器中添加任意一個C++類即可。)

  編輯新建的文件,加入如下內容,注意替換項目名。

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

[SupportedPlatforms(UnrealPlatformClass.Server)]
public class Shooting_GameServerTarget : TargetRules   // 修改項目名
{
    public Shooting_GameServerTarget(TargetInfo Target) : base(Target)  // 修改項目名
    {
        Type = TargetType.Server;
        ExtraModuleNames.Add("Shooting_Game");    // 修改項目名
    }
}

切換項目的UE4引擎版本

  右鍵項目根目錄的“項目名.uproject”文件,選擇"Switch Unreal Engine version..."

  選擇剛剛安裝的UE4引擎版本,點擊OK即可,切換引擎后,會自動生成項目文件(Project files)。

構建服務器

  在Visual Studio的解決方案配置(Solution Configuration)中選擇"Development Server",然后在解決方案瀏覽器(Solution Explorer)中,在"Shooting_Game"(我的項目名稱)點擊右鍵,點擊Build。這里只有481個構建步驟,比編譯UE4源碼要少 一些,大約需要2小時。

  構建完成之后,可以看到輸出日志:

[480/481] Shooting_GameServer.exe
Creating library F:\workspace\ue4\Shooting_Game2\Binaries\Win64\Shooting_GameServer.lib and object F:\workspace\ue4\Shooting_Game2\Binaries\Win64\Shooting_GameServer.exp
[481/481] Shooting_GameServer.target

  已經生成了Shooting_GameServer.exe,路徑在“~\Binaries\Win64\”,如果我們嘗試直接運行(需要添加運行參數-log,否則進程會在后台運行,什么效果也看不到),會看到如下報錯:

LogLinker: Warning: Unable to load package(...). Package contains EditorOnly data which is not supported by the current build.

  意思是包含了僅支持編輯器內容的數據,“~\Binaries\Win64\”是編輯器構建文件夾,所以我們還需要進行客戶端打包,然后再將服務器程序拷貝過去。

客戶端打包

  客戶端打包需要在編輯器中進行,所以需要在解決方案配置(Solution Configuration)中選擇"Development Editor",啟動項目(Startup Projects)中選擇“Shooting_Game”,然后點擊運行按鈕。第一次運行編輯器會編譯Shader,所以耗時較久(我大約需要20分鍾),並且會長時間卡在45%,等待即可。

創建入口關卡

  在左下方內容瀏覽器(Content Browser)中選擇Content目錄,選擇存放關卡的文件夾(我的是Levels),右邊窗口右鍵創建關卡(Level),命名為EntryMap。

在入口關卡中連接服務器

  雙擊選擇EntryMap,然后在上方工具欄選擇藍圖(BluePrints),打開關卡藍圖(Open Level BluePrint)。引出BeginPlay引腳,選擇OpenLevel,在LevelName中填寫服務器IP地址,保存編譯。

創建過渡關卡

  用同樣的方式創建關卡,命名為TransitionMap,無需給該關卡添加內容,保持空白即可。

指定游戲地圖

  菜單欄選擇編輯(Edit)- 項目設置(Project Settings)- 項目(Project)- 地圖和模式(Maps & Modes)- 默認地圖(Default Maps),依次將編輯器初始地圖(Editor Startup Map)設置為GameMap,游戲默認地圖(Game Default Map)設置為EntryMap,過渡地圖(Transition Map)設置為TransitionMap,服務器默認地圖(Server Default Map)設置為GameMap。

打包地圖設置

  菜單欄選擇編輯(Edit)- 項目設置(Project Settings)- 項目(Project)- 打包(Packaging)- 打包地圖列表(LIst of maps to include in a packaged build),分別添加EntryMap,TransitionMap,GameMap。

開始打包

  菜單欄選擇文件(File)- 打包項目(Package Project)- 窗口(Windows)- 64位窗口(Windows(64 bit)),然后選擇打包目錄,即可開始打包。

UATHelper: Packaging (Windows (64-bit)): BUILD SUCCESSFUL
UATHelper: Packaging (Windows (64-bit)): AutomationTool exiting with ExitCode=0 (Success)

  根據提示,可以看到,打包成功。

運行服務器

  之前已經提到,構建出的服務器目標文件需要在客戶端資源目錄中運行,因此需要拷貝過去。

拷貝服務器目標文件

  將之前構建出的“~\Binaries\Win64\Shooting_GameServer.exe”拷貝到客戶端的打包目錄"WindowsNoEditor\Shooting_Game\Binaries\Win64"。

在命令行中運行服務器

  由於服務器沒有圖形界面(GUI),因此需要在命令行中運行,否則什么輸出都看不到。給拷貝過來的Shooting_GameServer.exe創建快捷方式,並在“目標”后加入“ -log”。

  雙擊運行該快捷方式,可以看到一下日志:

LogInit: WinSock: I am PC-20190329KLKV (192.168.52.160:0)
LogNet: GameNetDriver IpNetDriver_0 IpNetDriver listening on port 7777
LogWorld: Bringing World /Game/Levels/GameMap.GameMap up for play (max tick rate 30) at 2019.10.09-11.20.56
LogWorld: Bringing up level for play took: 0.002008
LogLoad: Took 0.129134 seconds to LoadMap(/Game/Levels/GameMap)
LogLoad: (Engine Initialization) Total time: 1.03 seconds

  可以看到,服務器運行在192.168.52.160,監聽端口為7777。打開cmd命令行,輸入netstat -an|FIND "7777"

UDP    0.0.0.0:7777           *:*

  由此可見,UE4服務器與客戶端連接使用的是UDP協議,默認端口為7777。

  至此,UE4項目的服務器構建完成,可以使用打出的客戶端包來進行連接測試。

效果演示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM