转自: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. WPF 精修篇 WPF嵌入Winfrom控件

    原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用  WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...

  2. [转]ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...

  3. 简单的sql语句汇总(sqlserver)

    1.修改字段的默认值 alter table 表名 add default 默认值 for 字段名称 例子: for Age; alter table 表名 add constraint DF_TAB ...

  4. asp.net 路由注册

    webapi的路由注册 mvc的路由注册 urlRoutingModule路由

  5. python 排序冒泡排序与双向冒泡排序

    冒泡排序: 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 def bubble_sort(collection): #升序排列 length=len(collecti ...

  6. 前端常见的HTML+CSS面试题(附答案)

    HTML 1. <image>标签上title属性与alt属性的区别是什么? alt属性是为了给那些不能看到你文档中图像的浏览者提供文字说明的.且长度必须少于100个英文字符或者用户必须保 ...

  7. sqlplus连接远程Oralce数据库

    1. 下载 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 2. 三个包 in ...

  8. Easypoi实现单模板生成多页wrod文档

        EasyPoi可以很方便的通过一个word模板,然后通过填充模板的方式生成我们想要的word文档.但是碰到了一个单模板生成多页数据的场景,比如一个订单详情信息模板,但是有很多订单,需要导入到一 ...

  9. office viso 2007根据现有数据库建立数据库模型图

    当数据库表很多的时候,表之间的关系就变得很复杂.光凭记忆很难记住,尤其是数据库键值没有外键约束时. 所以有个数据库模型图各个表之间的关系就显而易见了. 打开 office viso 2007 文件&g ...

  10. sqlserver清空删除日志

    USE [lzdxdb] GO ALTER DATABASE lzdxdb SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE lzdxdb SET ...