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参数的信息就提取出来了,接下来我们要在游戏开始前合适的位置将这些参数应用到游戏中。
UE4命令行参数解析的更多相关文章
- python命令行参数解析模块argparse和docopt
http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...
- gflags命令行参数解析
gflags库是google开源的命令行参数解析工具. 安装 官方没有提供二进制库,但是Debian/Ubuntu平台本身提供了二进制库,可以直接git clone https://github.co ...
- [Go] 命令行参数解析包(flag 包)使用详解
Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag // 只支持bool类型 cmd -flag=xxx cmd -flag ...
- $命令行参数解析模块argparse的用法
argparse是python内置的命令行参数解析模块,可以用来为程序配置功能丰富的命令行参数,方便使用,本文总结一下其基本用法. 测试脚本 把以下脚本存在argtest.py文件中: # codin ...
- Google开源命令行参数解析库gflags
Google开源命令行参数解析库gflags http://blog.csdn.net/lming_08/article/details/25072899 CMDLINE的解析 http://blog ...
- PHP 命令行参数解析工具类
<?php/** * 命令行参数解析工具类 * @author guolinchao * @email luoyecb@163.com */class CommandLine{ // store ...
- golang-flag - 命令行参数解析
flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...
- Python命令行参数解析模块getopt使用实例
Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...
- python命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
随机推荐
- 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对
原文:2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对 title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 ...
- EF 通过导航添加数据
Fluent Api是指定模型与数据库表之间的对应关系 //一对多 this.HasOptional(x => x.主表).WithMany(x => x.多表).HasForeignKe ...
- weblogic漏洞
1 weblogic控制台地址暴露 ² 整改方法: 禁用weblogic控制台.在weblogic域(sguap-domain和base-domain)的config下的config.xml中 &l ...
- proxychains4配置使用
一丶安装 sudo apt-get install proxychains4 二丶修改配置文件 sudo vim /etc/proxychains.conf 在文本最后加上你的代理服务器地址,如果有用 ...
- MySQL truncate含有外键约束的条目报错
1.报错信息: Cannot truncate a table referenced in a foreign key constraint 2.出现错误操作: truncate table a1; ...
- linux的性能调优
单机调优: 分析性能瓶颈的原因,解决它. cpu子系统 内存子系统 IO子系统 网络系统 @cpu子系统调优 cpu技术指标 xeon E5520 2.27GHz 8192kb # c ...
- 数据库系统概论(新技术篇)--中国人民大学【第13讲】KEY-VALUE数据库(键值对数据库)
市面上主流的分布式文件系统(FS): (Hadoop的)HDFS,(Google的)GFS 详见ppt 1.数据服务与键值对数据库: 数据服务:data serving数据服务:数据的简单 ...
- python基本数据类型的时间复杂度
1.list 内部实现是数组 2.dict 内部实现是hash函数+哈希桶.一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突. 3.set 内部实 ...
- mysql binlog空间维护
默认情况下,mysql主从同步的binlog日志,会一直保存. 对于如果已同步好的数据,这显然比较浪费资源. 且如果生产环境磁盘太小,随时还会爆掉,所以很有必要作好binlog的空间维护. 以下操作, ...
- 前端(5)之jQuery
前端(5)之jQuery jQuery介绍 1.jQuery是一个轻量级的,兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现 ...