UE4命令行參數解析


轉自:https://blog.csdn.net/u012999985/article/details/53544389

一 .命令行參數簡述
命令行參數是一連串的關鍵字字符串,當運行可執行文件時可以通過命令行或者可執行文件的快捷方式將其傳入。它們的目的是自定義引擎運行的方式,以便符合開發人員或用戶的需要。一般用途如下,注:命令行不區分大小寫

第一,這可以使得運行編輯器而不運行游戲變得很簡單(只要加上幾個字符即可,見圖1-1)。第二,可以更方便的配置客戶端IP,服務器以及其他更豐富的運行信息。第三,它也可以更加復雜。玩家可以自定義命令行參數,並在代碼中解析與使用,比如使用某個特定的地圖在指定的分辨率和幀頻率下啟動游戲。圖1-1是4個bat批處理文件,用來打開不同的游戲端(編輯器,本地游戲,游戲客戶端以及專有服務器),游戲工程名后面的都是命令行參數。我們也可以直接在程序的快捷方式里面添加,如圖1-2。

  圖 1-1 通過Bat文件打開不同游戲端的命令行參數

  圖 1-2在快捷方式里傳入命令行參數

總體上來說,命令行參數其實分為兩類,一類是UE4引擎提供的參數,比如配置地圖名稱,IP地址,是否開啟服務器等。(想了解更多參數可以參考官方文檔)另一類就是玩家自定義的參數,用來給開發者提供另一種配置游戲的方式。玩家其實可以隨意添加參數,但是如果沒有在代碼中解析,這些無意義的參數不會有任何影響。

1.1理解URL、URL參數及命令行參數的區別
在UE4中,我們需要理解URL,URL參數與命令行參數的關系。URL參數屬於命令行參數的一部分,同時命令行參數會被解析多個部分, URL參數的那部分會作為部分信息存入到URL內部結構里。也就是說,URL內部信息不僅僅來源於命令行,URL與命令行參數有交集,交集就是URL參數。

URL參數除了負責傳入地圖信息,IP地址外,還可以通過“?PlayerNum=6”這樣的形式傳入其他信息,這也就是我們通過命令行參數獲取配置信息的重要途徑。(圖1-3畫橫線的字符就是URL參數)

        圖 1-3  Url參數示意圖

 

二. 參數的提取

 

在UE4的代碼中,命令行參數對應的類是FCommandLine。URL對應的類是FURL。如下圖2-1,圖2-2,圖2-3所示。

圖 2-1 URL信息對應類

  圖 2-2  引擎4.8前命令行信息對應類

圖 2-3  引擎4.9以后命令行信息對應類

有了上面的類,我們知道了兩個類的內部數據的結構布局。對於FCommandLine來說,信息的存儲很簡單,所有命令行信息直接放在CmdLine里面(受版本影響,見下文)。而FUrl除了存儲地圖,Options(自定義參數)外,還有端口號port,協議名稱protocol等。這里給出一個例子,下面的字符串是一個通過命令行參數啟動的專有服務器的bat文件內容。

Start Engine\Binaries\Win64\UE4Editor.exe"Game/Game.uproject"MapName?MaxSizeAllowed=1?StartTime=6300.0 -game -server -log

我們通過執行代碼const TCHAR* commandTest = FCommandLine::Get();可以獲取圖2-4的字符串。發現結果是,"Game/Game.uproject"MapName? -NoSuperCrates  -game -server -log

注意:4.9版本的FCommandLine函數添加了OriginalCmdLine屬性與對應的Get方法(圖2-3)。也就是說在4.5版本的情況下的Get與4.9以后版本的GetOriginal得到的結果是相同的。4.9以后的版本的Get(),獲取的是不帶工程名稱與路徑的命令行參數。

可以看出,CommandTest獲取的就是啟動命令后所有的字符串信息。那么我們的URL信息怎么提取呢?我們可以在UGameInstance::StartGameInstance()函數里面通過上面的方法獲取整個命令行參數。然后構造新的FURL對象,讀取本地的配置信息完成初始化,像端口號,Protocol等信息我們可以在\Engine\Config 的BaseEngine.ini獲取,如圖2-4。

圖 2-4  BaseEngine中URL相關配置

隨后,通過LoadURLConfig(TEXT("DefaultPlayer"),GGameIni);可以讀取其他相關的配置信息,通過FParse::Token等一系列步驟可以將命令行參數里面的URL參數部分取出來。這時候的URL如圖2-5所示。

圖2-5 URL內部信息

上面的Op數組,其實就是我們在參數里面傳入的MaxSizeAllowed等3個參數。到這里,我們URL參數的信息就提取出來了,接下來我們要在游戲開始前合適的位置將這些參數應用到游戲中。

 


免責聲明!

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



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