转自: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参数的信息就提取出来了,接下来我们要在游戏开始前合适的位置将这些参数应用到游戏中。

UE4命令行参数解析的更多相关文章

  1. python命令行参数解析模块argparse和docopt

    http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...

  2. gflags命令行参数解析

    gflags库是google开源的命令行参数解析工具. 安装 官方没有提供二进制库,但是Debian/Ubuntu平台本身提供了二进制库,可以直接git clone https://github.co ...

  3. [Go] 命令行参数解析包(flag 包)使用详解

    Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag       // 只支持bool类型 cmd -flag=xxx cmd -flag ...

  4. $命令行参数解析模块argparse的用法

    argparse是python内置的命令行参数解析模块,可以用来为程序配置功能丰富的命令行参数,方便使用,本文总结一下其基本用法. 测试脚本 把以下脚本存在argtest.py文件中: # codin ...

  5. Google开源命令行参数解析库gflags

    Google开源命令行参数解析库gflags http://blog.csdn.net/lming_08/article/details/25072899 CMDLINE的解析 http://blog ...

  6. PHP 命令行参数解析工具类

    <?php/** * 命令行参数解析工具类 * @author guolinchao * @email luoyecb@163.com */class CommandLine{ // store ...

  7. golang-flag - 命令行参数解析

    flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...

  8. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

  9. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

随机推荐

  1. PyTorch中MaxPool的ceil_mode属性

    PyTorch中的MaxPool(最大池化)有一个属性:ceil_mode,默认为False(地板模式),为True时是天花板模式.  

  2. sitemap 文件的生成 sitemap文件和sitemapindex 索引文件的生成

    <?php /*****连接数据库 start*******/ $dbhost = "localhost"; $username = "root"; $u ...

  3. Runtime.addShutdownHook()(译)

    序言: 每一个Java程序都可以为JVM增加一个关闭钩子.JVM将在关闭之前执行关闭钩子中的指令. 问题: 一个程序可能需要在退出前执行一些指令.程序可能由于下列原因而退出: 所有的线程已经执行完毕 ...

  4. 设置环境变量遇到的难题,cmd管理员方式与普通方式的区别,通过C#代码设置环境变量

    在使用mingw64的过程中,需要手工添加环境变量,作为一个懒人,这怎么可以呢?于是想用命令的方式实现,结果遇到问题了,死活实现不了, 之前用过TDM-GCC,人家的安装完就可以用,还有试用过rust ...

  5. git tag 常用笔记

    git tag 常用笔记 查看 tag 列出现有 tag git tag 列出 v1.4.2 相关的 tag git tag -l "v1.4.2" 查看指定 tag 的信息 gi ...

  6. Delphi - 鼠标上下滚动基础消息事件

    Delphi实现对鼠标上下滚动基础消息的截获并处理 前几天有客户提出需求:由于个人PC界面限制,有时候电子图档显示不全,希望通过鼠标上下滚动用来控制电子图档的放大和缩小. 下面通过一个测试Demo来说 ...

  7. ArrayList与LinkedList

    ArrayList与Linkedlist的增删改查问题以及集合选择问题 线程:安全:Vector 不安全:ArrayList,LinkedList 增删多:LinkedList 查询多:ArrayLi ...

  8. 【转载】 C#中ArrayList使用ToArray方法转换为数组

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,可以使用ArrayList中的ToArray方法将ArrayList集合对象转换为数组,ToArray方法有2个重载形式,其一为vi ...

  9. Qt选择文件路径

    QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./"); ...

  10. csv数据的读取和写入,以及好看的可视化

    参考: https://www.jianshu.com/p/5511cb3bdbb1 https://www.baidu.com/link?url=fbslMHoMviGOyn5Ub36VGdVQBD ...