FCommandLine 过滤模式

FCommandLine是 UE 封装的启动参数的管理类,在 Launch 模块下的 FEngineLoop::PreInit 中被初始化 (FCommandLine::Set) 为程序启动的 CmdLine
FCommandLine 支持 AppendParser这是比较常用的功能,但是今天要说的是另外一个:CommandLine 的白名单和黑名单模式。
考虑这样的需求:在游戏开发阶段,有很多参数可以在启动时配置,方便测试,但是在发行时需要把启动时从命令行读取配置的功能给去掉,强制使用我们设置的默认参数。

OVERRIDE_COMMANDLINE_WHITELIST

怎么才是最简单的办法?其实这一点根本不需要自己去处理这部分的内容,因为 FCommandLine 支持白名单模式。
开启的方法为在 target.cs 中增加 WANTS_COMMANDLINE_WHITELIST 宏:

1
GlobalDefinitions.Add("WANTS_COMMANDLINE_WHITELIST=1");

如果只开启这个,则默认情况下不允许接收任何外部传入的参数,但具有默认的参数 -fullscreen /windowed
当然,我们可以自己指定这个 WHITLIST,那么就是在target.cs 中使用 OVERRIDE_COMMANDLINE_WHITELIST 宏:

1
GlobalDefinitions.Add("OVERRIDE_COMMANDLINE_WHITELIST=\"-arg1 -arg2 -arg3 -arg4\"");

这样就只有我们指定的这些参数才可以在运行时接收,防止玩家恶意传递参数导致游戏出错。
这部分的代码是写在 Misc/CommandLine.cpp 中的。

Example:

1
2
3
// target.cs
GlobalDefinitions.Add("WANTS_COMMANDLINE_WHITELIST=1");
GlobalDefinitions.Add("OVERRIDE_COMMANDLINE_WHITELIST=\"-e -c\"");

这里只指定了 -e/-c 两个参数,如果程序在启动时被指定了其他的参数,如:

1
D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -e -c -d

FCommandLine::Get() 只能得到 -e-c-d和 exe 路径都被丢弃了,只能用在指定开关,不能用来传递值。

FILTER_COMMANDLINE_LOGGING

还可以在 target.cs 中指定 FILTER_COMMANDLINE_LOGGING 来控制对 FCommandLine::LoggingCmdLine 的过滤:

1
GlobalDefinitions.Add("FILTER_COMMANDLINE_LOGGING=\"-arg1 -arg2 -arg3 -arg4\"");

它会在程序从命令行中接收的参数中过滤所指定的参数,类似于参数的黑名单。

Example:

1
2
GlobalDefinitions.Add("WANTS_COMMANDLINE_WHITELIST=1");
GlobalDefinitions.Add("FILTER_COMMANDLINE_LOGGING=\"-e -c\"");

在运行时传入参数:

1
D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -e -c -d

得到的是:

1
-D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -d

-e-c 被过滤掉了。